2016-12-06 15 views
-2

バッファ付き入力ストリームを把握しようとするときに問題が発生しています。 Javaでテキストエディタプログラムを作成する必要があります。私は授業のいくつかの例をガイドラインとして持っていますが、まだそれを理解することはできませんでした。私の理解から、私はループを読み込みで準備した後、ファイル全体をエディタに読み込む必要があります。私は読み込んだ文字をchar型としてキャストし、それを.toStringを使って文字列に設定しました。今はコンパイルされますが、プログラムはフリーズしますので、無限ループが必要ですが、理由はわかりません。Javaのバッファ付き入力ストリームが読み込みされない

+0

charでcharファイルを読み込み、すべてのループの内容を上書きします。 –

+2

@MattClarkループ内でcharを読み取る行がコメントアウトされていることを考慮して、ファイルはすべて – BackSlash

+0

で読み込まれていません。 'String string =" ";そのロジックを適用した後も、プログラムを実行するとまだフリーズしています((inChar =(char)bis.read())!= -1){string + = inChar;} System.out.println(string); ' –

答えて

2

ここにはいくつかの問題があります。

問題1BufferedInputStream#read()は、文字ではなくバイトを読み取ります。これは、ASCIIストリームのために "機能する"結果を生成しますが、UTF-8のような他のマルチバイトエンコーディングでは失敗します。

問題2char値は、Javaで符号なしなので、表現inChar != -1は常にtrueになります。私はこれがあなたのアプリケーションを凍結させていると思います。

問題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の可能性の1つは、次のようなものです。

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アプローチと同じ変換を確実に行います。 –

関連する問題