メモリに新しいjava.io.Fileを作成する方法は?


98

ハードディスク上ではなく、メモリ内にFile(からjava.io)新規に作成するにはどうすればよいですか?

Java言語を使用しています。ファイルをハードドライブに保存したくない。

悪いAPI(java.util.jar.JarFile)に直面しています。それは期待していますFile fileString filename。ファイルがなく(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();

一時ファイルを作成せずにマニフェストを取得する方法の例をいただければ幸いです。


8
だからあなたはただメモリにバイトが欲しいのですか?
Sotirios Delimanolis 2013

6
これで何をしようとていFileますか?
Jon Skeet 2013

5
A Fileの定義によっては、ハードドライブ上にあります。
Uwe Plonus 2013

3
永続的なメモリでファイルを作成したくない場合、ファイルを作成する意味は何ですか?
Bhavik Shah 2013

7
うわー、StackOverflowの想像力の欠如は驚異的です。誰かがファイルを必要とするインターフェースを使用しているため、誰かが単純なインメモリファイルを必要とする場合があります。インターフェイスはInputStream用に作成されているはずですが、作成されていません。一時ファイルはやり過ぎのように見えるので、メモリ内のjava.io.Fileが望ましいでしょう。
Novaterata

回答:


30

ストリームに書き込むには、メモリ内で次を使用します。

new ByteArrayOutputStream();

5
ByteArrayOutputStreamは、ファイルオブジェクトを必要とするインターフェイスでは使用できないため、これは質問の答えにはなりません。
FableBlaze

1
@FableBlazeさて、質問への答えは「不可能」です。この答えは実用的で、代わりにユーザーが何ができるかを伝えようとします。アンドレアスの答えは明らかにより徹底的で、より良い(試みて)答えです。
haraldK

「不可能」は私の意見では有効な答えでしょう。ただし、何らかの理由でハードドライブに書き込めない場合は、それが回避策になる可能性があるため、インメモリファイルシステム(Andreasの回答のコメントに記載されている)も記載できると思います。
FableBlaze

80

ハードディスクではなくメモリ内に(java.ioから)新しいファイルを作成するにはどうすればよいですか?

多分あなたは混乱FileしていてStream

  • A Fileは、ファイルとディレクトリのパス名の抽象的な表現です。Fileオブジェクトを使用して、ファイルシステム内のファイルメタデータにアクセスし、このファイルシステム上のファイルに対して、ファイルの削除や作成などの操作を実行できます。ただし、Fileクラスはファイルの内容を読み書きするメソッドを提供しません。
  • ファイルの読み書きには、またはなどのStreamオブジェクトを使用しています。これらのストリームはオブジェクトから作成でき、ファイルの読み取りと書き込みに使用できます。FileInputStreamFileOutputStreamFile

a とa を使用してバイトバッファーの読み取りと書き込みを行い、ファイルの読み取りと書き込みと同様の方法で、メモリ常駐するバイトバッファーに基づいてストリームを作成できます。アレイ「は、ファイルの」コンテンツが含まれています。その場合、オブジェクトは必要ありません。ByteArrayInputStreamByteArrayOutputStreambyteFile

File...ByteArray...ストリームの両方がそれぞれjava.io.OutputStreamとから継承されるjava.io.InputStreamため、共通のスーパークラスを使用して、ファイルから読み取るかバイト配列から読み取るかを非表示にできます。


95
これが元のポスターが望んでいたものかどうかはわかりませんが、「メモリ内のファイル」が役立つ1つの例は、入力パラメータとしてjava.io.Fileを必要とする既存のライブラリを再利用する場合ですが、メモリに保存されている「ファイル」を実際に使用したい。その場合、1つの解決策は、Apache Commons VFSを使用してDefaultFileSystemManagerをインスタンス化し、それを使用してRamFileProviderを作成することだと思います。私はこれを(より完全な)適切な回答として追加しましたが、この質問は少し前に閉じられたようです...
Sorin Postelnicu

2
+1実際のファイルを使用せずにコンポーネントの単体テストを行うために、この種のソリューションを探していました
GClaramunt

3
「実際のファイル」を作成したくない場合は、一時ファイルを作成してみてください。参照createTempFileのためにjava.io.file。このファイルは、単体テストの終了時に自動削除するように設定できます。
Andrew-Dufresne 2014

2
これは質問の答えにはなりません。@SorinPostelnicuがよく言っているように、メモリ内の「ファイル」はメモリ内のファイルシステムのようなものです。
フェリペ

1
おそらく、OPのユースケースと、高価なシステムディスクI / Oでレイテンシを削減する貴重な方法を合計します。
Eddie B

3

Jimfsなどのインメモリファイルシステムを使用できます。

以下は、readmeの使用例です。

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.