【发布时间】:2011-11-13 11:47:18
【问题描述】:
我正在用 Java 做一些相对简单的 I/O。我有一个使用扫描仪读取的 .txt 文件和一个使用 BufferedWriter 写入的 .txt 文件。然后另一个 Scanner 读取该文件,另一个 BufferedWriter 然后创建另一个 .txt 文件。我提供了下面的代码以防万一,但我不知道它是否会有太大帮助,因为我认为代码不是这里的问题。代码编译没有任何错误,但它没有按照我的预期进行。出于某种原因,charReader 将只读取其文件的大约一半,然后 hasNext() 将返回 false,即使尚未到达文件末尾。这些不是大的文本文件——statsReader 的文件是 34 KB,而 charReader 的文件是 29 KB,这更奇怪,因为 statsReader 可以很好地读取整个文件,而且更大!另外,我确实在 try/catch 中包含了该代码,只是没有包含它。
根据我在网上查到的,这可能会发生在非常大的文件中,但这些文件非常小,所以我很迷茫。
我的操作系统是 Windows 7 64 位。
Scanner statsReader = new Scanner(statsFile);
BufferedWriter statsWriter = new BufferedWriter(new FileWriter(outputFile));
while (statsReader.hasNext()) {
statsWriter.write(statsReader.next());
name = statsReader.nextLine();
temp = statsReader.nextLine();
if (temp.contains("form")) {
name += " " + temp;
temp = statsReader.next();
}
statsWriter.write(name);
statsWriter.newLine();
statsWriter.write(temp);
if (! (temp = statsReader.next()).equals("-"))
statsWriter.write("/" + temp);
statsWriter.write("\t");
statsWriter.write(statsReader.nextInt() + "\t");
statsWriter.write(statsReader.nextInt() + "\t");
statsWriter.write(statsReader.nextInt() + "\t");
statsWriter.write(statsReader.nextInt() + "\t");
statsWriter.write(statsReader.nextInt() + "\t");
statsWriter.write(statsReader.nextInt() + "");
statsWriter.newLine();
statsReader.nextInt();
}
Scanner charReader = new Scanner(charFile);
BufferedWriter codeWriter = new BufferedWriter(new FileWriter(codeFile));
while (charReader.hasNext()) {
color = charReader.next();
name = charReader.nextLine();
name = name.replaceAll("\t", "");
typing = pokeReader.next();
place = charReader.nextInt();
area = charReader.nextInt();
def = charReader.nextInt();
shape = charReader.nextInt();
size = charReader.nextInt();
spe = charReader.nextInt();
index = typing.indexOf('/');
if (index == -1) {
typeOne = determineType(typing);
typeTwo = '0';
}
else {
typeOne = determineType(typing.substring(0, index));
typeTwo = determineType(typing.substring(index+1, typing.length()));
}
}
SSCCE:
public class Tester {
public static void main(String[] args) {
File statsFile = new File("stats.txt");
File testFile = new File("test.txt");
try {
Scanner statsReader = new Scanner(statsFile);
BufferedWriter statsWriter = new BufferedWriter(new FileWriter(testFile));
while (statsReader.hasNext()) {
statsWriter.write(statsReader.nextLine());
statsWriter.newLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
它总是在同一个地方拉屎吗?您是否尝试简化文本文件以隔离那里的问题?您是否简化了 Java 代码以隔离重现问题的最小可编译子集?你使用调试器还是穷人的调试器(
System.out.println语句)? -
是的;每次都在同一个地方。是的,我做了一个循环,在 statsReader.hasNext() 时只执行 codeWriter.write(charReader.nextLine()),它也做了同样的事情。我正在使用 Eclipse,并使用这两种调试方法。
-
好的,很好。现在,如果可以,我建议您创建一个非常小的可编译和可运行的自包含程序(也称为SSCCE 以及一个小的可用数据文件,并将两者都发布在这里,以便我们可以重现您的问题并尝试修改代码以找到解决方案。
-
好的。我制作了一个单独的程序,我所做的只是获取原始的 statsFile,在 hasNext() 为真时从其中读取扫描仪,并让 BufferedWriter 在每次迭代中写入 nextLine()。奇怪的是它仍然没有得到整个文件。这次它只得到了大约 3/4s 的文件。
-
@RC,Pastebin 没有与 SO 相同的保证后代。我认为代码属于这里(复制起来很简单)。
标签: java file-io java.util.scanner bufferedreader