如何在内存中创建新的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();
任何有关如何在没有临时文件的情况下获得清单的示例都将受到赞赏。
我认为现在这个问题不是偏离主题的
答案 0 :(得分:63)
如何在内存中创建新文件(来自java.io),而不是在硬盘中创建?
也许您会混淆File
和Stream
:
File
是文件和目录路径名的抽象表示。使用File
对象,您可以访问文件系统中的文件元数据,并对此文件系统上的文件执行某些操作,如删除或创建文件。但File
类不提供读写文件内容的方法。Stream
对象,例如FileInputStream
或FileOutputStream
。这些流可以从File
对象创建,然后用于读取和写入文件。您可以使用ByteArrayInputStream
和ByteArrayOutputStream
来创建基于内存中的字节缓冲区的流3>来读取和写入字节缓冲区与您从文件读取和写入的方式类似。 byte
数组包含“文件”内容。那么您不需要File
对象。
File...
和ByteArray...
流分别从java.io.OutputStream
和java.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);