当前位置: 首页 > 知识库问答 >
问题:

如何创建新java。io。内存中的文件?[副本]

宗增
2023-03-14

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

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

我面临着一个糟糕的API(java.util.jar.JarFile)。它需要字符串文件名的文件名。我没有文件(只有字节[]),可以创建临时文件,但这不是一个很好的解决方案。我需要验证签名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个答案

汝昀
2023-03-14

您可以使用内存中的文件系统,如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);
梁丘诚
2023-03-14
匿名用户

无法创建java。io。将其内容保存在(Java堆)内存*中的文件。

相反,通常您会使用流。要写入内存中的流,请使用:

OutputStream out = new ByteArrayOutputStream();
out.write(...);

但不幸的是,流不能用作java.util.jar.JarFile的输入,正如您所提到的,它只能使用包含有效JAR文件路径的FileString。我相信像您现在这样使用临时文件是唯一的选择,除非您想使用不同的API。

如果您可以使用不同的API,那么在同一个包中可以方便地使用一个名为JarInputStream的类。只需将您的archiveContent数组包装在一个ByteArrayInputStream中,即可读取JAR的内容并提取清单:

try (JarInputStream stream = new JarInputStream(new ByteArrayInputStream(archiveContent))) {
     Manifest manifest = stream.getManifest();
}

*)很明显,可以创建驻留在内存中的完整文件系统,如RAM磁盘,但就Java进程而言,它仍然是“在磁盘上”(而不是在Java堆内存中)。

华甫
2023-03-14

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

可能您混淆了文件和流:

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

您可以基于驻留在内存中的字节缓冲区创建流,方法是使用字节缓冲区ByteArrayInputStream和字节缓冲区ByteArrayInputStream以与文件读写类似的方式对字节缓冲区进行读写。字节数组包含“文件”内容。那么,您就不需要文件对象了。

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

 类似资料:
  • 问题内容: 如何在内存中(而不是在硬盘上)创建新的(由)? 我正在使用Java语言。我不想将文件保存在硬盘上。 我遇到了一个错误的API()。期待着。我没有文件(只有内容),可以创建临时文件,但这不是一个漂亮的解决方案。我需要验证签名罐子的摘要。 在不创建临时文件的情况下如何获得清单的任何示例将不胜感激。 问题答案: 要在内存中写入流,请使用:

  • 是否有可能从内存中(而不是磁盘上)的文件创建ZipArchive。 以下是用例:多个文件在

  • 问题内容: 我想制作一个内存文件以在pygame混合器中使用。我的意思是这样的(http://www.pygame.org/docs/ref/music.html#pygame.mixer.music.load它说load()方法支持文件对象) 问题答案: 您可能正在寻找或类从Python的包装,无论是在现有的Python 2 和Python 3中 。它们提供了类似于文件的界面,您可以在代码中使用

  • 我在Eclipse中完成了我的项目。我有,,和

  • 问题内容: 我刚刚接受采访,并被要求使用Java 造成内存泄漏。 不用说,我对如何开始创建它一无所知。 一个例子是什么? 问题答案: 这是在纯Java中创建真正的内存泄漏(运行代码无法访问但仍存储在内存中的对象)的好方法: 该应用程序将创建一个长期运行的线程(或使用线程池更快地泄漏)。 线程通过(可选,自定义)加载类。 该类分配大量的内存(例如),在静态字段中存储对它的强引用,然后在中存储对自身的

  • 但我想创建一个文件夹与应用程序的名称,并能够保存录制的音频到该文件夹。有人能告诉我怎么做吗?我成功地创建了文件夹,但我不知道如何将mediaFile移动到其中: