2015-10-06 24 views
6

Ai đó có thể giải thích cho tôi tại sao điều này wont work xây dựng:java đọc/ghi xây dựng

while (fileInputStream.available()>0) {  
    fileOutputStream.write(fileInputStream.read()); 
} 

và điều này làm việc tốt:

while (fileInputStream.available()>0) { 
    int data = fileInputStream.read(); 
    fileOutputStream.write(data); 
} 

Đối với tôi rằng họ là giống hệt nhau, nhưng 1st một sẽ không ghi dữ liệu chính xác (sẽ viết một nửa chiều dài tập tin/dữ liệu).

+1

Có vòng lặp nào mà bạn không hiển thị cho chúng tôi không? Bởi vì read() chỉ đọc một phân đoạn dữ liệu. Nói chung rằng phân đoạn được xác định bởi một container một int là 32 bit, nơi như fileoutputstream có số tiền khác nhau của byte –

+0

Chúng giống nhau. Lưu ý rằng điều này không ** không ** sao chép toàn bộ nội dung của luồng đầu vào vào luồng đầu ra. Nó sẽ đọc và viết chỉ một byte. – Jesper

+0

nếu bạn muốn làm cho nó hoạt động, bạn nên nhập một bộ đệm byte http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read (byte []) –

Trả lời

9

Bạn đang sử dụng phương pháp available() không chính xác. Phương thức này được sử dụng để xác định số lượng byte có sẵn để đọc mà không chặn luồng.

Good Stack Overflow Question about available()

JavaDoc on available()


Cách đúng để kiểm tra xem bạn đã đạt đến EOF là để xem nếu phương pháp read() trở -1:

int data = fileInputStream.read(); 
while (data != -1) { 
    fileOutputStream.write(data); 
    data = fileInputStream.read(); 
} 

Phương pháp này có lẽ là goin g khá chậm nếu bạn cố gắng đọc nhiều dữ liệu hơn.Bạn có thể tăng tốc độ này bằng cách đọc nhiều byte hơn bằng cách sử dụng phương thức read(byte[] b, int off, int len). Vòng lặp sẽ trông khá giống với vòng lặp khác.

byte [] buffer = new byte[1024]; // 1kb buffer 
int numBytesRead = fileInputStream.read(buffer); 
while (numBytesRead != -1) { 
    fileOutputStream.write(buffer, 0, numBytesRead); 
    numBytesRead = fileInputStream.read(buffer); 
} 
+0

'while (-1! = (Data = read())) ghi (dữ liệu);' – ZhongYu

1

quan tâm của tôi về khơi gợi tôi đã viết thử nghiệm nhỏ này:

public static void main(String[] args) throws IOException { 

    FileInputStream fileInputStream = new FileInputStream("/home/nick/foo"); 
    FileOutputStream fileOutputStream = new FileOutputStream("/home/nick/bar"); 
    fileOutputStream.write(fileInputStream.read()); 

    fileOutputStream.flush(); 
    fileOutputStream.close(); 
    fileInputStream.close(); 
} 

Nó làm việc như mong đợi - đọc một byte duy nhất từ ​​/home/nick/foo và viết nó để /home/nick/bar

EDIT:

chương trình Cập nhật:

public static void main(String[] args) throws IOException { 

    FileInputStream fileInputStream = new FileInputStream("/home/nick/foo"); 
    FileOutputStream fileOutputStream = new FileOutputStream("/home/nick/bar"); 
    while (fileInputStream.available()>0) {  
     fileOutputStream.write(fileInputStream.read()); 
    } 

    fileOutputStream.flush(); 
    fileOutputStream.close(); 
    fileInputStream.close(); 
} 

Đã sao chép toàn bộ tệp. (lưu ý - Tôi sẽ không khuyên bạn nên sao chép một tệp một byte tại một thời điểm, sử dụng các lớp đệm I/O để sao chép toàn bộ khối)

Bạn có quên mất flush()close() cho OutputStream không?

+0

Tôi đã cập nhật bài đăng đầu tiên - thougt không quan trọng trong câu hỏi này. Có vòng lặp và có sự khác biệt – Hikaru

+0

nó hoạt động - xem cập nhật – NickJ

+0

Tôi đã kiểm tra nó: có nó sao chép tập tin và một số dữ liệu có thể được đọc từ nó, nhưng nội dung được definetely bị hư hỏng. – Hikaru

1

Có vẻ như vòng lặp while của bạn đang thực hiện ước tính mọi thứ và bỏ qua ở đây và ở đó.

public int available() throws IOException { 
     return 0; 
    } 

Trả ước tính số byte còn lại có thể được đọc (hoặc bỏ qua) từ input stream này mà không ngăn chặn bởi các gọi tiếp theo của một phương pháp để input stream này. Lệnh gọi tiếp theo có thể là cùng một luồng hoặc một chuỗi khác. Một lần đọc hoặc bỏ qua nhiều byte này sẽ không chặn, nhưng có thể đọc hoặc bỏ qua ít byte hơn. Trong một số trường hợp, đọc không chặn (hoặc bỏ qua) có thể bị chặn khi nó chỉ chậm, ví dụ: khi đọc tệp lớn trên các mạng chậm .

See here

+0

Cảm ơn bạn, dường như với tôi đó là những gì xảy ra ở đây. – Hikaru

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