【问题标题】:Do line endings differ between Windows and Linux? [closed]Windows 和 Linux 之间的行尾不同吗? [关闭]
【发布时间】:2010-09-30 09:30:33
【问题描述】:

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

当我将它输入一个不是从 Linux 获得的新文件时,Scanner 会正确解析它。

对于 Linux 中的新行,我有什么不明白的地方吗?

显然,一种解决方法是在不使用扫描仪的情况下对其进行解析,但这并不优雅。有谁知道一种优雅的方法吗?

有没有办法将文件转换为可与Scanner 一起使用的文件?


甚至两天前:Historical reason behind different line ending at different platforms

编辑

原作者注:

“我发现我有一个不同的错误导致了问题。忽略问题”

【问题讨论】:

  • 我发现我有一个不同的错误导致了问题。忽略问题。
  • 您能否记录下真正的问题和解决方案,以确保完整性?添加为问题的编辑(如果您有足够的代表点)

标签: java linux newline


【解决方案1】:

来自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、微软Windows、 塞班操作系统
  • CR:Commodore 机器、Apple II 系列、Mac OS 最高版本 9 和 操作系统-9

我把它翻译成这些行尾in general:

  • 窗口:'\r\n'
  • Mac(操作系统 9-):'\r'
  • Mac(操作系统 10+):'\n'
  • Unix/Linux:'\n'

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

【讨论】:

  • 谢谢你,这确实解释了一些事情,但我发现我有一个不同的错误导致了这个问题。
  • 我发现我在使用 Scanner 时出现了问题。尽管您的回答仍然有助于理解 linux 与 windows。谢谢大家。
  • Mac 还使用 '\r' 吗?
  • @mmeyers:不,从 OS X 开始没有。
  • 我用 Mac 信息更新了表格
【解决方案2】:

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

System.getProperty("line.separator")

【讨论】:

  • 或System.lineSeparator()?
【解决方案3】:

扫描仪在空格处中断。

编辑:'Scanning' Java Tutorial 声明:

默认情况下,扫描仪使用空格来分隔标记。 (空白字符包括空格、制表符和行终止符。有关完整列表,请参阅 Character.isWhitespace 的文档。)

您可以使用 useDelimiter() 方法来更改这些默认值。

【讨论】:

    【解决方案4】:

    这适用于我在 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(); }
      }
    }
    

    【讨论】:

      【解决方案5】:

      为什么不使用LineNumberReader?

      如果你不能这样做,代码是什么样的?

      我能想到的唯一区别是您在错误的正则表达式上进行拆分,并且当您自己编辑文件时,您会得到以某种方式通过您的正则表达式的 dos 换行符。

      不过,对于一次阅读一行内容,使用Scanner 似乎有点过头了。

      当然,为什么要解析/etc/passwd 是其他讨论的一个漏洞:)

      【讨论】:

      • 我正在解析 /etc/passwd 以从 /etc/group 文件中获取用户的关联组名。
      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      相关资源
      最近更新 更多