2012-12-11 84 views
2

我嘗試通過字符讀取文件字符。不幸的是,在從文件中讀取字符時,Java忽略EOF。Java在讀取文件中的字符時忽略EOF

FileReader fileReader = new FileReader(fileText); 
char c; 
String word = ""; 
List<String> words = new ArrayList<String>(); 

while ((c = (char) fileReader.read()) != -1) { 
    System.out.println(c); 
    if (c != ' ') { 
     word = word + c; 
    } 
    else { 
     words.add(word + " "); 
     word = ""; 
    } 
} 

應該分手的讀取完畢後,而是它永遠不會停止運行....

+0

的BufferedReader從磁盤讀取的次數更少,從而加快了一點。即使你一個接一個地循環字符。 – ignis

+1

檢查'=='\ uFFFF'' – irreputable

+0

@irreputable這是正確的答案。您應該將其作爲答案發布。 [原始縮小轉換](http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3):'int'到'c​​har'轉換完全丟棄16個低位。 Java以2的補碼錶示數字。並且-1的2的補碼是11111 ...當你比較c == -1時,你正在擴展char到int的轉換,然後你比較整數;即「零擴展char值的表示以填充更寬的格式」,即將先前丟失的1替換爲0。因此你得到錯誤。 – ignis

回答

8

在Java中,char沒有符號,不能等於-1。在演員演出之前,你應該做比較。

int ch; 
while ((ch = fileReader.read()) != -1) { 
    char c = (char)ch; 
    System.out.println(c); 
    ... 
} 
4

這是因爲char不能等於-1,即使你分配-1它:

char c = (char)-1; 
System.out.println(c == -1); // prints false 

cint,並把它轉換到char只有當您連接:

word = word + (char)c; 

更好的是,使用StringBuilder在運行時創建字符串:否則,您會在循環中創建大量臨時字符串對象,並且這些對象會被丟棄。

StringBuilder word = new StringBuilder(); 
List<String> words = new ArrayList<String>(); 
int c; 
while ((c = fileReader.read()) != -1) { 
    System.out.println((char)c); 
    word.append((char)c); 
    if (c == ' ') { 
     words.add(word.toString()); 
     word = new StringBuilder(); 
    } 
} 
2

你應該試試下面的代碼

public static void main(String[] args) throws IOException { 
    FileReader fileReader = new FileReader(fileLocation); 
    int c; 
    String word = ""; 
    List<String> words = new ArrayList<String>(); 

    while ((c = (int) fileReader.read()) != -1) { 
     System.out.println((char)c); 
     char ch = (char)c; 
     if (ch != ' ') { 
      word = word + ch; 
     } else { 
      words.add(word + " "); 
      word = ""; 
     } 
    } 
    System.out.println(word); 
} 
+0

我想你需要將'c '加到'char',然後再加到'word',否則它會連接'c'中存儲的字符串的字符串版本。 – jonhopkins

+0

@jonhopkins感謝您的建議,根據您的建議更新我的文章。你是對的。 –

相關問題