从文本文件中读取时如何维护EOL字符?

时间:2016-05-06 18:38:37

标签: java io

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字符

1 个答案:

答案 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")