Java - 扫描仪在一定数量的行之后不扫描

时间:2011-09-09 03:45:02

标签: java file-io java.util.scanner bufferedreader

我在Java中做了一些相对简单的I / O.我有一个.txt文件,我正在阅读使用扫描仪和.txt文件,我正在使用BufferedWriter写。然后另一个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();
    }

}

}

2 个答案:

答案 0 :(得分:5)

这是一个经典问题:在阅读文件之前,您需要flushclose输出流(在本例中为statsWriter)。

通过调用write,它不会实际写入文件。调用flush强制它完成任何挂起的写操作。

这是OutputStream.flush()的javadoc:

  

刷新此输出流并强制写出任何缓冲的输出字节。 flush的一般合同是调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地。

答案 1 :(得分:0)

使用statsWriter编写文件后,您需要致电:

statsWriter.flush();
statsWriter.close();

或简单地说:

statsWriter.close();  // this will call flush();

这是因为您正在使用缓冲 Writer,它不会在您调用write函数时将所有内容写入文件,而是在缓冲块中。当您拨打flush()close()时,它会将其仍然存在的所有内容清空到该文件中,并关闭该流。

您需要为第二位作家做同样的事情。