Java 如何保留从文件中读取的字符串的正确偏移量

Java 如何保留从文件中读取的字符串的正确偏移量,java,file-io,intellij-idea,Java,File Io,Intellij Idea,我有一个text.txt文件,其中包含以下txt文件 Kontagent Announces Partnership with Global Latino Social Network Quepasa Released By Kontagent 我把这个文本文件读入一个字符串documentText documentText.subString(0,9)给出了Kontagent,这很好 但是,documentText.subString(87,96)在windows(IntelliJ I

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

 Kontagent Announces Partnership with Global Latino Social Network Quepasa

 Released By Kontagent
我把这个文本文件读入一个字符串documentText

documentText.subString(0,9)
给出了
Kontagent
,这很好

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

要将文件读取为字符串,我使用了这里讨论的所有函数 . 但是,在使用任何函数之后,我仍然得到相同的结果

目前我正在使用此函数将文件读入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环境的通用函数。即使文件是以文本模式复制的。
因为,不幸的是,我不能保证参与此项目的每个人都将始终以二进制模式复制文件。

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

因为您的文件不包含
\r
字符(可能是直接从Linux传输的),
System.getProperty(“line.separator”)
将返回
\r\n
并解释不存在的
\r
字符。这就是您的输出落后2个字符的原因


祝你好运

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

因为您的文件不包含
\r
字符(可能是直接从Linux传输的),
System.getProperty(“line.separator”)
将返回
\r\n
并解释不存在的
\r
字符。这就是您的输出落后2个字符的原因


祝你好运

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

编辑:事实上,您是在每行末尾追加操作系统特定的下线(
System.getProperty(“line.separator”)
)的人。只要使用读取器将文件作为字符数组读取,一切都会很好。或者使用番石榴的方法为您提供:

String s = CharStreams.toString(new FileReader(fileName)); 

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

编辑:事实上,您是在每行末尾追加操作系统特定的下线(
System.getProperty(“line.separator”)
)的人。只要使用读取器将文件作为字符数组读取,一切都会很好。或者使用番石榴的方法为您提供:

String s = CharStreams.toString(new FileReader(fileName)); 

根据你们提供的信息,我写了这样的东西

documentText  = CharStreams.toString(new FileReader("text.txt"));
documentText = this.documentText.replaceAll("\\r","");
如果文件已删除,则删除额外的\r

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

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


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

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

documentText  = CharStreams.toString(new FileReader("text.txt"));
documentText = this.documentText.replaceAll("\\r","");
如果文件已删除,则删除额外的\r

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

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


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

修剪所有空格怎么样,这样你就不必担心间距了?我不能修剪空格。字符偏移量需要保持原样。如果我在我的代码中修剪空格,我将必须确保其他第三方组件也能在这个文件上工作,并且也能在这个文件上工作。偏移量信息通过不同的文件传送给我。(希望这不是非常模糊的解释:))修剪所有的空格怎么样,这样你就不用担心间距了?我不能修剪空格。字符偏移量需要保持原样。如果我在我的代码中修剪空格,我将必须确保其他第三方组件也能在这个文件上工作,并且也能在这个文件上工作。偏移量信息通过不同的文件传送给我。(希望不是很模糊的解释:)明白了。但是,String lineSeparator=System.getProperty(“line.separator”);在函数中,是否已处理该问题?是的,但如果文件中有
\n
而不是
\r\n
,则它将假定您的行分隔符为
\r\n
,并去掉两个字符。这就是为什么您的输出提前了2个字符(两个不应该计数的
\r
值),您应该考虑分隔符的长度。因此,在获取子字符串时,要考虑子字符串之前的新行数。“hello\nWorld”(Unix)与“hello/r/nWorld”(windows)+1不同,感谢您解释\n和\r。看来你解决了这个问题。我很快就会回来,如果答案有效的话,我会接受的。@DZittersteyn,这是gr