我需要基于我使用的API来实现一个带有InputStream
参数(FileInputStream
的实例)的方法,该方法将调用带有File
参数的方法。
implementedMethod(InputStream is){
FileInputStream fis = (FileInputStream)is; //always works
File f = (???) ????(???).???;
calledMethod(f);
}
那么当我拥有File
时,如何提供FileInputStream
?我不明白FileChannel
或FileDescriptor
(两者都在FIS
中)是什么以及它们是如何工作的。
我猜这不可能,我必须在文件系统上实际写一个(临时)文件。如果没有,如果我可以使用FileChannel或FileDescriptor在内存中创建我的文件,或者甚至用RandomAccessFile
(?)创建我的文件,我想知道如何......
构建可读的File
对象是否需要它存在于磁盘上的某个位置?我觉得这很奇怪......
答案 0 :(得分:2)
据我所知,无法从FileInputStream
获取文件名。
据我们所知,流可以从一个文件描述符构造,例如代表一个套接字。
我的建议是重新考虑你的设计。
答案 1 :(得分:0)
您当然可以绕过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;
}