Hvordan opretter man en ny java.io.File i hukommelsen?
Hvordan kan jeg oprette en ny fil (fra java.io) i hukommelsen, ikke på harddisken?
Måske forvirrer du File
og Stream
:
- A
File
er en abstrakt repræsentation af fil- og mappe-stinavne . Brug af enFile
objekt, kan du få adgang til filens metadata i et filsystem og udføre nogle handlinger på filer på dette filsystem, som at slette eller oprette filen. MenFile
klasse giver ikke metoder til at læse og skrive filindholdet. - For at læse og skrive fra en fil, bruger du en
Stream
objekt, såsomFileInputStream
ellerFileOutputStream
. Disse streams kan oprettes fra enFile
objekt og derefter bruges til at læse fra og skrive til filen.
Du kan oprette en stream baseret på en bytebuffer, som ligger i hukommelsen , ved at bruge en ByteArrayInputStream
og en ByteArrayOutputStream
at læse fra og skrive til en bytebuffer på lignende måde læser og skriver du fra en fil. byte
array indeholder "Filens" indhold. Du behøver ikke en File
indvend så.
Både File...
og ByteArray...
streams arver fra java.io.OutputStream
og java.io.InputStream
, således at du kan bruge den fælles superklasse til at skjule, om du læser fra en fil eller fra en byte-array.
Det er ikke muligt at oprette en java.io.File
der holder sit indhold i (Java heap) hukommelse *.
I stedet ville du normalt bruge en strøm. For at skrive til en stream, i hukommelsen, skal du bruge:
OutputStream out = new ByteArrayOutputStream();
out.write(...);
Men en stream kan desværre ikke bruges som input til java.util.jar.JarFile
, der som du nævner kun kan bruge en File
eller en String
indeholdende stien til en gyldig JAR fil . Jeg tror, at brug af en midlertidig fil, som du gør i øjeblikket, er den eneste mulighed, medmindre du vil bruge en anden API.
Hvis du er okay med at bruge en anden API, er der bekvemt en klasse i den samme pakke, der hedder JarInputStream
du kan bruge. Indpak blot din archiveContent
array i en ByteArrayInputStream
, for at læse indholdet af JAR og udtrække manifestet:
try (JarInputStream stream = new JarInputStream(new ByteArrayInputStream(archiveContent))) {
Manifest manifest = stream.getManifest();
}
*) Det er åbenbart muligt at lave et komplet filsystem, der ligger i hukommelsen, som en RAM-disk, men det ville stadig være "på disk" (og ikke i Java-heap-hukommelsen), hvad angår Java-processen.
Du kan bruge et filsystem i hukommelsen, såsom Jimfs
Her er et brugseksempel fra deres 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);