Windows和Linux之间的行结尾是否不同?

时间:2009-01-08 23:00:56

标签: java linux newline

我正在尝试用Java解析Linux /etc/passwd文件。我目前正在通过java.util.Scanner课程阅读每一行,然后使用java.lang.String.split(String)分隔每一行。

问题是该行:

list:x:38:38:Mailing List Manager:/var/list:/bin/sh" 

被扫描仪视为3个不同的行:

  1. list:x:38:38:Mailing
  2. List
  3. Manager...
  4. 当我输入一个我没有从Linux获得的新文件时,Scanner正确解析它。

    我是否对Linux中的新行没有了解?

    显然,解决方法是不使用扫描仪来解析它,但它不会很优雅。有谁知道这样做的优雅方式?

    有没有办法将文件转换为适用于Scanner的文件?


    两天前都没有:Historical reason behind different line ending at different platforms

    修改

    原作者的注意事项:

      

    “我发现我有一个不同的错误导致问题。无视问题”

7 个答案:

答案 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

  • Windows:'\r\n'
  • Mac(OS 9 - ):'\r'
  • Mac(OS 10+):'\n'
  • Unix / Linux:'\n'

您还需要让扫描仪/解析器处理unix版本。

答案 1 :(得分:10)

您可以从以下位置获取当前操作系统的标准行:

System.getProperty("line.separator")

答案 2 :(得分:4)

扫描仪在空间处断裂。

编辑'Scanning' Java Tutorial州:

默认情况下,扫描程序使用空格分隔令牌。 (空格字符包括空格,制表符和行终止符。有关完整列表,请参阅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 ......: - )