我正在尝试parsingjava中的linux / etc / passwd文件。 我目前正在通过java中的扫描仪类读取每一行,然后使用string.split()来分隔每一行。
问题是扫描仪将“list:x:38:38:邮件列表pipe理器:/ var / list:/ bin / sh”作为3行不同的处理方式:1)“list:x:38:38:邮件“2)”列表“3)”经理…“当我input一个新的文件,我没有从Linux获得,扫描仪正确parsing它。
有没有什么我不理解在Linux中的新行?
显然一个解决办法是parsing它,而不使用扫描仪,但它不会是优雅的。 有谁知道一个优雅的方式来做到这一点?
有没有办法将文件转换成可以使用扫描仪的文件?
请告诉我。
谢谢,jbu
甚至两天前: 在不同的平台上结束不同的线路的历史原因
编辑
来自原作者的注意事项:
“我发现我有一个不同的错误是造成这个问题。无视问题”
维基百科 :
- LF:Multics,Unix和类Unix系统(GNU / Linux ,AIX,Xenix, Mac OS X ,FreeBSD等),BeOS,Amiga,RISC OS等
- 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
我把它翻译成这些总结的结尾:
'\r\n'
'\r'
'\n'
'\n'
你需要让你的扫描器/解析器也处理unix版本。
您可以通过以下方式获取当前操作系统的标准行结束:
System.getProperty("line.separator")
扫描仪正在打破空间。
编辑 : “扫描”Java教程指出:
默认情况下,扫描程序使用空白区分令牌。 (空白字符包括空格,制表符和行结束符。有关完整列表,请参阅Character.isWhitespace的文档。
您可以使用useDelimiter()方法更改这些默认值。
这在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(); } } }
你是否尝试删除所有隐藏的字符,但'\ n'。 你用来分割线的正则表达式是什么?
为什么不使用LineNumberReader
?
如果你不能这样做,代码是什么样的?
唯一的区别是我可以想到的是,你正在分裂一个坏的正则表达式,当你自己编辑文件,你得到DOS换行符,以某种方式传递你的正则表达式。
但是,一次只读一行,看起来像使用Scanner
矫枉过正。
当然,你为什么要解析/etc/passwd
是其他的讨论:)
现在我记得为什么我在这些场合使用BufferedReader … 🙂