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

时间:2013-07-11 13:45:43

标签: 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();

任何有关如何在没有临时文件的情况下获得清单的示例都将受到赞赏。

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

3 个答案:

答案 0 :(得分:63)

  

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

也许您会混淆FileStream

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

您可以使用ByteArrayInputStreamByteArrayOutputStream来创建基于内存中的字节缓冲区的流来读取和写入字节缓冲区与您从文件读取和写入的方式类似。 byte数组包含“文件”内容。那么您不需要File对象。

File...ByteArray...流分别从java.io.OutputStreamjava.io.InputStream继承,以便您可以使用公共超类来隐藏您是否正在从文件或字节数组。

答案 1 :(得分:26)

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

new ByteArrayOutputStream();

答案 2 :(得分:6)

您可以使用内存文件系统,例如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);