我有一个包含以下文本的 text.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
。我猜它是由于文件中的空行而发生的(之后偏移量被搞砸了)。但是,我不明白为什么我会得到两个不同的结果。我需要在两种环境中获得一个结果。
为了将文件读取为字符串,我使用了这里讨论的所有函数 How do I create a Java string from the contents of a file? .但是,在使用任何功能后,我仍然得到相同的结果。
目前我正在使用这个函数将文件读入 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 环境的通用函数。即使文件以文本模式 复制。 因为,不幸的是,我不能保证从事这个项目的每个人都将始终以二进制模式复制文件。
最佳答案
Unix 文件可能使用 native Unix EOL 字符:\n
,而 Windows 文件使用 native Windows EOL 序列:\r\n
。由于您的文件中有两个 EOL,因此存在 2 个字符的差异。确保使用二进制文件传输,所有字节都将被保留,所有内容将在两个操作系统上以相同的方式运行。
编辑:事实上,您是在每个末尾附加操作系统特定 EOL (System.getProperty("line.separator")
) 的人线。只需使用 Reader 将文件读取为字符数组,一切都会好起来的。或者使用 Guava 的方法为您完成:
String s = CharStreams.toString(new FileReader(fileName));
关于java - 如何保留从文件中读取的字符串的正确偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11475121/