BufferedInputStream
UTF-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을 시도해보십시오 .InputStream
InputStreamReader
char[]
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();
}