如何使用BufferedReader和PrintWriter组合来输入文本

时间:2012-07-22 02:10:09

标签: java input bufferedreader stringtokenizer printwriter

我将在今年晚些时候参加USACO,我很可能会使用Java。但是,我没有彻底涵盖文件I / O. USACO坚持认为我们使用这个BufferReader,PrintWriter和StringTokenizer组合来解析输入的文本。以下是他们展示的代码:

import java.io.*;
import java.util.*;

class test {
  public static void main (String [] args) throws IOException {
    // Use BufferedReader rather than RandomAccessFile; it's much faster
    BufferedReader f = new BufferedReader(new FileReader("test.in"));
                                              // input file name goes above
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("test.out")));
    // Use StringTokenizer vs. readLine/split -- lots faster
    StringTokenizer st = new StringTokenizer(f.readLine());
                      // Get line, break into tokens
    int i1 = Integer.parseInt(st.nextToken());    // first integer
    int i2 = Integer.parseInt(st.nextToken());    // second integer
    out.println(i1+i2);                           // output result
    out.close();                                  // close the output file
    System.exit(0);                               // don't omit this!
  }
}

然而,当我将代码复制/粘贴到Netbeans中时,它没有运行。它在“BufferedReader f = new BufferedReader ...”行给出了一个FileNotFoundException,我想这是因为“test.out”,但我不知道该放入什么。我该如何解决这个问题?

此外,USACO表示这是解析输入文本的最有效方式。这是真的?如此,这是检索输入文本的最有效方法。我熟悉Scanner类等其他方法,但USACO坚持使用BufferedReader,PrintWriter等是最好的方法。

2 个答案:

答案 0 :(得分:2)

StringTokenizerScannersplit效率更高。 Scannersplit都使用正则表达式来标记其输入。 StringTokenizer不使用正则表达式,因此不会遇到使用它的开销。

test.in是项目工作目录中的文件:

YourProject
    src
        test.java
    bin 
        test.class
    test.in

答案 1 :(得分:1)

我在当天用纯Java做过USACO。 (我做得很好。)

你几乎总是想要使用Scanner - 它非常适合编程比赛,而I / O通常不会成为你的瓶颈。 StringTokenizer效率更高,但是当你的程序无论如何都是线性时,你应该真的担心。