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()
本机方法的实现
安全文件描述符.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
安全文件描述符.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");