2016-12-06 108 views
-2

我有問題試圖找出緩衝輸入流。我們不得不用Java創建一個文本編輯器程序。我舉幾個例子作爲指導,但還沒有弄清楚。根據我的理解,我已經爲閱讀循環做好了準備,然後它應該將整個文件讀入編輯器。我已經將讀取類型化爲字符,然後使用.toString將其設置爲字符串。現在它編譯,但凍結程序,所以我必須有一個無限循環,但我不確定爲什麼。Java緩衝輸入流不能讀取

 //File open 
    openItem.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     JFileChooser jfc = new JFileChooser(); 
     jfc.setCurrentDirectory(new File(".")); 
     int result = jfc.showOpenDialog(null); 
     if (result == JFileChooser.APPROVE_OPTION) 
      { 
      File selectedFile = jfc.getSelectedFile(); 
      BufferedInputStream bis = null; 
      try 
      { 
       bis = new BufferedInputStream(new FileInputStream(selectedFile)); 
       char inChar = (char)bis.read(); 
       while(inChar != -1) 
       { 
       //inChar = (char)bis.read(); 
       String charToString = Character.toString(inChar); 
       textArea.setText(charToString); 
       } 
      } 
      catch (Exception e2) 
      { 
       e2.printStackTrace(); 
      } 
      } 
     } 
    }); 
+0

您正在通過char讀取文件char,每次循環覆蓋該字段的內容。 –

+2

@MattClark考慮到讀取循環內部字符的行被註釋掉了,文件並沒有被讀取,所有的 – BackSlash

+0

你都是正確的。 'String string =「」; while((inChar =(char)bis.read())!= -1){string + = inChar;} System.out.println(string);' –

回答

2

這裏有幾個問題。

問題1BufferedInputStream#read()讀取字節,而不是字符。它會產生對ASCII碼流「工作」的結果,但會對其他多字節編碼(如UTF-8)失敗。

問題2char值在Java中是無符號的,所以表達式inChar != -1將始終爲真。我認爲這是導致您的應用程序凍結的原因。

問題3:使用後沒有關閉文件。

由於作爲String讀取文件內容的一般操作可能在代碼中的其他地方是有用的,因此可能需要考慮作爲單獨的方法實現此功能。

如果您想維護當前結構,則類似以下的代碼應該可以工作,但仍然存在問題1

public static String readFileAsString(File inputFile) throws IOException { 
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile))) { 
    StringBuilder sb = new StringBuilder(); 
    for (int in = bis.read(); in != -1; in = bis.read()) { 
     sb.append((char)in); 
    } 
    return sb.toString(); 
    } 
} 

有更簡單的方法來讀取整個文件與Java中的String。 Java8的一種可能性是這樣的:

public static String readFileAsString(File inputFile) throws IOException { 
    return new String(Files.readAllBytes(inputFile.toPath())); 
} 

它使用默認字符集將字節轉換爲字符。

+0

或'new String(readbytes_result,StandardCharsets.ISO_8859_1)''可靠地給出了與cast-int-containing-byte-to-char方法相同的轉換 - 正如你注意到的那樣,可能是也可能不是所需的轉換。 –