JavaでFileDescriptorからパスを取得するためのソリューション:
使い方:
ファイル記述子には、現在のプロセスで開いているファイルを見つけるための記述子IDが含まれていることがわかっています。
簡単な言葉で説明されているファイル記述子とは何ですか?
記述子IDがわかっている場合は、Javaコードに従ってファイルパスを簡単に見つけることができます。
Path path = Paths.get("/proc/self/fd/"+fd_id);
System.out.println(Files.readSymbolicLink(path)); //return file path in file descriptor
ここ:
fd_idファイル記述子ID(0,1,2 .....)
/ procそのディレクトリには、システムで実行されているすべてのプロセスが含まれています
/selfは現在JavaクラスのプロセスIDを実行しています
/fdファイル記述子ディレクトリ
//fd_idファイル記述子ID
SafeFileDescriptor.java
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.nio.file.Path;
public class SafeFileDescriptor {
static {
System.load("Documents/java native interface exmples/libSafeFileDescriptor.so");
}
private native int getFDid(FileDescriptor fd);
public static void main(String[] args) throws IOException{
FileOutputStream fout = new FileOutputStream("Documents/test.txt");
FileDescriptor fd=fout.getFD();
int fd_id = new SafeFileDescriptor().getFDid(fd);
Path path = Paths.get("/proc/self/fd/"+fd_id);
System.out.println(Files.readSymbolicLink(path));
}
}
getFDid()
指定されたファイル記述子オブジェクトの記述子IDを取得するために使用されるネイティブメソッドです
次のコードはgetFDid()
ネイティブメソッドの実装です
SafeFileDescriptor.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SafeFileDescriptor */
#ifndef _Included_SafeFileDescriptor
#define _Included_SafeFileDescriptor
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: SafeFileDescriptor
* Method: getFDid
* Signature: (Ljava/io/FileDescriptor;)I
*/
JNIEXPORT jint JNICALL Java_SafeFileDescriptor_getFDid
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
JavaファイルSafeFileDescriptor.javaからSafeFileDescriptor.hを作成します
javac -h dir SafeFileDescriptor.java
「dir」をディレクトリに置き換えて、SafeFileDescriptor.hを保存します
SafeFileDescriptor.c
#include <jni.h>
#include "SafeFileDescriptor.h"
JNIEXPORT jint JNICALL Java_SafeFileDescriptor_getFDid
(JNIEnv *env, jobject this_object, jobject fdObject) {
jclass fileDescriptor = (*env)->GetObjectClass(env,fdObject);
jfieldID id_fd = (*env)->GetFieldID(env, fileDescriptor, "fd", "I");
return (*env)->GetIntField(env,fdObject,id_fd);
}
SafeFileDescriptor.cをコンパイルします
gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libSafeFileDescriptor.so SafeFileDescriptor.c
libSafeFileDescriptor.soファイルをJavaクラスファイルに追加するには
System.load("Documents/java native interface exmples/libSafeFileDescriptor.so");