使用来自Java的编号文件描述符
我需要从Java访问编号的文件描述符 - 除了0,1或2。
如何才能做到这一点?我查看了
FileDescriptor
类,但没有找到任何方法用给定的文件描述符编号初始化它。
作为一个具体的例子,假设Java从另一个编程语言被调用为子进程。文件描述符3和4由另一种语言提供,用于输入和输出。
我需要的Java是连接到这些文件描述符的InputStream
和OutputStream
对象,就像System.in,System.out和System.error连接到文件解析器0,1和2一样。
我正在使用Java 1.6,这应该在类似Unix的系统上运行。
经过测试的工作方案:
文件描述符特殊文件系统条目的答案确实指向了以下可行的解决方案:
找出你的Unix系统是否以及在哪里有一个包含所有文件描述符的命名条目的特殊文件系统。
我正在使用FreeBSD,其中fdescfs(5)是一个文件系统。在Linux下它将是procfs。
确保已安装此文件系统
FreeBSD:把fdescfs /dev/fd fdescfs rw 0 0
放在/etc/fstab
或者在shell提示符下运行mount -t fdescfs null /dev/fd
(可能带有sudo)
使用新的FileInputStream("/dev/fd/3")
和new FileOutputStream("/dev/fd/4")
获取连接到文件描述符的流(路径适用于FreeBSD,替换为您的操作系统路径)
没有找到相关结果
已邀请:
4 个回复
锑寝粒
揽芳僵迷仇
信藉乒
为了测试这个,我制作了一个简单的Bash脚本来编译它,设置fd3,然后运行java程序:
果然,fd3被重定向到stdout,并在终端输出“hi there n”。注释掉“exec 3>& 1”行,Java程序按预期失败,并显示“未配置设备”IOException。 对于私有FileDescriptor构造函数的反射似乎在无法访问/ dev / fd的情况下工作正常,并且比尝试使用JNI创建FileDescriptor更不笨,这是我在其他地方看到的一个建议。 注意:我在BSD系统上测试了这个。它可能适用于其他系统,也可能不适用。
栖很钾是狠
,方法是获取构造函数并在其上调用
。但这是一个黑客,我不能保证它会工作(它可能不会)。特别是考虑到我开始的报价。