Java 从文本文件读取时,如何维护下线字符?
BufferedReader.readLine()会自动删除下线字符,我不能简单地执行readLine()操作,然后在其末尾加上“\r”。我试过了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
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
时会发生什么,可能会崩溃或使用系统默认值。