Как я могу получить дескриптор файла POSIX в Java 11? - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть метод, который использует sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess().get(FileDescriptor) от Java 8 для получения реального дескриптора файла POSIX. В Java 9 (и выше) SharedSecrets был перенесен в jdk.internal.misc.

Как получить дескриптор файла POSIX в Java 11?

private int getFileDescriptor() throws IOException {
      final int fd = SharedSecrets.getJavaIOFileDescriptorAccess().get(getFD());
      if(fd < 1)
                throw new IOException("failed to get POSIX file descriptor!");

      return fd;
}

Заранее спасибо!

1 Ответ

1 голос
/ 04 апреля 2019

Это только для использования в экстренных случаях (или до тех пор, пока вы не найдете другой способ, так как это не поддерживается), потому что оно делает вещи непреднамеренно API и не поддерживается. Будьте бдительны.

package sandbox;

import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;

public class GetFileHandle {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("somedata.txt")) {
            FileDescriptor fd = fis.getFD();

            Field field = fd.getClass().getDeclaredField("fd");
            field.setAccessible(true);
            Object fdId = field.get(fd);
            field.setAccessible(false);

            field = fd.getClass().getDeclaredField("handle");
            field.setAccessible(true);
            Object handle = field.get(fd);
            field.setAccessible(false);

            // One of these will be -1 (depends on OS)
            // Windows uses handle, non-windows uses fd
            System.out.println("fid.handle="+handle+"  fid.fd"+fdId);
        } catch (IOException | NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
...