Có cách nào để lấy tên tệp từ FileOutputStream
hoặc từ FileInputStream
không?Nhận tên tệp từ FileOutputStream
Trả lời
Hình như câu trả lời là không:
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
Không có phương pháp nào mà trả lại File
hoặc String
dùng trong xây dựng của con suối.
CHỈNH SỬA: Khoản giữ tương tự cho FileInputStream
.
Tính năng này không được cung cấp bởi Đầu vào tệp/đầu ra ngoài hộp, nhưng không có gì ngăn bạn viết lớp con của riêng bạn lưu trữ Tệp (hoặc tên tệp) và cung cấp trình thu thập dữ liệu cho nó.
Tôi khuyên bạn nên triển khai một số giao diện FileNameAware
cho điều này), vì luồng I/O thường được tham chiếu với lớp trừu tượng InputStream
/OutputStream
để tránh ghép nối ứng dụng của bạn với triển khai cụ thể.
Câu trả lời của tôi đến muộn một chút. Tôi nhấn cùng một vấn đề khi viết một số mã.
Để giải quyết vấn đề này, tôi đã sử dụng FileOutputStream(File file)
thay vì FileOutputStream(String location)
vì sau đó tôi có thể thực hiện file.getAbsolutePath()
. Xem đoạn mã ví dụ bên dưới.
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());
Tại sao bỏ phiếu phủ định? Ai đó có thể giải thích? –
Có thể vì Tệp đặt (Out/In) putStream không quan trọng ở đây khi bạn giữ Tệp. Nếu phương thức này chỉ trả về một Stream, bạn không có cơ hội (với việc sử dụng FileInputStream trực tiếp) để lấy File bên dưới hoặc vị trí –
có thể, với sự phản ánh: Tom G Câu trả lời là đúng, ví dụ: không có API để có được con đường. Tuy nhiên, nếu bạn bị mắc kẹt như tôi với một khung công tác, bạn không thể thay đổi và không thể lấy tên tệp bằng bất kỳ phương tiện nào khác, bạn có thể sử dụng sự phản chiếu để lấy đường dẫn (trong trường hợp của tôi, tôi cần nó cho mục đích gỡ lỗi).
Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);
Rõ ràng, việc triển khai FileOutpuStream có thể thay đổi theo thời gian và mã này có thể bị hỏng. Ngoài ra, tôi bỏ qua việc xử lý các ngoại lệ trong đoạn mã ở trên cho mục đích rõ ràng.
Không có sẵn trong 1.6 và 1.7 Đã xác nhận có sẵn trong 1.8.
Không có trường như vậy trong JDK 1.6, 1.7 hoặc 1.8. – EJP
EJP, bạn đã sai. Có một lĩnh vực như vậy. Tôi vừa thử nghiệm nó dưới Java 1.8.0_112-b16. Toàn bộ mã ở đây: –
nhập java.io.FileOutputStream; nhập java.lang.reflect.Field; public class FileOutputStreamTest { public static void main (args String []) throws Exception { FileOutputStream OutputStream = new FileOutputStream ("./ FileOutputStreamTest.java"); Đường dẫn trườngField = FileOutputStream.class.getDeclaredField ("path"); pathField.setAccessible (true); String path = (String) pathField.get (outputStream); System.out.println ("path =" + path); } } –
Điều này là không thể, thậm chí về nguyên tắc. Giả định của câu hỏi là mỗi luồng đầu vào của tệp được liên kết với một tệp có một tên. Giả định sau là sai, đối với các hệ thống POSIX. Đối với các hệ thống POSIX, một tệp có thể có bất kỳ số lượng tên nào (liên kết cứng), bao gồm số không. Trường hợp không có tên là khá phổ biến đối với các tệp tạm thời, để đảm bảo rằng tệp tạm thời bị xóa khi thoát chương trình.
Tôi đã viết nhiều mã tệp IO và không bao giờ cần chức năng này. Mà bạn đang yêu cầu nó cho thấy bạn có một lỗ hổng thiết kế. Đó là, bạn có một vấn đề XY.
- Gần như không có lý do gì để mã khai báo lớp tham chiếu đến đối tượng luồng thành luồng tệp. Mã IO có thể sử dụng InputStream hoặc OutputStteam. Thật vậy, nó nên, như một phần của lập trình cho giao diện và để cho phép kiểm tra đơn vị giá rẻ mã IO của bạn (bằng cách cho phép sử dụng luồng mảng byte đơn giản làm đối tượng giả).
- Có lẽ bạn đang hy vọng sử dụng tên tệp trong một số thông điệp tường trình? Nếu vậy, điều đó cho thấy bạn đang cố gắng ghi lại các lỗi IO của tệp quá thấp trong hệ thống phân cấp chương trình của bạn. Có lẽ bạn đang bắt IOExceptions quá "sớm", thay vì để cho họ tuyên truyền cho các phần cao hơn của chương trình của bạn, mà biết rằng IO là tập tin IO và biết tên của tập tin.
- 1. Xóa các tệp được tạo bằng FileOutputStream
- 2. Android: Nhận tên tệp từ máy ảnh?
- 3. JAVA: FileInputStream và FileOutputStream
- 4. Java FileOutputStream Tạo Tệp nếu không tồn tại
- 5. FileOutputStream tương đương
- 6. FileOutputStream vs ByteArrayOutputStream
- 7. Nhận tên tệp từ URL bằng cách sử dụng Lua
- 8. Nhận tên tệp từ mảng byte hoặc Luồng
- 9. FileOutputStream vào FileInputStream
- 10. Nhận tên từ PID?
- 11. Quyền truy cập bị từ chối khi sử dụng FileOutputStream
- 12. Ghi vào FileOutputStream từ nhiều chủ đề trong Java
- 13. Xác nhận tên tệp trong python
- 14. Google AppEngine không hỗ trợ FileOutputStream
- 15. Cách trích xuất tên tệp từ tên đường dẫn tệp?
- 16. Nhận tên sheet từ một tên dãy Tên đối tượng
- 17. Nhận tên phông chữ của tệp .ttf
- 18. Nhận danh mục tên tệp trong Javascript
- 19. Nhận tên tệp đang chạy trong Java?
- 20. Nhận tên tệp của tệp chạy PHP bao gồm
- 21. PYTHON nhận tệp từ dòng lệnh
- 22. PHP REGEX: Nhận tên miền từ URL
- 23. Symfony2 Nhận tên tuyến đường từ URL
- 24. Nhận tên miền từ URL đầy đủ
- 25. Nhận tên thư mục từ đường dẫn
- 26. Hunspell - Không thể mở tệp từ hoặc tệp từ điển cho từ điển có tên en_US
- 27. Nhận tên tệp mà không cần Content-Disposition
- 28. Đường dẫn/tên tệp từ InputStream
- 29. Dừng cl.exe từ xuất tên tệp nguồn
- 30. Cách lấy tên tệp từ mục đích?
Tôi đoán câu trả lời tương tự cũng dành cho FileInputStream quá đúng không ?? –
@ Stephen- Tôi đọc tài liệu, nhưng chỉ muốn xác nhận rằng tôi đã không bỏ lỡ bất cứ điều gì. –