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


98

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

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

我遇到了一个错误的API(java.util.jar.JarFile)。期待File fileString 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.OutputStreamjava.io.InputStream分别,这样就可以无论您是从文件或从字节数组读取使用的公共超隐藏。


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

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

3
如果您不想创建“实际文件”,则可以尝试创建一个临时文件。见createTempFilejava.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.