Java 如何检索FileInputStream的原始文件
我需要基于我使用的API,使用Java 如何检索FileInputStream的原始文件,java,file,virtual,fileinputstream,Java,File,Virtual,Fileinputstream,我需要基于我使用的API,使用InputStream参数(FileInputStream的实例)实现一个方法,该参数将调用带有文件参数的方法 implementedMethod(InputStream is){ FileInputStream fis = (FileInputStream)is; //always works File f = (???) ????(???).???; calledMethod(f); } 那么,当我只有一个FileInputStream
InputStream
参数(FileInputStream
的实例)实现一个方法,该参数将调用带有文件
参数的方法
implementedMethod(InputStream is){
FileInputStream fis = (FileInputStream)is; //always works
File f = (???) ????(???).???;
calledMethod(f);
}
那么,当我只有一个FileInputStream
时,如何提供该文件呢?我不明白FileChannel
或FileDescriptor
(都在FIS
中)到底是什么,以及它们是如何工作的
我猜这是不可能的,我必须在文件系统上写一个(temp)文件。如果没有,如果我可以用FileChannel或FileDescriptor在内存中创建我的文件,或者甚至用RandomAccessFile
(?)之类的东西,我想知道如何
是否构造可读的文件
对象需要它存在于磁盘上的某个位置?我觉得这很奇怪…据我所知,无法从文件输入流中获取文件名
据我们所知,流可以由表示套接字的文件描述符构造而成
我的建议是重新考虑您的设计。您当然可以绕过API,并假设它不会一直工作(取决于JDK和SecurityManager),使用反射:
/**
* Retrieves the {@link File} associated to given {@link FileInputStream}, if possible.
* @param inputStream the input stream.
* @return the file.
*/
@Nullable
public File retrieveFile(@NotNull final FileInputStream inputStream)
{
@Nullable final File result;
@Nullable String path = null;
try
{
@Nullable final Field field =
inputStream.getClass().getDeclaredField("path");
field.setAccessible(true);
path = (String) field.get(inputStream);
}
catch (@NotNull final Throwable noFieldOrNoRights)
{
}
if (path == null)
{
result = null;
}
else
{
result = new File(path);
}
return result;
}
你为什么要这么做?这就像从子类调用超类,这是一种糟糕的做法。也许您没有正确地模块化问题?如果您希望使用FileInputStream,为什么不将形式参数类型更改为FileInputStream
。如果您需要一个文件
将其更改为File并自己构造流。关于重新设计,我不能,正如我所说,我有两个API要连接,我需要一个转换器来连接。我希望通过某种方式绕过在系统进程中编写文件的过程。看来这是不可避免的。顺便问一下,套接字如何生成FileInputStream?更重要的是,“构建一个可读文件对象是否需要它存在于磁盘上的某个地方?我觉得这很奇怪…”