当我将编码设置为 UTF-16 时,为什么 FileInputStream readline returns null?
Why FileInputStream readline returns null when I set encoding to UTF-16?
它与 UTF-8
一起工作正常,如果我使用不同的文件,它也与 UTF-16
一起工作。
BufferedReader br = new BufferedReader(new InputStreamReader(new
FileInputStream(filePath), "UTF-16"));
如果我在上面的代码中将 UTF-16
替换为 UTF-8
,一切都会按预期进行,这是为什么?
建议的答案不同,因为我只需要阅读文件。答案很简单,如果文件是 UTF-8,我无法读取 UTF-16。
检查文件的编码。 UTF-16 可以使用 Big Endian (UTF-16BE) 或 Little Endian (UTF-16LE) 进行编码。这些是不同的。
此代码适用于同一文件的四个变体。
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class SOPlayground {
public static void main(String[] args) throws Exception {
readAndPrint("/tmp/u-8.txt", Charset.forName("UTF-8"));
readAndPrint("/tmp/u-16.txt", Charset.forName("UTF-16"));
readAndPrint("/tmp/u-16le.txt", Charset.forName("UTF-16LE"));
readAndPrint("/tmp/u-16be.txt", Charset.forName("UTF-16BE"));
}
private static void readAndPrint(String filePath, final Charset charset) throws IOException, FileNotFoundException {
final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charset));
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
}
}
}
在 GNU/Linux 上,您可以使用 file
工具检查编码:
/tmp % file u*.txt
u-16be.txt: data
u-16le.txt: data
u-16.txt: Little-endian UTF-16 Unicode text, with no line terminators
u-8.txt: UTF-8 Unicode text
这些文件的内容都不一样:
/tmp % cat u*.txt
����
����
������
üäöü
但是使用上面的Java代码,是可以正确读取的。我的 Java 代码的输出是:
üäöü
üäöü
üäöü
üäöü
它与 UTF-8
一起工作正常,如果我使用不同的文件,它也与 UTF-16
一起工作。
BufferedReader br = new BufferedReader(new InputStreamReader(new
FileInputStream(filePath), "UTF-16"));
如果我在上面的代码中将 UTF-16
替换为 UTF-8
,一切都会按预期进行,这是为什么?
建议的答案不同,因为我只需要阅读文件。答案很简单,如果文件是 UTF-8,我无法读取 UTF-16。
检查文件的编码。 UTF-16 可以使用 Big Endian (UTF-16BE) 或 Little Endian (UTF-16LE) 进行编码。这些是不同的。
此代码适用于同一文件的四个变体。
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class SOPlayground {
public static void main(String[] args) throws Exception {
readAndPrint("/tmp/u-8.txt", Charset.forName("UTF-8"));
readAndPrint("/tmp/u-16.txt", Charset.forName("UTF-16"));
readAndPrint("/tmp/u-16le.txt", Charset.forName("UTF-16LE"));
readAndPrint("/tmp/u-16be.txt", Charset.forName("UTF-16BE"));
}
private static void readAndPrint(String filePath, final Charset charset) throws IOException, FileNotFoundException {
final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charset));
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
}
}
}
在 GNU/Linux 上,您可以使用 file
工具检查编码:
/tmp % file u*.txt
u-16be.txt: data
u-16le.txt: data
u-16.txt: Little-endian UTF-16 Unicode text, with no line terminators
u-8.txt: UTF-8 Unicode text
这些文件的内容都不一样:
/tmp % cat u*.txt
����
����
������
üäöü
但是使用上面的Java代码,是可以正确读取的。我的 Java 代码的输出是:
üäöü
üäöü
üäöü
üäöü