Java >> Java tutorial >  >> Tag >> java.io

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 en File 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. Men File 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åsom FileInputStream eller FileOutputStream . Disse streams kan oprettes fra en File 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);

Java tag