Bellekte yeni bir java.io. dosyası nasıl oluşturulur?


105

Sabit diskte değil bellekte nasıl yeni File(kimden java.io) oluşturabilirim ?

Java dilini kullanıyorum. Dosyayı sabit sürücüye kaydetmek istemiyorum.

Kötü bir API ( java.util.jar.JarFile) ile karşı karşıyayım . Bu bekliyor File filearasında String filename. Dosyam yok (yalnızca byte[]içerik) ve geçici dosya oluşturabilirim, ancak bu güzel bir çözüm değil. İmzalı bir kavanozun özetini doğrulamam gerekiyor.

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

Geçici bir dosya oluşturmadan nasıl tezahür ettirileceğine dair herhangi bir örnek takdir edilecektir.


8
Yani sadece bellekte bayt mı istiyorsun?
Sotirios Delimanolis

6
Ne çalıştığınız yapmak bununla File?
Jon Skeet

5
A Filetanım gereği sabit sürücüdedir.
Uwe Plonus

3
Kalıcı bellekte istemiyorsanız bir dosya yaratmanın amacı nedir?
Bhavik Shah

9
Vay canına, StackOverflow'daki hayal gücü eksikliği şaşırtıcı. Dosya gerektiren bir arabirim kullandıklarından birinin bellek içi Dosya basitliğine ihtiyacı olabilir. Arayüz bir InputStream için yazılmış olmalıydı, ancak değildi. Geçici bir dosya aşırılık gibi görünür, bu nedenle bir bellek içi java.io.File tercih edilebilir.
Novaterata

Yanıtlar:


31

Bir akışa yazmak için belleğe şunu kullanın:

new ByteArrayOutputStream();

6
ByteArrayOutputStream, bir dosya nesnesi gerektiren bir arabirimle kullanılamadığından, bu soruya yanıt vermez.
FableBlaze

1
@FableBlaze O halde sorunun cevabı “bu mümkün değil”. Bu cevap pragmatik olmaya ve bunun yerine kullanıcının ne yapabileceğini söylemeye çalışır. Andreas'ın cevabı açıkça daha kapsamlı ve daha iyi bir cevaptır.
haraldK

"Mümkün değil" bence geçerli bir cevap olacaktır. Bununla birlikte, bir bellek içi dosya sisteminden de bahsedilebileceğini düşünüyorum (Andreas'ın cevabının yorumlarında bahsedilen), çünkü herhangi bir nedenle sabit diske yazamıyorsanız, bu onun etrafında bir yol olabilir.
FableBlaze

83

Sabit diskte değil, bellekte (java.io'dan) yeni Dosya nasıl oluşturabilirim?

Belki kafa karıştırıyorsun Fileve Stream:

  • A File, dosya ve dizin yol adlarının soyut bir temsilidir . Bir Filenesne kullanarak , bir dosya sistemindeki dosya meta verilerine erişebilir ve bu dosya sistemindeki dosyalar üzerinde, dosyayı silmek veya oluşturmak gibi bazı işlemler gerçekleştirebilirsiniz. Ancak Filesınıf, dosya içeriğini okumak ve yazmak için yöntemler sağlamaz.
  • Bir dosyadan okumak ve yazmak için Stream, FileInputStreamveya gibi bir nesne kullanıyorsunuz FileOutputStream. Bu akışlar bir Filenesneden oluşturulabilir ve ardından dosyadan okumak ve dosyaya yazmak için kullanılabilir.

Bir dosyadan okuyup yazdığınıza benzer şekilde bir bayt arabelleğinden okumak ve ona yazmak için a ve a kullanarak bellekte bulunan bir bayt arabelleğine dayalı bir akış oluşturabilirsiniz . Dizi "Dosyanın" içeriğe sahip. O zaman bir nesneye ihtiyacınız yok .ByteArrayInputStreamByteArrayOutputStreambyteFile

Hem File...ve ByteArray...akarsular devralan java.io.OutputStreamve java.io.InputStreambir dosyadan veya bir bayt diziden okuyor olup olmadığını gizlemek için ortak üst sınıf kullanabilirsiniz böylece sırasıyla.


97
Orijinal göndericinin istediğinin bu olup olmadığından emin değilim, ancak "Bellekteki dosya" nın yararlı olacağı bir örnek, java.io. aslında bellekte depolanan "dosyaları" kullanmak istiyor. Bu durumda, bir çözümün bir DefaultFileSystemManager örneğini oluşturmak için Apache Commons VFS kullanmak ve bunu bir RamFileProvider oluşturmak için kullanmak olacağını düşünüyorum. Bunu (daha eksiksiz) doğru bir cevap olarak
eklerdim

2
+1 Bu tür bir çözüm arıyordum, gerçek bir dosya kullanmak zorunda kalmadan bileşeni test etmek için
GClaramunt

3
"Gerçek bir dosya" oluşturmak istemiyorsanız, geçici bir dosya oluşturmayı deneyebilirsiniz. Görmek createTempFileiçin java.io.file. Bu dosya, ünite testinden çıkıldığında otomatik olarak silinecek şekilde ayarlanabilir.
Andrew-Dufresne

2
Bu soruya cevap vermiyor. @SorinPostelnicu'nun dediği gibi, bellekteki bir "Dosya", bellekteki bir Dosya Sistemi gibi bir şeydir.
Felipe

1
Muhtemelen OP'nin kullanım durumunu ve pahalı sistem disk giriş / çıkışları ile gecikmeyi azaltmanın değerli bir yöntemini özetliyor.
Eddie B

6

Jimfs gibi bir bellek içi dosya sistemi kullanabilirsiniz

İşte onların benioku dosyasından bir kullanım örneği:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.