Using a numbered file descriptor from Java

Peer Stritzinger picture Peer Stritzinger · Jan 30, 2011 · Viewed 10.6k times · Source

I need to access numbered file descriptors from Java -- other than 0, 1 or 2.

How can this be done? I looked at the FileDescriptor class but did'nt find any way to initialize it with a given file descriptor number.

As a concrete example lets suppose Java gets called as a child process from another programing language. File descriptors 3 and 4 are provided by the other language for input and output.

What I need in Java are InputStream and OutputStream objects connected to these file-descriptors, just like System.in, System.out and System.error are connected to file-desctiptors 0, 1 and 2.

I'm using Java 1.6 and this should run on Unix alike systems.

Tested working solution:

The answer with the file descriptor special filesystem entries did point me to the following workable solution:

  1. find out if and where your Unix alike system has a special filesystem that contains named entries for all file descriptors.

    • I'm using FreeBSD where fdescfs(5) is a filesystem that does just this. Under Linux it would be procfs.
  2. make sure this filesystem is mounted

    • FreeBSD: put fdescfs /dev/fd fdescfs rw 0 0 in /etc/fstab

      or run mount -t fdescfs null /dev/fd on a shell prompt (probably with sudo)

  3. Use new FileInputStream("/dev/fd/3") and new FileOutputStream("/dev/fd/4") to get the streams connected to the filedescriptors (the paths are for FreeBSD, replace with your operating systems paths)

Answer

Adrian Pronk picture Adrian Pronk · Jan 30, 2011

I'm pretty sure this can't be done using pure Java -- you'll probably have to use native code to bind a file descriptor to a FileDescriptor object or a FileInputStream or FileOutputStream object.

EDIT
If you're using Linux, *BSD or macOS, you can use the pseudo files /dev/fd/nnn to access file-descriptor nnn.