2011-02-08 14 views

Odpowiedz

28

Wygląda na to, że odpowiedź nie jest:
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html
http://docs.oracle.com/javase/7/docs/api/index.html?java/io/FileOutputStream.html

Brak publiczne metody, które zwracają File lub String stosowane w budownictwie strumienia.

EDYTOWANIE: To samo dotyczy FileInputStream.

+1

Myślę, że ta sama odpowiedź jest dla FileInputStream zbyt prawo ?? –

+3

@ Stephen - czytałem dokumenty, ale chciałem tylko potwierdzić, że niczego nie przegapiłem. –

12

Ta funkcja nie jest dostarczana przez gotowe wejście/wyjście strumienia, ale nic nie stoi na przeszkodzie, aby napisać własną podklasę, która przechowuje plik (lub fileName) i zapewnia dla niego getter.

Sugerowałbym wdrożenie do tego celu interfejsu FileNameAware, ponieważ strumienie We/Wy zwykle są przywoływane klasami abstrakcyjnymi InputStream/OutputStream, aby uniknąć sprzężenia aplikacji z konkretnymi implementacjami.

-2

Moja odpowiedź jest trochę spóźniona. Trafiłem ten sam problem podczas pisania kodu.

Aby obejść ten problem, użyłem FileOutputStream(File file) zamiast FileOutputStream(String location), ponieważ mogę wtedy wykonać file.getAbsolutePath(). Zobacz przykładowy fragment poniżej.

String location = "some.relative.path.txt"; 
File file = new File(location); 
FileOutputStream f = new FileOutputStream(file); 
String question = "<h3>"+header+"</h3>"; 
String finalSource = HTMLWrapper.HTML_START+question +htmlContent; 
f.write(finalSource.getBytes()); 
f.flush(); 
f.close(); 
System.out.println("The report is now available at"+file.getAbsolutePath()); 
+0

Dlaczego głosowanie negatywne? Czy ktoś może wyjaśnić? –

+10

Może dlatego, że plik (Out/In) putStream nie ma tu znaczenia, ponieważ przechowujesz plik. Jeśli metoda zwraca tylko strumień, nie masz szans (używając bezpośredniego użycia FileInputStream) do pobrania podstawowego pliku lub lokalizacji –

7

możliwe, z refleksji: Tom G odpowiedź jest poprawna, to znaczy nie ma API, aby uzyskać ścieżkę. Jeśli jednak utknąłeś jak ja z frameworkiem, którego nie możesz zmienić i nie możesz uzyskać nazwy pliku w żaden inny sposób, możesz użyć odbicia, aby uzyskać ścieżkę (w moim przypadku potrzebowałem tego do celów debugowania).

Field pathField = FileOutputStream.class.getDeclaredField("path"); 
pathField.setAccessible(true); 
String path = (String) pathField.get(outputStream); 

Oczywiście implementacja FileOutpuStream może się zmieniać w czasie, a ten kod może ulec uszkodzeniu. Ponadto pominąłem obsługę wyjątków w powyższym urywku dla celów jasności.

Niedostępne w wersji 1.6 i 1.7 Potwierdzone dostępne w wersji 1.8.

+0

Nie ma takiego pola w JDK 1.6, 1.7 lub 1.8. – EJP

+0

EJP, jesteś w błędzie. Jest takie pole. Właśnie przetestowałem to w Javie 1.8.0_112-b16. Pełny kod tutaj: –

+0

import java.io.FileOutputStream; import java.lang.reflect.Field; public class FileOutputStreamTest { public static void main (String args []) throws Exception { FileOutputStream OutputStream = new FileOutputStream ("./ FileOutputStreamTest.java"); Field pathField = FileOutputStream.class.getDeclaredField ("ścieżka"); pathField.setAccessible (true); Ścieżka ciągu = (String) ścieżkaField.get (outputStream); System.out.println ("ścieżka =" + ścieżka); } } –

1

Nie jest to możliwe, nawet w zasadzie. Założeniem pytania jest to, że każdy strumień wejściowy pliku jest powiązany z jednym plikiem, który ma jedną nazwę. To ostatnie założenie jest błędne w przypadku systemów POSIX. W systemach POSIX plik może mieć dowolną liczbę nazw (twarde linki), w tym zero. Przypadek zerowych nazw jest dość powszechny w przypadku plików tymczasowych, aby zapewnić, że plik tymczasowy zostanie usunięty po zakończeniu programu.

Napisałem mnóstwo pliku IO i nigdy nie potrzebowałem tej funkcji. To, o co prosisz, sugeruje, że masz wadę konstrukcyjną. Oznacza to, że masz problem XY.

  • Nie ma prawie żadnego powodu, dla kodu zadeklarować klasę odniesienie do obiektu strumienia być plik strumień. Kod IO może używać InputStream lub OutputStteam. Rzeczywiście, to powinno być powinno być, jako część programowania do interfejsu, i umożliwić tanie testowanie jednostce twojego kodu IO (przez umożliwienie użycia strumienia tablicy bajtowej jako obiektu próbnego).
  • Może masz nadzieję, że użyjesz nazwy pliku w niektórych komunikatach? Jeśli tak, to sugeruje, że próbujesz zalogować błędy pliku IO zbyt nisko w hierarchii programu. Być może zbyt wcześnie łapiecie IOExceptions, zamiast pozwalać im przenosić się do wyższych części waszego programu, które wiedzą, że IO jest plikiem IO i zna nazwę pliku.