我正在尝试用Java解析Linux /etc/passwd
文件。我目前正在通过java.util.Scanner
课程阅读每一行,然后使用java.lang.String.split(String)
分隔每一行。
问题是该行:
list:x:38:38:Mailing List Manager:/var/list:/bin/sh"
被扫描仪视为3个不同的行:
list:x:38:38:Mailing
List
Manager...
当我输入一个我没有从Linux获得的新文件时,Scanner
正确解析它。
我是否对Linux中的新行没有了解?
显然,解决方法是不使用扫描仪来解析它,但它不会很优雅。有谁知道这样做的优雅方式?
有没有办法将文件转换为适用于Scanner
的文件?
两天前都没有:Historical reason behind different line ending at different platforms
修改
原作者的注意事项:
“我发现我有一个不同的错误导致问题。无视问题”
答案 0 :(得分:46)
来自Wikipedia:
- LF:Multics,Unix和类Unix系统(GNU / Linux ,AIX,Xenix, Mac OS X ,FreeBSD等),BeOS,Amiga,RISC 操作系统和其他
- CR + LF:DEC RT-11和大多数其他早期非Unix,非IBM操作系统,CP / M, MP / M, DOS ,OS / 2,Microsoft Windows , Symbian OS
- CR:Commodore机器,Apple II系列, Mac OS高达版本9 和 OS-9
我将此转换为这些行结尾in general:
'\r\n'
'\r'
'\n'
'\n'
您还需要让扫描仪/解析器处理unix版本。
答案 1 :(得分:10)
您可以从以下位置获取当前操作系统的标准行:
System.getProperty("line.separator")
答案 2 :(得分:4)
扫描仪在空间处断裂。
默认情况下,扫描程序使用空格分隔令牌。 (空格字符包括空格,制表符和行终止符。有关完整列表,请参阅Character.isWhitespace的文档。)
您可以使用useDelimiter()方法更改这些默认值。
答案 3 :(得分:1)
这适用于Ubuntu
import java.util.Scanner;
import java.io.File;
public class test {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(new File("/etc/passwd"));
String l;
while( ( l = sc.nextLine() ) != null ) {
String[] p = l.split(":");
for(String pi: p) System.out.print( pi + "\t:\t" );
System.out.println();
}
} catch(Exception e) { e.printStackTrace(); }
}
}
答案 4 :(得分:0)
您是否尝试删除所有隐藏字符,但'\ n'。你用来分割线的正则表达式是什么?
答案 5 :(得分:0)
为什么不使用LineNumberReader
?
如果你不能这样做,那么代码是什么样的?
我能想到的唯一区别是你正在分裂一个糟糕的正则表达式,并且当你自己编辑文件时,你得到的dos换行符会以某种方式通过你的正则表达式。
尽管如此,一次只读一行,使用Scanner
似乎有点过分。
当然,为什么要解析/etc/passwd
是另一个讨论的漏洞:)
答案 6 :(得分:0)
现在我记得为什么我在这些场合使用BufferedReader ......: - )