BufferedReader.readLine()自动删除EOL字符,我不能简单地执行readLine()然后在它的末尾添加“\ r”。我试过了
InputStream myFile = new FileInputStream("C:\\test.txt");
StringBuilder sb = new StringBuilder();
int i;
while((i = myFile.read()) != -1)
{
char ch = (char) i;
sb.append(ch);
}
System.out.println(sb);
但是“char ch =(char)i”丢失了字节数据,因为ints是4个字节,而chars是2个字节。
我再说一遍,我不能做像
这样的事情sb.append(ch+"\r");
因为此通用代码将读取的某些文件将包含CR,而其他文件则不会。
从java.nio。*开始,Files.readAllBytes(路径路径)似乎是一个选项。但是我不熟悉它并且无法判断它是否以Javadoc为基础返回EOL字符
答案 0 :(得分:3)
理想情况下,您不要触摸字节。 E.g。
public static String fromFile(File file, Charset charset) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset))) {
StringWriter out = new StringWriter();
char[] cbuf = new char[8192];
int read;
while ((read = reader.read(cbuf)) != -1) {
out.write(cbuf, 0, read);
}
return out.toString();
}
}
将所有内容直接转换为单个String
。将byte
转换为char
确实很危险,除非您知道它只是ascii,否则您不应该自己尝试这样做。让内置的字符集做到这一点。它已经足够难以使用正确的了。
Files.readAllBytes()
会返回EOL字符,因为它适用于字节,并不会尝试解释这些字节的含义。
public static String fromPath(Path path, Charset charset) throws IOException {
byte[] bytes = Files.readAllBytes(path);
return new String(bytes, 0, bytes.length, charset);
}
是使用nio方法的等价物。使用Paths.get("myfile.txt")
拨打,而不是使用new File("myfile.txt")
。