如何在内存中创建新的java.io.File?

85 java file java-io

如何File在内存中创建新的(来自java.io) - 而不是在硬盘上?

我正在使用Java语言.我不想将文件保存在硬盘上.

我遇到了糟糕的API(java.util.jar.JarFile).它期待String文件名的File文件.我没有文件(只有byte []内容)并且可以创建临时文件,但它不是很漂亮的解决方案.我需要验证签名jar的摘要.

byte[] content = getContent();
File tempFile = File.createTempFile("tmp", ".tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(archiveContent);
JarFile jarFile = new JarFile(tempFile);
Manifest manifest = jarFile.getManifest();
Run Code Online (Sandbox Code Playgroud)

任何有关如何在没有临时文件的情况下获得清单的示例将不胜感激.

我想现在这个问题不是偏离主题的

And*_*ter 74

如何在内存中创建新文件(来自java.io),而不是在硬盘中?

也许你很困惑,File并且Stream:

  • A File是文件和目录路径名的抽象表示.使用File对象,您可以访问文件系统中的文件元数据,并对此文件系统上的文件执行某些操作,如删除或创建文件.但是File该类没有提供读写文件内容的方法.
  • 要从文件读取和写入,您正在使用一个Stream对象,如FileInputStreamFileOutputStream.这些流可以从File对象创建,然后用于读取和写入文件.

您可以基于驻留在内存中的字节缓冲区创建,方法是使用a ByteArrayInputStream和a ByteArrayOutputStream以与读取和写入文件类似的方式读取和写入字节缓冲区.该byte数组包含"文件"内容.那你不需要一个File对象.

它们File...ByteArray...流都分别从java.io.OutputStream和继承java.io.InputStream,因此您可以使用公共超类来隐藏您是从文件还是从字节数组中读取.

  • 我不确定这是否是原始海报所需要的,但是当"内存中的文件"有用时,一个例子就是当你想重用一个需要java.io.File作为输入参数的现有库时,你却实际上想要使用存储在内存中的"文件".在这种情况下,我认为一种解决方案是使用Apache Commons VFS实例化DefaultFileSystemManager并使用它来创建RamFileProvider.我会将此作为一个(更完整的)正确答案添加,但似乎这个问题已经被关闭了一段时间...... (83认同)
  • OP 绝对不会混淆文件和流。他认为他想使用 jarFile 来读取文件,而他所拥有的只是来自某个源 (getContent()) 的字节。 (5认同)
  • 如果您不想创建"实际文件",则可以尝试创建临时文件.请参阅`java.io.file`的`createTempFile`.单元测试退出时,可以将此文件设置为自动删除. (3认同)
  • +1我正在寻找这种解决方案,单元测试来组件而不必使用实际文件 (2认同)
  • 这不能回答问题。就像@SorinPostelnicu所说的那样,内存中的“文件”类似于内存中的文件系统。 (2认同)

har*_*ldK 27

要在内存中写入流,请使用:

new ByteArrayOutputStream();
Run Code Online (Sandbox Code Playgroud)

  • 这并不能回答问题,因为 ByteArrayOutputStream 不能与需要文件对象的接口一起使用。 (6认同)
  • @FableBlaze 那么,问题的答案是“这是不可能的”。这个答案试图务实地告诉用户可以做什么。安德烈亚斯的答案显然更彻底,也是更好的(尝试)答案。 (2认同)

Ted*_*ard 10

您可以使用内存文件系统,例如Jimfs

这是他们自述文件中的用法示例:

FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
Path foo = fs.getPath("/foo");
Files.createDirectory(foo);

Path hello = foo.resolve("hello.txt"); // /foo/hello.txt
Files.write(hello, ImmutableList.of("hello world"), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

  • Jimfs 不支持 `File` 对象 (4认同)