27

我正在尝试/etc/passwd用 Java 解析 Linux 文件。我目前正在通过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


甚至两天前:不同平台结束不同线路背后的历史原因

编辑

原作者注:

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

4

5 回答 5

57

来自维基百科

  • 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'
  • Mac(操作系统 9-):'\r'
  • Mac(操作系统 10+):'\n'
  • Unix/Linux:'\n'

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

于 2009-01-08T23:04:20.847 回答
11

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

System.getProperty("line.separator")
于 2009-01-09T02:57:51.750 回答
4

扫描仪在空间处断裂。

编辑“扫描”Java 教程指出:

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

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

于 2009-01-08T23:16:22.383 回答
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(); }
  }
}
于 2009-01-08T23:23:00.077 回答
0

为什么不使用LineNumberReader

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

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

尽管如此,对于一次阅读一行内容,使用Scanner.

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

于 2009-01-08T23:06:48.207 回答