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


98

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

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

我遇到了一个错误的API(java.util.jar.JarFile)。期待File file着String filename。我没有文件(只有byte[]内容),可以创建临时文件,但这不是一个漂亮的解决方案。我需要验证签名罐子的摘要。

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();

在不创建临时文件的情况下如何获得清单的任何示例将不胜感激。


8
因此,您只需要内存中的字节?
— Sotirios Delimanolis

6
您打算如何处理File?
— 乔恩·斯基特

5
根据File定义,A 位于硬盘驱动器上。
— Uwe Plonus

3
如果您不希望在持久性内存中创建文件,那有什么意义呢?
— Bhavik Shah 2013年

7
哇,对StackOverflow缺乏想象力令人震惊。某些人可能需要简单的内存文件,因为他们正在使用需要文件的接口。该接口应该已经为InputStream编写,但事实并非如此。临时文件似乎有点过分,因此最好使用内存中的java.io.File。
— Novaterata

Answers:


30

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

new ByteArrayOutputStream();

5
这不能回答问题,因为ByteArrayOutputStream不能与需要文件对象的接口一起使用。
— FableBlaze

1
@FableBlaze那么,对这个问题的答案是“不可能”。这个答案试图务实,并告诉用户可以做什么。Andreas的答案显然更彻底,也更好(尝试)。
— haraldK

我认为“不可能”将是一个有效的答案。但是我认为还可以提到一个内存文件系统(在Andreas的答案的评论中提到),因为如果您由于某种原因无法写入硬盘,那可能是解决问题的一种方法。
— FableBlaze

80

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

也许您感到困惑,File并且Stream:

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

您可以通过使用驻留在内存中的字节缓冲区创建流。ByteArrayInputStream和a ByteArrayOutputStream读取和写入字节缓冲区的方式与从文件读取和写入字节的方式类似。该byte数组包含“文件的”内容。然后,您不需要File对象。

无论是File...和ByteArray...流继承java.io.OutputStream和java.io.InputStream分别,这样就可以无论您是从文件或从字节数组读取使用的公共超隐藏。


95
我不确定这是否是原始发布者想要的,但是“内存中的文件”是否有用的一个示例是,当您想重用需要java.io.File作为输入参数的现有库时,但是您实际想使用存储在内存中的“文件”。在那种情况下,我认为一种解决方案是使用Apache Commons VFS实例化DefaultFileSystemManager并使用它创建RamFileProvider。我本可以将其添加为(更完整的)正确答案,但似乎这个问题已在不久前结束……
— Sorin Postelnicu

2
+1我正在寻找这种解决方案,无需使用实际文件就可以对组件进行单元测试
— GClaramunt 2013年

3
如果您不想创建“实际文件”,则可以尝试创建一个临时文件。见createTempFile的java.io.file。单元测试退出时,可以将此文件设置为自动删除。
— Andrew-Dufresne 2014年

2
这不能回答问题。就像@SorinPostelnicu所说的那样,内存中的“文件”类似于内存中的文件系统。
— 2014年

1
可能总结了OP的用例以及一种通过昂贵的系统磁盘I / O减少延迟的有价值的方法。
— Eddie B

3

您可以使用内存中的文件系统,例如 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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.