2013-07-11 26 views
53

Jak mogę utworzyć nową File (z java.io) w pamięci - nie na dysku twardym?jak utworzyć nowy plik java.io.file w pamięci?

Używam języka Java. Nie chcę zapisywać pliku na dysku twardym.

+7

Więc po prostu chcesz bajtów w pamięci? –

+5

Co próbujesz zrobić * z tym 'File'? –

+4

"Plik" z definicji znajduje się na dysku twardym. –

Odpowiedz

19

Aby napisać do strumienia, w pamięci, należy:

new ByteArrayOutputStream(); 
0

Możesz użyć java.io.StringWriter.

51

Jak mogę utworzyć nowy plik (z java.io) w pamięci, a nie na dysku twardym?

Może są mylące File i Stream:

  • File jest abstrakcyjną reprezentacją pliku i katalogu ścieżek. Za pomocą obiektu File można uzyskać dostęp do metadanych pliku w systemie plików i wykonać pewne operacje na plikach w tym systemie plików, na przykład usunąć lub utworzyć plik. Ale klasa File nie zapewnia metod odczytu i zapisu zawartości pliku.
  • Do odczytu i zapisu z pliku używany jest obiekt Stream, taki jak FileInputStream lub FileOutputStream. Strumienie te można utworzyć z obiektu File, a następnie wykorzystać do odczytu i zapisu w pliku.

Można utworzyć strumień na podstawie bufora bajtów, który rezyduje w pamięci, stosując ByteArrayInputStream i ByteArrayOutputStream do odczytu i zapisu do bufora bajtów w podobny sposób odczytu i zapisu z plik. Tablica byte zawiera treść "Plików". Nie potrzebujesz wtedy obiektu File.

Zarówno File... i strumienie ByteArray... dziedziczą java.io.OutputStream i java.io.InputStream, odpowiednio, tak aby można było korzystać ze wspólnej superklasę ukryć czy czytasz z pliku lub z tablicy bajtów.

+62

Nie jestem pewien, czy taki właśnie był oryginalny plakat, ale jednym z przykładów, kiedy "Plik w pamięci" byłby przydatny, jest to, gdy chcesz ponownie użyć istniejącej biblioteki, która potrzebuje pliku java.io.file jako parametru wejściowego, ale rzeczywiście chcesz użyć "plików" przechowywanych w pamięci. W takim przypadku myślę, że jednym z rozwiązań byłoby użycie VFS Apache Commons do utworzenia instancji DefaultFileSystemManager i użycia jej do utworzenia elementu RamFileProvider. Dodałbym to jako (bardziej kompletną) poprawną odpowiedź, ale wydaje się, że to pytanie zostało zamknięte jakiś czas temu ... –

+1

+1 Szukałem tego rodzaju rozwiązania, do testu jednostkowego przyjdź do komponentu bez konieczności używania rzeczywisty plik – GClaramunt

+2

Jeśli nie chcesz tworzyć "rzeczywistego pliku", możesz spróbować utworzyć tymczasowy plik. Zobacz 'createTempFile' dla' java.io.file'. Plik ten można ustawić na automatyczne usuwanie po zakończeniu testu urządzenia. –