如何检查行尾是否是 \n 或 \r 或 JAVA 中的 \r\n
How to check if on the end of line is \n or \r or \r\n in JAVA
我需要检查文件中的每个字符并将其转换为字节。但不幸的是,扫描仪没有提供任何不拆分行的最后一个字符的可能性......
我尝试做这样的事情:
Scanner in = new Scanner(new File(path));
List<Byte> byteList = new ArrayList<>();
while (in.hasNextLine()) {
String a = in.nextLine();
if (in.hasNextLine()) {
a = a + (char) (13);
}
for (char c : a.toCharArray()) {
byteList.add((byte) c);
}
}
byte[] bytes = new byte[byteList.size()];
for (int i = 0; i < byteList.size(); i++) {
bytes[i] = byteList.get(i);
}
return bytes;
}
您对解决这个问题有什么想法吗?
我会很感激你的帮助。
您不能使用 Scanner.readLine()
或 BufferedReader.readLine()
执行此操作,因为这两个 API 都使用行分隔符。
你可以想象使用 Scanner.next()
和自定义分隔符正则表达式来实现它,这会导致行分隔符包含在标记中。 (提示:使用后视。)
但是对于您在代码中实际执行的操作,FileInputStream
或 FileReader
会更好。
这让我想到了另一件事。
这段代码应该做什么?
它实际上做的是通过丢弃最高位将 Unicode 代码单元转换为字节。如果输入字符集是 ASCII 或(可能)LATIN-1,这可能有意义。但除此之外,它可能会破坏文本。
如果您尝试以(原始)字节读取文件,只需使用 FileInputStream
+ BufferedInputStream
。然后直接读取/处理字节。行终止符不需要任何特殊处理。
如果您尝试将文件读取为某些字符集中的编码字符,并将其音译为另一个字符集(例如 ASCII)。您应该写信给 FileWriter
+ BufferedWriter
。再一次,行分隔符/终止符将被保留......你可以根据需要“规范化”它们。
如果您正在做其他事情...嗯,这可能不是正确的做法。 List<Byte>
将变得低效且难以转换为其他 Java API 可以直接处理的内容。
以单个字符串形式读取整个文件,包括所有行结尾:
String fileStr = in.useDelimiter("\A").next();
正则表达式 \A
匹配输入的开始,这是从未遇到过的,因此 整个 输入流从 next()
.[=16= 返回]
如果您的情况需要将所有行结尾更正为特定行结尾,无论文件包含什么,请执行以下操作:
fileStr = fileStr.replaceAll("\R", "\n");
正则表达式 \R
匹配所有类型的行结尾。
当然这一切都可以作为 1 行来完成:
String fileStr = in.useDelimiter("\A").next().replaceAll("\R", "\n");
我需要检查文件中的每个字符并将其转换为字节。但不幸的是,扫描仪没有提供任何不拆分行的最后一个字符的可能性...... 我尝试做这样的事情:
Scanner in = new Scanner(new File(path));
List<Byte> byteList = new ArrayList<>();
while (in.hasNextLine()) {
String a = in.nextLine();
if (in.hasNextLine()) {
a = a + (char) (13);
}
for (char c : a.toCharArray()) {
byteList.add((byte) c);
}
}
byte[] bytes = new byte[byteList.size()];
for (int i = 0; i < byteList.size(); i++) {
bytes[i] = byteList.get(i);
}
return bytes;
}
您对解决这个问题有什么想法吗? 我会很感激你的帮助。
您不能使用 Scanner.readLine()
或 BufferedReader.readLine()
执行此操作,因为这两个 API 都使用行分隔符。
你可以想象使用 Scanner.next()
和自定义分隔符正则表达式来实现它,这会导致行分隔符包含在标记中。 (提示:使用后视。)
但是对于您在代码中实际执行的操作,FileInputStream
或 FileReader
会更好。
这让我想到了另一件事。
这段代码应该做什么?
它实际上做的是通过丢弃最高位将 Unicode 代码单元转换为字节。如果输入字符集是 ASCII 或(可能)LATIN-1,这可能有意义。但除此之外,它可能会破坏文本。
如果您尝试以(原始)字节读取文件,只需使用
FileInputStream
+BufferedInputStream
。然后直接读取/处理字节。行终止符不需要任何特殊处理。如果您尝试将文件读取为某些字符集中的编码字符,并将其音译为另一个字符集(例如 ASCII)。您应该写信给
FileWriter
+BufferedWriter
。再一次,行分隔符/终止符将被保留......你可以根据需要“规范化”它们。如果您正在做其他事情...嗯,这可能不是正确的做法。
List<Byte>
将变得低效且难以转换为其他 Java API 可以直接处理的内容。
以单个字符串形式读取整个文件,包括所有行结尾:
String fileStr = in.useDelimiter("\A").next();
正则表达式 \A
匹配输入的开始,这是从未遇到过的,因此 整个 输入流从 next()
.[=16= 返回]
如果您的情况需要将所有行结尾更正为特定行结尾,无论文件包含什么,请执行以下操作:
fileStr = fileStr.replaceAll("\R", "\n");
正则表达式 \R
匹配所有类型的行结尾。
当然这一切都可以作为 1 行来完成:
String fileStr = in.useDelimiter("\A").next().replaceAll("\R", "\n");