我从不同的系统获取不同格式的文件,我需要将其导入数据库。部分导入过程用于检查行长度以确保格式正确。 我们似乎遇到来自UNIX系统的文件有问题,其中添加了一个字符。我怀疑这是由于UNIX和Windows平台上的返回载体编码方式不同。
有没有办法检测创建文件的文件系统,而不是检查该行的最后一个字符?或者也许是一种将文件作为文本而非二进制文件读取的方法,我怀疑这是问题?
谢谢大家!
答案 0 :(得分:5)
Unix系统使用\n
行结尾,而Windows使用\r\n
,mac使用\r
。
您无法检测文件系统,因为它根本不重要。如果我的编辑器支持它,我可以在Windows上使用\ n。它只是那些操作系统的标准,而非要求。
正确的方法 - 假设你没有一个正确的标记化功能,无论文件使用的是什么行 - 都是搜索\ n OR a \ r \ n然后结束当前行并从中删除所有字符在开始下一行之前剩余的数据是\ r或\ n。 但是,如果您有空行并需要保留它们,这将导致问题。在这种情况下,您必须更仔细地查看换行符:
答案 1 :(得分:1)
大多数情况下,Java会自动处理不同类型的行结尾,静默解析\n
(unix)\r\n
(windows)和\r
(mac)而不会打扰你(只要很长时间)因为你正在使用一个字符流)。查看java.io.FileReader
和朋友的文档。使用字符流还将处理所有可能的Unicode编码方案。
如果要显式读取行分隔符,则需要将该文件作为字节流读取。请参阅java.io.DataInputStream
和朋友的文档。
答案 2 :(得分:1)
有没有办法检测创建文件的文件系统,而不是检查该行的最后一个字符?
没有。甚至检查线路终止序列只是一个提示。我们可以在UNIX上轻松创建带有DOS行终止的文件,而反之亦然。
或者也许是一种将文件作为文本而不是二进制文件读取的方法,我怀疑这是问题?
是。使用文件阅读器打开文件,将其包装在缓冲的阅读器中,并使用readLine()
方法一次读取一行文件。此方法将"\n"
,"\r"
或"\r\n"
识别为行分隔符,因此适用于DOS,UNIX和Mac文件。
以下是一些典型代码:
Reader r = new FileReader("somefile");
try {
BufferedReader br = new BufferedReader(r);
String line;
while ((line = r.readLine()) != null) {
// process line
}
} finally {
r.close();
}