[java] UTF-8 바이트 []에서 문자열로

BufferedInputStreamUTF-8로 인코딩 된 텍스트 파일의 바이트를 바이트 배열로 읽는 데 방금 사용했다고 가정 해 봅시다 . 다음 루틴을 사용하여 바이트를 문자열로 변환 할 수 있지만 바이트를 반복하고 각 바이트를 변환하는 것보다 더 효율적이고 똑똑한 방법이 있습니까?

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

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

    return file_string;    
}



답변

String 의 생성자를보십시오

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

그리고 게으른 느낌이 든다면 Apache Commons IO 라이브러리를 사용하여 InputStream을 String으로 직접 변환 할 수 있습니다.

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


답변

Java String 클래스에는 바이트 배열을 문자열로 변환하기위한 내장 생성자가 있습니다.

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

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


답변

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
        }
    }
}


답변

이를 위해 String(byte[] bytes) 생성자를 사용할 수 있습니다 . 자세한 내용은이 링크 를 참조하십시오.
편집 또한 Java doc에 따라 plateform의 기본 문자 세트를 고려해야합니다.

플랫폼의 기본 문자셋을 사용하여 지정된 바이트 배열을 디코딩하여 새 문자열을 구성합니다. 새 문자열의 길이는 문자 집합의 함수이므로 바이트 배열의 길이와 같지 않을 수 있습니다. 지정된 바이트가 디폴트 캐릭터 세트로 유효하지 않은 경우의이 생성자 동작은 지정되지 않습니다. 디코딩 프로세스에 대한 추가 제어가 필요한 경우 CharsetDecoder 클래스를 사용해야합니다.


답변

이 질문에 설명 된 방법을 사용할 수 있습니다 (특히 InputStream으로 시작한 이후) : InputStream을 문자열로 읽기 / 변환

특히 외부 라이브러리에 의존하지 않으려면 via 를 버퍼 로 읽어서에 추가하는 this answer을 시도해보십시오 .InputStreamInputStreamReaderchar[]StringBuilder


답변

UTF-8 바이트 배열을 처리한다는 것을 알고 있으므로 charset name을 허용하는 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;
}


답변

다음은 바이트 단위로 읽고 문자열을 만드는 단순화 된 함수입니다. 파일의 인코딩이 무엇인지 이미 알고 있다고 가정합니다 (그렇지 않으면 기본값).

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();
}