1

我有一个 text.txt 文件,其中包含以下 txt。

 Kontagent Announces Partnership with Global Latino Social Network Quepasa

 Released By Kontagent

我将此文本文件读入字符串 documentText。

documentText.subString(0,9)Kontagent,这很好。

但是,在 windows (IntelliJ Idea) 中给出并documentText.subString(87,96)在 Unix 环境中给出。我猜这是因为文件中的空白行(之后偏移量被搞砸了)。但是,我不明白,为什么我会得到两个不同的结果。我需要在两种环境中都得到一个结果。y KontageKontagent

要将文件作为字符串读取,我使用了此处讨论的所有函数 如何从文件内容创建 Java 字符串?. 但是,使用任何功能后,我仍然得到相同的结果。

目前我正在使用此函数将文件读入 documentText 字符串:

public static String readFileAsString(String fileName)
{

    File file = new File(fileName);
    StringBuilder fileContents = new StringBuilder((int)file.length());
    Scanner scanner = null;
    try {
        scanner = new Scanner(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String lineSeparator = System.getProperty("line.separator");

    try {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() + lineSeparator);
        }
        return fileContents.toString();
    } finally {
        scanner.close();
    }
}

编辑:有没有办法编写一个适用于 Windows 和 UNIX 环境的通用函数。即使文件以文本模式复制。因为,不幸的是,我不能保证从事这个项目的每个人都将始终以二进制模式复制文件。

4

3 回答 3

2

在 Windows 上,换行符\n前面\r有回车符或回车符。这在 Linux 中是不存在的。将文件从一个操作系统传输到另一个操作系统不会删除/附加此类字符,但偶尔,文本编辑器会为您自动格式化它们。

因为您的文件不包含\r字符(可能是直接从 Linux 传输的),所以System.getProperty("line.separator")会返回\r\n并说明不存在的\r字符。这就是为什么您的输出落后 2 个字符的原因。

祝你好运!

于 2012-07-13T17:10:43.007 回答
2

Unix 文件可能使用本机 Unix EOL char: \n,而 Windows 文件使用本机 Windows EOL 序列:\r\n。由于您的文件中有两个 EOL,因此相差 2 个字符。确保使用二进制文件传输,所有字节都将被保留,并且所有内容都将在两个操作系统上以相同的方式运行。

编辑:事实上,System.getProperty("line.separator")是在每行末尾附加特定于操作系统的 EOL ( ) 的人。只需使用 Reader 将文件作为 char 数组读取,一切都会好起来的。或者使用 Guava 的方法为你做这件事:

String s = CharStreams.toString(new FileReader(fileName)); 
于 2012-07-13T17:11:33.303 回答
0

根据你们提供的输入,我写了这样的东西

documentText  = CharStreams.toString(new FileReader("text.txt"));
documentText = this.documentText.replaceAll("\\r","");

如果文件有 \r,则去除额外的 \r。

现在,我在 windows 环境和 unix 环境中得到了预期的结果。问题解决了!!!

无论复制了什么模式文件,它都可以正常工作。

:) 我希望我可以选择你的两个答案,但 stackoverflow 不允许。

于 2012-07-13T18:51:21.810 回答