Windows和Linux之间的结尾有什么不同?

我正在尝试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

我把它翻译成这些总结的结尾:

  • Windows: '\r\n'
  • Mac(OS 9-): '\r'
  • Mac(OS 10+): '\n'
  • Unix / Linux: '\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 … 🙂