Bagaimana cara membuat java.io.File baru di memori?

100

Bagaimana cara membuat baru File(dari java.io) di memori, bukan di hard disk?

Saya menggunakan bahasa Java. Saya tidak ingin menyimpan file di hard drive.

Saya dihadapkan dengan API yang buruk ( java.util.jar.JarFile). Ini mengharapkan File filedari String filename. Saya tidak memiliki file (hanya byte[]konten) dan dapat membuat file sementara, tetapi ini bukan solusi yang bagus. Saya perlu memvalidasi intisari toples yang ditandatangani.

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();

Setiap contoh bagaimana mencapai mendapatkan manifes tanpa membuat file sementara akan sangat dihargai.

ggorlen.dll
sumber
8
Jadi Anda hanya ingin byte dalam memori?
Sotirios Delimanolis
6
Apa yang kamu coba lakukan dengan ini File?
Jon Skeet
5
A Filemenurut definisi ada di hard drive.
Uwe Plonus
3
apa gunanya membuat file jika Anda tidak menginginkannya di memori persisten?
Bhavik Shah
7
Wow, kurangnya imajinasi di StackOverflow sangat mencengangkan. Seseorang mungkin membutuhkan File dalam memori sederhana karena mereka menggunakan antarmuka yang membutuhkan File. Antarmuka seharusnya ditulis untuk InputStream, tetapi sebenarnya tidak. File temp sepertinya berlebihan, jadi java.io.File dalam memori akan lebih disukai.
Novaterata

Jawaban:

31

Untuk menulis ke aliran, dalam memori, gunakan:

new ByteArrayOutputStream();
haraldK
sumber
5
Ini tidak menjawab pertanyaan karena ByteArrayOutputStream tidak dapat digunakan dengan antarmuka yang membutuhkan objek file.
FableBlaze
1
@FableBlaze Nah, jawaban dari pertanyaannya adalah "itu tidak mungkin". Jawaban ini mencoba menjadi pragmatis dan memberi tahu apa yang dapat dilakukan pengguna sebagai gantinya. Jawaban Andreas jelas lebih teliti dan (mencoba) jawaban yang lebih baik.
haraldK
"Itu tidak mungkin" akan menjadi jawaban yang valid menurut saya. Namun saya pikir filesystem dalam memori (disebutkan dalam komentar jawaban Andreas) juga dapat disebutkan, karena jika Anda tidak bisa karena alasan tertentu menulis ke hard-drive, maka itu bisa menjadi jalan keluarnya.
FableBlaze
81

Bagaimana cara membuat File baru (dari java.io) di memori, bukan di hard disk?

Mungkin Anda bingung Filedan Stream:

  • A Fileadalah representasi abstrak dari nama jalur file dan direktori . Dengan menggunakan Fileobjek, Anda dapat mengakses metadata file di sistem file, dan melakukan beberapa operasi pada file di sistem file ini, seperti menghapus atau membuat file. Tetapi Filekelas tidak menyediakan metode untuk membaca dan menulis konten file.
  • Untuk membaca dan menulis dari file, Anda menggunakan Streamobjek, seperti FileInputStreamatau FileOutputStream. Aliran ini dapat dibuat dari Fileobjek dan kemudian digunakan untuk membaca dan menulis ke file.

Anda dapat membuat aliran berdasarkan buffer byte yang berada di memori , dengan menggunakan fileByteArrayInputStream dan a ByteArrayOutputStreamuntuk membaca dan menulis ke buffer byte dengan cara yang sama seperti Anda membaca dan menulis dari file. The bytearray berisi konten "File ini". Kalau begitu Anda tidak membutuhkan Fileobjek.

Baik the File...dan the ByteArray...stream mewarisijava.io.OutputStreamjava.io.InputStream masing-masing dan , sehingga Anda dapat menggunakan superclass umum untuk menyembunyikan apakah Anda membaca dari file atau dari array byte.

Andreas Fester
sumber
96
Saya tidak yakin apakah ini yang diinginkan poster asli, tetapi satu contoh ketika "File dalam memori" akan berguna adalah ketika Anda ingin menggunakan kembali pustaka yang ada yang memerlukan java.io.File sebagai parameter masukan, tetapi Anda sebenarnya ingin menggunakan "file" yang disimpan di memori. Dalam hal ini, saya pikir salah satu solusinya adalah menggunakan Apache Commons VFS untuk membuat instantiate DefaultFileSystemManager dan menggunakannya untuk membuat RamFileProvider. Saya akan menambahkan ini sebagai jawaban yang tepat (lebih lengkap), tetapi tampaknya pertanyaan ini telah ditutup beberapa waktu yang lalu ...
Sorin Postelnicu
2
+1 Saya sedang mencari solusi semacam ini, untuk menguji unit komponen datang tanpa harus menggunakan file yang sebenarnya
GClaramunt
3
Jika Anda tidak ingin membuat "file aktual", Anda dapat mencoba membuat file sementara. Lihat createTempFileuntuk java.io.file. File ini dapat disetel ke hapus otomatis saat uji unit keluar.
Andrew-Dufresne
2
Ini tidak menjawab pertanyaan itu. Seperti yang dikatakan @SorinPostelnicu dengan baik, "File" dalam memori adalah sesuatu seperti Sistem File dalam memori atau lebih.
Felipe
1
Mungkin merangkum kasus penggunaan OP dan metode berharga untuk mengurangi latensi dengan sistem disk i / o yang mahal.
Eddie B
3

Anda dapat menggunakan sistem file dalam memori, seperti Jimfs

Berikut contoh penggunaan dari readme mereka:

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);
Tedward
sumber