【问题标题】:How to identify/handle text file newlines in Java?如何在 Java 中识别/处理文本文件换行符?
【发布时间】:2011-03-02 15:11:24
【问题描述】:

我需要将来自不同系统的不同格式的文件导入我们的数据库。导入过程的一部分是检查行长以确保格式正确。 我们似乎遇到了来自添加了一个字符的 UNIX 系统的文件的问题。我怀疑这是由于 UNIX 和 Windows 平台上的回车编码不同。

除了检查行的最后一个字符之外,有没有办法检测文件是在哪个文件系统上创建的?或者也许是一种将文件读取为文本而不是二进制文件的方式,我怀疑这是问题所在?

谢谢各位!

【问题讨论】:

  • 一些字符,例如英国英镑符号£在 UTF8 中是两个字节。你是怎么测量长度的? DB中的目标字符集是什么?
  • 标题和标签(文件系统)具有误导性。

标签: java text file cross-platform newline


【解决方案1】:

Unix 系统使用 \n 行尾,而 windows 使用 \r\n 而 mac 使用 \r。 您无法检测到文件系统,因为它根本不重要。例如,如果我的编辑器支持它,我可以在 Windows 上使用 \n。这只是那些操作系统的标准,不是要求。

正确的方法 - 假设你没有一个函数可以正确标记无论文件使用哪一行结尾 - 是搜索一个 \n 或一个 \r 然后结束当前行并从在开始下一行之前剩余的数据是 \r 或 \n。 但是,如果您有空行并且需要保留它们,这将导致问题。在这种情况下,您必须更仔细地查看换行符:

  • 读取\n时,结束当前行并开始下一行
  • 读取 \r 时,结束当前行,如果下一个字符是 \n,则跳过它,开始下一行,否则立即开始新行。

【讨论】:

  • 经典 Mac OS 使用 \r 作为其行终止符。当前版本的 Mac OS(基本上是过去 10 年发布的所有版本)使用\n
【解决方案2】:

大多数时候,Java 会自动处理不同类型的行尾,默默地解析 \n (unix) \r\n (windows) 和 \r (mac) 而不会打扰您(只要您使用字符流)。请参阅java.io.FileReader 和朋友的文档。使用字符流还将处理所有可能的 Unicode 编码方案。

如果要显式读取行分隔符,则需要将文件作为字节流读取。请参阅java.io.DataInputStream 和朋友的文档。

【讨论】:

    【解决方案3】:

    除了检查行的最后一个字符之外,有没有办法检测文件是在哪个文件系统上创建的?

    没有。甚至检查线路终止顺序也只是一个提示。我们可以轻松地在 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();
        }
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 2016-07-14
      • 1970-01-01
      • 2013-08-05
      • 2010-09-13
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多