2012-07-22 48 views
1

我將在今年晚些時候參加USACO,而且我很可能會使用Java。但是,我沒有徹底地介紹過File I/O。 USACO堅稱我們使用這個BufferReader,PrintWriter和StringTokenizer組合來解析輸入的文本。這裏是他們顯示的代碼:如何使用BufferReader和PrintWriter組合輸入文字

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

你知道''test.in''是你的問題輸入的輸入文件,而''test.out''是你的代碼輸出的輸出文件嗎? – 2012-07-22 02:15:00

+0

是的,但輸入文件是什麼?它是一個單獨的類,或System.in,還是什麼? – kullalok 2012-07-22 02:19:00

+0

您可能會首先閱讀[教程](http://docs.oracle.com/javase/tutorial/essential/io/index.html)。 – 2012-07-22 02:20:49

回答

1

我做USACO回用純Java的一天。 (我的確做得很好。)

你幾乎總是想用Scanner - 這對於編程比賽來說非常完美,而且I/O通常不會成爲你的瓶頸。 StringTokenizer效率更高一些,但是當你的程序無論如何都是線性時,你應該真的擔心這一點。

2

StringTokenizerScannersplit更有效。 Scannersplit都使用正則表達式來標記其輸入。 StringTokenizer不使用正則表達式,因此不會遇到使用它的開銷。

test.in是在項目的工作目錄中的文件:

YourProject 
    src 
     test.java 
    bin 
     test.class 
    test.in 
相關問題