Windows 和 Linux 之间的行尾是否不同?[关闭]
- 2024-10-23 08:47:00
- admin 原创
- 62
问题描述:
我正在尝试/etc/passwd
用 Java 解析 Linux 文件。我目前正在通过java.util.Scanner
类读取每一行,然后用它java.lang.String.split(String)
来分隔每一行。
问题在于这一行:
list:x:38:38:Mailing List Manager:/var/list:/bin/sh"
被扫描仪视为 3 条不同的线:
list:x:38:38:Mailing
List
Manager...
当我将其输入到一个不是从 Linux 获取的新文件中时,Scanner
可以正确地解析它。
我对 Linux 中的新行有什么不明白吗?
显然,一种解决方法是不使用扫描仪来解析它,但这不太优雅。有人知道一种优雅的方法来做到这一点吗?
有没有办法将该文件转换为可以使用的文件Scanner
?
还不到两天前:不同线路在不同站台结束的历史原因
编辑
原作者注:
“我发现是另一个错误导致了这个问题。忽略问题”
解决方案 1:
来自维基百科:
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
我一般将其翻译成以下行尾:
视窗:`'
'`Mac(OS 9-):`'
'`Mac(OS 10 以上):`'
'`Unix/Linux:`'
'`
您还需要让您的扫描仪/解析器处理 unix 版本。
解决方案 2:
您可以从以下位置获取当前操作系统的标准行结尾:
System.getProperty("line.separator")
解决方案 3:
扫描仪在空格处发生故障。
编辑:'扫描' Java 教程指出:
默认情况下,扫描器使用空格来分隔标记。(空格字符包括空格、制表符和行终止符。有关完整列表,请参阅 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 + " : " );
System.out.println();
}
} catch(Exception e) { e.printStackTrace(); }
}
}
解决方案 5:
为什么不使用LineNumberReader
?
如果你不能做到这一点,那么代码是什么样的?
我能想到的唯一区别是,你在一个错误的正则表达式上进行拆分,并且当你自己编辑文件时,你会得到以某种方式通过正则表达式的 dos 换行符。
但是,对于一次读取一行的内容来说,使用 似乎有些过度了Scanner
。
当然,您为什么要解析/etc/passwd
是一个值得其他讨论的问题:)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件