web-dev-qa-db-ja.com

UTF-8 byte []からStringへ

UTF-8でエンコードされたテキストファイルのバイトをバイト配列に読み込むためにBufferedInputStreamを使ったばかりだとしましょう。次のルーチンを使用してバイトを文字列に変換できることはわかっていますが、これを行うには、単にバイトを繰り返し処理して各バイトを変換するよりも効率的でスマートな方法がありますか。

public String openFileToString(byte[] _bytes)
{
    String file_string = "";

    for(int i = 0; i < _bytes.length; i++)
    {
        file_string += (char)_bytes[i];
    }

    return file_string;    
}
232
skeryl

String のコンストラクタを見てください。

String str = new String(bytes, StandardCharsets.UTF_8);

そして怠け者なら、 Apache Commons IO ライブラリを使ってInputStreamを直接Stringに変換することができます。

String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
480
Jason Nichols

JavaのStringクラスには、バイト配列を文字列に変換するための組み込みコンストラクタがあります。

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46};

String value = new String(byteArray, "UTF-8");
39
Kashif Khan

UTF-8データを変換するために、バイトと文字の間の1-1の対応を仮定することはできません。これを試して:

String file_string = new String(bytes, "UTF-8");

(Bah。私はあなたの回答を投稿するボタンを押すのを遅くする方法を見ます。)

ファイル全体を文字列として読み込むには、次のようにします。

public String openFileToString(String fileName) throws IOException
{
    InputStream is = new BufferedInputStream(new FileInputStream(fileName));

    try {
        InputStreamReader rdr = new InputStreamReader(is, "UTF-8");
        StringBuilder contents = new StringBuilder();
        char[] buff = new char[4096];
        int len = rdr.read(buff);
        while (len >= 0) {
            contents.append(buff, 0, len);
        }
        return buff.toString();
    } finally {
        try {
            is.close();
        } catch (Exception e) {
            // log error in closing the file
        }
    }
}
9
Ted Hopp

そのためにはString(byte[] bytes)コンストラクタを使うことができます。詳しくは link をご覧ください。 _ edit _ Javaドキュメントに従って、あなたのplateformのデフォルトの文字セットも考慮する必要があります。

プラットフォームのデフォルトの文字セットを使用して、指定されたバイト配列をデコードすることによって、新しいStringを構築します。新しいStringの長さは文字セットの関数であるため、バイト配列の長さと等しくない可能性があります。指定されたバイトがデフォルトの文字セットで有効でない場合のこのコンストラクタの動作は指定されていません。 CharsetDecoderクラスは、デコード処理をさらに制御する必要がある場合に使用します。

4
GETah

これはバイト単位で読み込んで文字列を作成する単純化された関数です。それはあなたがおそらくファイルがどんなエンコーディングであるか(そしてそうでなければデフォルト)を知っていると仮定します。

static final int BUFF_SIZE = 2048;
static final String DEFAULT_ENCODING = "utf-8";

public static String readFileToString(String filePath, String encoding) throws IOException {

    if (encoding == null || encoding.length() == 0)
        encoding = DEFAULT_ENCODING;

    StringBuffer content = new StringBuffer();

    FileInputStream fis = new FileInputStream(new File(filePath));
    byte[] buffer = new byte[BUFF_SIZE];

    int bytesRead = 0;
    while ((bytesRead = fis.read(buffer)) != -1)
        content.append(new String(buffer, 0, bytesRead, encoding));

    fis.close();        
    return content.toString();
}
2
scottt

あなたがUTF-8バイト配列を扱っていることを知っているなら、きっと文字セット名を受け付ける Stringコンストラクタ を使いたいでしょう。さもなければあなたはあなた自身がいくつかの文字セットエンコーディングベースのセキュリティの脆弱性にさらされたままにするかもしれません。これは UnsupportedEncodingException を投げるので注意してください。このようなもの:

public String openFileToString(String fileName) {
    String file_string;
    try {
        file_string = new String(_bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // this should never happen because "UTF-8" is hard-coded.
        throw new IllegalStateException(e);
    }
    return file_string;
}
2
Asaph

この質問で説明されているメソッドを使用することができます(特にInputStreamから始めるので): InputStreamを読み取り/文字列に変換します

特に、外部ライブラリに頼らないのであれば、 this answer を試してください。 InputStream を介してInputStreamReaderchar[]バッファに読み込み、それをStringBuilderに追加します。

2
Bruno

Stringはbyte []とcharsetnameをパラメータとするコンストラクタを持っています:)

1
soulcheck

探しているものを入手して、バイト配列ではなくファイルから文字列を読み取ってみませんか?何かのようなもの:

BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream( "foo.txt"), Charset.forName( "UTF-8"));

それからそれが終わるまでinからreadLine。

0
digitaljoel

これには反復も含まれますが、文字列は非常にコストがかかるため、連結するよりもはるかに優れています。

public String openFileToString(String fileName)
{
    StringBuilder s = new StringBuilder(_bytes.length);

    for(int i = 0; i < _bytes.length; i++)
    {
        s.append((char)_bytes[i]);
    }

    return s.toString();    
}
0
bragboy

私はこのように使います

String strIn = new String(_bytes, 0, numBytes);

0