2011-02-08 30 views

Trả lời

28

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.

+1

Tôi đoán câu trả lời tương tự cũng dành cho FileInputStream quá đúng không ?? –

+3

@ 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ì. –

12

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ể.

-2

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()); 
+0

Tại sao bỏ phiếu phủ định? Ai đó có thể giải thích? –

+10

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í –

7

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.

+0

Không có trường như vậy trong JDK 1.6, 1.7 hoặc 1.8. – EJP

+0

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: –

+0

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); } } –

1

Đ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.
Các vấn đề liên quan