Java 从文本文件读取时,如何维护下线字符?

Java 从文本文件读取时,如何维护下线字符?,java,io,Java,Io,BufferedReader.readLine()会自动删除下线字符,我不能简单地执行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.app

BufferedReader.readLine()会自动删除下线字符,我不能简单地执行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”会丢失字节数据,因为int是4字节,而char是2字节

我重复一遍,我不能做这样的事情

sb.append(ch+"\r");
因为此通用代码将读取的某些文件将包含CR,而其他文件将不包含CR


在java.nio.*中,Files.readAllBytes(路径)似乎是一个选项。但是我对它不熟悉,无法判断它是否返回EOL字符,或者是否基于Javadoc,理想情况下,您不需要接触字节。例如

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();
    }
}
将所有内容直接转换为单个
字符串
。将
字节
转换为
字符
确实很危险,除非您知道这只是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方法的等效方法。使用
path.get(“myfile.txt”)
调用,而不是使用
new File(“myfile.txt”)

调用。理想情况下,您不需要触摸字节。例如

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();
    }
}
将所有内容直接转换为单个
字符串
。将
字节
转换为
字符
确实很危险,除非您知道这只是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方法的等效方法。使用
path.get(“myfile.txt”)
调用,而不是使用
new File(“myfile.txt”)

调用。听起来您只是在尝试将文本文件读入字符串。如果是这样,请参见如果您对由行分隔的内容不感兴趣,是否有理由使用
readLine()
?Files.lines(path.get(“C:\\test.txt”)).forEach(System.out::println);或字符串内容=新字符串(Files.readAllBytes(path.get(“C:\\test.txt”));在这种情况下,从字节到字符的转换不会丢失字符信息。如果值为-1表示EOS,则类型仅不是字符。在经典MacOS上,文本文件行分隔符是
\r
,可能还有其他系统使用该约定,但在Windows上是
\r\n
,在所有Unix上是
\n
,包括OSX。听起来你只是想把一个文本文件读入一个字符串。如果是这样,请参见如果您对由行分隔的内容不感兴趣,是否有理由使用
readLine()
?Files.lines(path.get(“C:\\test.txt”)).forEach(System.out::println);或字符串内容=新字符串(Files.readAllBytes(path.get(“C:\\test.txt”));在这种情况下,从字节到字符的转换不会丢失字符信息。如果值为-1表示EOS,则类型仅不是字符。在经典MacOS上,文本文件行分隔符是
\r
,可能还有其他系统使用该约定,但在Windows上是
\r\n
,在所有Unix上是
\n
,包括OS X.Nots.toString()删除下线字符?@j.seashell否-所有换行符仍然存在,只有那些
readline()
方法可以这样做。您可能需要注意,这将使用系统默认的字符集,因此可能不适用于非ASCII字符。@jinkead两个版本都有显式的字符集,不确定传递
null
时会发生什么情况,但可能会崩溃或使用系统默认值。是否.toString()会去除下线字符?@j.seashell否-所有换行符仍然存在,只有那些
readline()
方法会这样做。您可能需要注意,这将对字符集使用系统默认值,因此可能不适用于非ASCII字符。@jkinkead两个版本都有显式字符集,但不确定传递
null
时会发生什么,可能会崩溃或使用系统默认值。