0

次の静的な方法を取ります。

public static String fileToString(String filename) throws Exception {
        FileInputStream fis = new FileInputStream(filename);
        byte[] buffer = new byte[8192];
        StringBuffer sb = new StringBuffer();   
        int bytesRead; // unused? weird compiler messages...
        while((bytesRead = fis.read(buffer)) != -1) { // InputStream.read() returns -1 at EOF
            sb.append(new String(buffer));
        }
        return new String(sb);
    } 

ご覧のとおり、すべて問題なく表示され、小さなテキストファイルに最適です。しかし、数千行の大きなファイルに到達すると、テキストの繰り返しで問題が発生します。byte[] buffer私の直感からすると、いわば「汚れた」と思いました。そこで、メソッドに次の行を追加しました。

buffer = new byte[8192];

これで、次のようになります。

public static String fileToString(String filename) throws Exception {
    FileInputStream fis = new FileInputStream(filename);
    byte[] buffer = new byte[8192];
    StringBuffer sb = new StringBuffer();   
    int bytesRead; // unused? weird compiler messages...
    while((bytesRead = fis.read(buffer)) != -1) { // InputStream.read() returns -1 at EOF
        sb.append(new String(buffer));
        buffer = new byte[8192]; // added new line here
    }
    return new String(sb);
} 

そして、静的メソッドが返す文字列の最後で、多くのヌル文字を取得するという事実を除いて、それは完璧です(バッファサイズによって異なります)。何が起きてる?

4

3 に答える 3

1

実際に:// unused? weird compiler messages...

変ではありません。あなたはこれを決して読んだことがありません。

sb.append(new String(buffer));バッファに書き込まれたバイト数をどのように知ることができますか。

まさに、これがbytesReadの出番です。

だからあなたは必要ですnew String(bytes, offset, length)

public static String fileToString(String filename) throws Exception {
    FileInputStream fis = new FileInputStream(filename);
    byte[] buffer = new byte[8192];
    StringBuffer sb = new StringBuffer();   
    int bytesRead; // unused? weird compiler messages...
    while((bytesRead = fis.read(buffer)) != -1) { // InputStream.read() returns -1 at EOF
        sb.append(new String(buffer,0,bytesRead));
        buffer = new byte[8192];
        bytesRead=0;
    }
    return new String(sb);
} 

うまくいくかもしれない

于 2013-02-18T02:00:29.977 に答える
1

実際には、バイトを読み取ったり、生のバイトから文字列を作成したりするべきではありません。これは、テキストのエンコーディングを完全に無視するため、間違っています。あなたは幸運でASCIIを読んでいるかもしれませんが、その場合はうまくいくでしょう。他のすべての場合、これは問題を引き起こしています。

ソースInputStreamをラップするInputStreamReaderをラップするBufferedReaderを実際に使用する必要があります。

于 2013-02-18T02:04:38.777 に答える
1

車輪の再発明はしないでください。学校の宿題をしていない場合は、ApachecommonsIOなどの既存のライブラリを使用してくださいhttp://commons.apache.org/io/apidocs/org/apache/commons/io/IOUtils.html#toString%28java.io.InputStream,%20java.nio.charset.Charset%29

たとえば、次のように数行でファイルを文字列に読み込むことができます。

public static String fileToString(String filepath) throws Exception {
     return IOUtils.toString(new FileInputStream(filepath), "utf-8");
}

これにより、多くの手書きのカスタムコードからあなたを救い、おそらくバグがはるかに少なくなります。

于 2013-02-18T02:24:46.517 に答える