Jak mogę utworzyć nowy File
(z java.io
) w pamięci, a nie na dysku twardym?
Używam języka Java. Nie chcę zapisywać pliku na dysku twardym.
Mam do czynienia ze złym API ( java.util.jar.JarFile
). To oczekując File file
od String filename
. Nie mam pliku (tylko byte[]
zawartość) i mogę utworzyć plik tymczasowy, ale nie jest to piękne rozwiązanie. Muszę zweryfikować skrót podpisanego słoika.
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();
Wszelkie przykłady, jak osiągnąć manifestację bez tworzenia pliku tymczasowego, będą mile widziane.
File
?File
z definicji znajduje się na dysku twardym.Odpowiedzi:
Aby pisać do strumienia, w pamięci użyj:
new ByteArrayOutputStream();
źródło
Może jesteś mylący
File
iStream
:File
jest abstrakcyjną reprezentacją nazw ścieżek do plików i katalogów . Korzystając zFile
obiektu, można uzyskać dostęp do metadanych pliku w systemie plików i wykonać pewne operacje na plikach w tym systemie plików, takie jak usunięcie lub utworzenie pliku. AleFile
klasa nie zapewnia metod do odczytu i zapisu zawartości pliku.Stream
obiektu, takiego jakFileInputStream
lubFileOutputStream
. Te strumienie mogą być tworzone zFile
obiektu, a następnie używane do odczytu i zapisu w pliku.Możesz utworzyć strumień na podstawie bufora bajtowego, który znajduje się w pamięci , używając a
ByteArrayInputStream
i aByteArrayOutputStream
do odczytywania i zapisywania w buforze bajtowym w podobny sposób, jak czytasz i zapisujesz z pliku.byte
Tablica zawiera treści „plik za”. Nie potrzebujeszFile
wtedy przedmiotu.Zarówno strumienie, jak
File...
iByteArray...
strumienie , odpowiednio, dziedziczą zjava.io.OutputStream
ijava.io.InputStream
, dzięki czemu można użyć wspólnej nadklasy do ukrycia, czy czytasz z pliku, czy z tablicy bajtów.źródło
createTempFile
najava.io.file
. Ten plik można ustawić na automatyczne usuwanie po zakończeniu testu jednostkowego.Możesz użyć systemu plików w pamięci, takiego jak Jimfs
Oto przykład użycia z ich pliku 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);
źródło