2011-11-22 33 views
5

Sau khi cẩn thận cố gắng thực hiện truyền tệp TCP trong ứng dụng trò chuyện hội nghị của tôi bằng luồng byte thô, tôi đã quyết định gửi các tệp mà tôi muốn truyền qua luồng đối tượng dễ dàng hơn nhiều. Các tệp được gửi và lưu trữ tại đích của chúng (cho dù đó là máy chủ trung tâm hoặc máy khách tải xuống) như là các đối tượng Tệp trong bộ nhớ. Tuy nhiên, các tệp này không được sử dụng như chỉ các đối tượng Tệp - khách hàng có thể mở chúng. Có cách nào trong java để lưu các đối tượng tập tin như các tập tin đĩa cứng hoặc thậm chí mở chúng thông qua Java?Lưu/mở Java Các đối tượng tập tin

Trả lời

8

Ý của bạn là gì với "Đối tượng tệp"; Ý của bạn là java.io.File?

Lớp java.io.File chỉ là đại diện cho tên thư mục và tên tệp. Nó không phải là một đối tượng có thể chứa nội dung của một tập tin.

Nếu bạn có dữ liệu trong ví dụ một mảng byte trong bộ nhớ, sau đó có, bạn có thể tiết kiệm đó vào một tập tin:

byte[] data = ...; 

OutputStream out = new FileOutputStream(new File("C:\\someplace\\filename.dat")); 
out.write(data); 
out.close(); 

Xem Basic I/O Lesson từ Oracle Java Hướng dẫn để biết cách đọc và viết các tệp có số FileInputStreamFileOutputStream.

+0

xấu của tôi, không biết rằng java.io.File không thể giữ nội dung tập tin. hội đồng quản trị như vậy: ( –

1

Bạn nên nhìn vào Data Handlers

Bạn có thể sử dụng chúng để chuyển các tập tin như Data Sources nhưng theo một cách "minh bạch" cho bạn.

+0

Cảm ơn, sẽ xem xét chúng trong tương lai. –

0

Tôi đã quyết định sử dụng dễ dàng hơn nhiều để gửi tập tin mà tôi muốn chuyển qua suối đối tượng "

Nó không phải là Bad ý tưởng:.. Chi phí bộ nhớ và độ trễ (tức là thời gian và không gian) Chỉ cần gửi và nhận các byte, với các công cụ ở phía trước để cho bạn biết tên tập tin và kích thước tập tin

+0

Tôi đã thử gửi tên tệp trước bằng cách sử dụng PrintWriter, một d sau đó các byte thô sử dụng BufferedOutputStream. Tên tệp và byte sẽ gửi từ phía người gửi không có vấn đề gì. Bên nhận cũng có thể nhận được tên tệp, tuy nhiên nó không thể nhận bất kỳ byte thô nào - nó chỉ tạo các tệp rỗng. Khi tôi chuyển sang sử dụng một luồng đối tượng, nó dường như hoạt động? –

+1

@RichardStokes Điều đó sẽ không bao giờ hoạt động. Sử dụng các luồng giống nhau ở cả hai đầu cho tuổi thọ của kết nối. PrintWriter có một bộ đệm, BufferedOutputStream có một bộ đệm, BufferedReader có một bộ đệm, và BufferedInputStream có một bộ đệm. Quá nhiều bộ đệm cho sự gắn kết trên dây. Tôi sẽ sử dụng một DataOutputStream/DataInputStream cho mọi thứ, gửi tên tệp với writeUTF()/readUTF(), độ dài với writeLong()/readLong() và dữ liệu có write() và read(). – EJP

+0

Wow cảm ơn, một nhận xét rất kỹ lưỡng. –

Các vấn đề liên quan