Czy istnieje sposób na uzyskanie nazwy pliku od FileOutputStream
lub od FileInputStream
?Uzyskaj nazwę pliku od FileOutputStream
Odpowiedz
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
.
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.
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());
Dlaczego głosowanie negatywne? Czy ktoś może wyjaśnić? –
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 –
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.
Nie ma takiego pola w JDK 1.6, 1.7 lub 1.8. – EJP
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: –
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); } } –
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.
- 1. Uzyskaj nazwę kontrolera od $ scope
- 2. Uzyskaj nazwę pliku z pliku wejściowego Angular2
- 3. Uzyskaj nazwę dnia od dnia tygodnia int
- 4. Uzyskaj nazwę hosta od kontrolera Rails
- 5. Uzyskaj nazwę klasy betonu od klasy abstrakcyjnej
- 6. Uzyskaj nazwę ścieżki od href w JavaScript
- 7. Uzyskaj nazwę kategorii od Post ID
- 8. Uzyskaj nazwę folderu pliku w języku Python
- 9. Uzyskaj nazwę programu Java
- 10. Uzyskaj nazwę zespołu aplikacji WWW, niezależnie od bieżącego zespołu wykonawczego.
- 11. Uzyskaj nazwę pliku z lokalizacji pliku w języku Java
- 12. Uzyskaj nazwę pliku pliku, który działał PHP to
- 13. Uzyskaj nazwę hosta bieżącego żądania w pliku node.js Express
- 14. Uzyskaj nazwę bieżącego środowiska
- 15. Uzyskaj nazwę kompilatora bluetooth
- 16. Uzyskaj nazwę instancji C#
- 17. Uzyskaj nazwę projektu WPF
- 18. Uzyskaj nazwę udekorowanej funkcji?
- 19. Uzyskaj nazwę klasy nadrzędnej?
- 20. Uzyskaj nazwę wejściową angularjs
- 21. Uzyskaj nazwę aktualnej klasy?
- 22. .Net Uzyskaj nazwę właściwości
- 23. Uzyskaj nazwę parametru
- 24. Odpowiednik FileOutputStream
- 25. FileOutputStream do FileInputStream
- 26. JAVA: FileInputStream i FileOutputStream
- 27. Uzyskaj identyfikator zasobu od nazwy
- 28. Regex: Uzyskaj nazwę pliku bez rozszerzenia w jednym ujęciu?
- 29. Uzyskaj nazwę serwera z ciągu połączenia zdefiniowanego w pliku App.config?
- 30. Uzyskaj ścieżkę i nazwę pliku z wyniku zamiaru kamery
Myślę, że ta sama odpowiedź jest dla FileInputStream zbyt prawo ?? –
@ Stephen - czytałem dokumenty, ale chciałem tylko potwierdzić, że niczego nie przegapiłem. –