2013-10-19 51 views
1

我剛開始使用java中的I/O,請原諒我的懷疑是否愚蠢,但我覺得難以理解這段代碼是如何工作的? 下面代碼中的變量c不會遞增,即使輸入流中只有一個字符,while循環也不會終止,並且輸出流只會連續填充一個字符,但此代碼實際上工作正常,我不明白爲什麼?這段代碼如何工作?

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

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

    FileInputStream in = null; 
    FileOutputStream out = null; 

    try { 
     in = new FileInputStream("xanadu.txt"); 
     out = new FileOutputStream("outagain.txt"); 
     int c; 

     while ((c = in.read()) != -1) { 
      out.write(c); 
     } 
    } finally { 
     if (in != null) { 
      in.close(); 
     } 
     if (out != null) { 
      out.close(); 
     } 
    } 
} 
} 
+0

你有和我一樣的懷疑嗎? :) [如何緩衝區字節數組連續填充時,流?](http://stackoverflow.com/questions/18105971/how-the-buffer-byte-array-is-continuously-filling-while-streaming) –

回答

2

in.read()方法一次讀取一個字符。每次迭代one character被讀取並分配給c。

考慮以下字符出現在xanadu.txt文件中。

"ABCDE-1" 

注:-1文件結束的含義(-1添加用於說明目的僅)

在第一次迭代中

c=Awhile-> A!=-1然後真。然後繼續while循環並將c='A'保存爲outagain.txt文件。

在第二次迭代

c=Bwhile -> B!=-1則爲true。然後繼續while循環並將c='B'保存爲outagain.txt文件。

在第三次迭代

c=Cwhile -> C!=-1則爲true。然後繼續while循環並將c='C'保存到outagain.txt文件。

在第四次迭代

c=Dwhile -> D!=-1則爲true。然後繼續while循環並將c='D'保存爲outagain.txt文件。

在第五次迭代

c=Ewhile -> E!=-1則爲true。然後繼續while循環並將c='E'保存到outagain.txt文件。

在第六次迭代

c=-1while -> -1!=-1那麼假。然後退出while循環

4

從Java API:「FileInputStream從文件系統中的文件中獲取輸入字節哪些文件可用取決於主機環境。」

您的字符c正被用於從流中「讀取」字節,當沒有更多的字節留下來讀取read()方法時返回-1,這將打破循環。

這就是

((c = in.read()) != -1) 

手段,一直讀到值爲-1。

+0

爲什麼這裏的變量是int嗎?它也可以是一個字節? –

+0

由於指定了read方法,即返回一個int:public int read()throws IOException – pedromss

+0

不,我的意思是,他們爲什麼首先選擇int?我只是好奇.. –

2

當您使用read()方法時,實際上您每次都移動您正在閱讀的位置,直到到達文件末尾。所以這就是它的原因。

0

如果函數read來自FileInputStream對象,則返回數據的下一個字節,如果達到文件結尾,則返回-1。 (它實際上返回一個int

來源:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read%28%29

在你的循環,你正在做的:c = in.read()直到c等於-1。所以,在每次迭代中,c都包含下一個字節。 read在做增量本身。