我将在今年晚些时候参加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等是最好的方法。
答案 0 :(得分:2)
StringTokenizer
比Scanner
和split
效率更高。 Scanner
和split
都使用正则表达式来标记其输入。 StringTokenizer
不使用正则表达式,因此不会遇到使用它的开销。
test.in
是项目工作目录中的文件:
YourProject
src
test.java
bin
test.class
test.in
答案 1 :(得分:1)
我在当天用纯Java做过USACO。 (我做得很好。)
你几乎总是想要使用Scanner
- 它非常适合编程比赛,而I / O通常不会成为你的瓶颈。 StringTokenizer
效率更高,但是当你的程序无论如何都是线性时,你应该真的担心。