Utwórz obiekt File w pamięci z ciągu znaków w Javie

113

Mam funkcję, która akceptuje plik jako argument. Nie chcę tworzyć / zapisywać nowego pliku (nie mam dostępu do zapisu w systemie plików) w celu przekazania moich danych ciągu do funkcji. Powinienem dodać, że dane String nie istnieją w pliku (więc nie mogę odczytać moich danych z pliku).

Czy mogę używać strumieni i „przesyłać” je do obiektów File?

Jon Romero
źródło
2
Czy możesz połączyć / opublikować kod, który przyjmuje Fileobiekt? Jak stwierdziły odpowiedzi, Fileobiekt jest jak odniesienie do lokalizacji w systemie plików, więc trudno byłoby go zasymulować bez rzeczywistego pliku. Jeśli jednak twoja funkcja przyjęła a FileReaderlub a FileInputStream, możesz łatwo zmodyfikować kod, aby akceptował dane wejściowe niebędące plikami.
101100
Możesz wybrać pliki mapowane w pamięci. Są to specjalne pliki w Javie, które umożliwiają programowi Java dostęp do zawartości bezpośrednio z pamięci. Aby uzyskać szczegółowe informacje, przejdź przez ten link: javarevisited.blogspot.com/2012/01/…
Bacteria

Odpowiedzi:

48

Nie; instancje klasy Filereprezentują ścieżkę w systemie plików. Dlatego możesz używać tej funkcji tylko z plikiem. Ale może InputStreamzamiast tego jest przeciążenie ?

meriton
źródło
76

Zwykle, gdy metoda akceptuje plik, w pobliżu znajduje się inna metoda, która akceptuje strumień. Jeśli tak nie jest, interfejs API jest źle zakodowany. W przeciwnym razie możesz użyć plików tymczasowych, do których w wielu przypadkach przyznaje się pozwolenie. Jeśli jest to aplet, możesz poprosić o pozwolenie na zapis .

Przykład:

try {
    // Create temp file.
    File temp = File.createTempFile("pattern", ".suffix");

    // Delete temp file when program exits.
    temp.deleteOnExit();

    // Write to temp file
    BufferedWriter out = new BufferedWriter(new FileWriter(temp));
    out.write("aString");
    out.close();
} catch (IOException e) {
}
Chris Dennett
źródło
1
Nie można poprosić o pozwolenie na zapis (to Google AppEngine)
Jon Romero
12

Obiekt File w Javie jest reprezentacją ścieżki do katalogu lub pliku, a nie sam plik. Nie musisz mieć dostępu do zapisu w systemie plików, aby utworzyć Fileobiekt, potrzebujesz go tylko wtedy, gdy zamierzasz faktycznie zapisywać do pliku ( na przykład używając FileOutputStream )

Kevin K.
źródło
1
Jeśli chcesz przekazać plik do zewnętrznego interfejsu API, potrzebujesz rzeczywistego pliku - przekazanie „pustego” obiektu File nie będzie działać.
Andrei Volgin
8

FileKlasa reprezentuje „idea” pliku, a nie rzeczywiste uchwyt do użytku I / O. Dlatego Fileklasa ma .exists()metodę, która mówi, czy plik istnieje, czy nie. (Jak możesz mieć Fileobiekt, który nie istnieje?)

Natomiast konstruowanie pliku new FileInputStream(new File("/my/file")) daje rzeczywisty strumień do odczytu bajtów z.

jagoda
źródło
-1
FileReader r = new FileReader(file);

Użyj czytnika plików, załaduj plik, a następnie zapisz jego zawartość w buforze ciągów.

przykład

Powyższe łącze pokazuje przykład, jak to osiągnąć. Jak w innym poście do tej odpowiedzi mówi, że aby załadować plik do pamięci, nie potrzebujesz prawa do zapisu, o ile nie planujesz wprowadzania zmian w rzeczywistym pliku.

Cristian
źródło