125

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

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

不適切な API ( ) に直面していますjava.util.jar.JarFileFile fileを期待していString 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();

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

4

4 に答える 4

89

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

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

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

ファイルから読み書きするのと同様の方法で、 aおよび aを使用してバイト バッファから読み書きすることにより、メモリ内に存在するバイト バッファに基づいてストリームを作成できます。配列には「ファイル」のコンテンツが含まれます。その場合、オブジェクトは必要ありません。ByteArrayInputStreamByteArrayOutputStreambyteFile

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

于 2013-07-11T13:53:39.350 に答える
34

java.io.File(Java ヒープ) メモリ * にコンテンツを保持する を作成することはできません。

代わりに、通常はストリームを使用します。メモリ内のストリームに書き込むには、次を使用します。

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

ただし、残念ながら、ストリームは の入力として使用できません。これは、有効な JARファイルへのパスを含むまたはjava.util.jar.JarFileのみを使用できます。別の API を使用したくない場合を除き、現在行っているように一時ファイルを使用することが唯一の選択肢だと思います。FileString

別の API を使用しても問題ない場合は、同じパッケージ内にJarInputStream使用できる名前のクラスがあると便利です。archiveContent配列を でラップするだけByteArrayInputStreamで、JAR の内容を読み取ってマニフェストを抽出できます。

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

*) RAM ディスクのようにメモリ内に常駐する完全なファイルシステムを作成することは明らかに可能ですが、Java プロセスに関する限り、それは「ディスク上」(Java ヒープメモリ内ではありません) になります。

于 2013-07-11T13:54:27.640 に答える