晚上在研習循環結構程序設計[注]的時候,有一節是關於文件操作的。要求從文件中讀入數據,求出它們的最小值、最大值和平均值。入門算法對我們不是問題,不過文件讀取還是值得寫一下的。
注:相關PDF下載地址是http://download.csdn.net/detail/peerless_hero/9736266
BufferedReader
BufferedReader繼承於Reader,它從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。通常Reader的讀取請求會導致對底層字符或字節流進行相應的讀取請求,因此需要用BufferedReader包裝那些read()操作開銷很高的Reader(如InputStreamReader)。
使用步驟:
1. 先用InputStream獲取字節流
2. 再用InputStreamReader將字節流轉化成字符流
3. 最後用BufferedReader將字符流以緩存形式輸出的方式來快速獲取數據流。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class AlgorithmAdvance {
public static void main(String[] args) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int sum = 0;
try {
// 得到字符流前需先有字節流,FileInputStream能輸出字節流
// InputStreamReader能將字節流輸出爲字符流,併爲字節流指定字符集
InputStreamReader is = new InputStreamReader(new FileInputStream(
new File("D://Documents/Downloads/datum.txt")), "GBK");
// 傳遞一個Reader對象來創建一個BufferedReader對象
BufferedReader bufferedReader = new BufferedReader(is);
String lineTxt = null;
// 讀取文本行
while ((lineTxt = bufferedReader.readLine()) != null) {
System.out.println(lineTxt);
int i = Integer.valueOf(lineTxt);
if (max < i) {
max = i;
}
if (min > i) {
min = i;
}
sum += i;
}
is.close();
bufferedReader.close();
System.out.printf("max:%d,min:%d,sum:%d", max, min, sum);
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
Scanner
對於上面的程序,如果文件中的數據都寫在了一行,那麼lineTxt就會取到一個”包含多個數字的字符串”,這給操作帶來了不便。我們可以把傳遞字節流到Scanner對象中,不論數據是分行還是同行,Scanner對象的next方法都會輕鬆取到想要的數據。
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class AlgorithmAdvance {
public static void main(String[] args) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int sum = 0;
try {
// 傳遞字節流到Scanner對象
Scanner scanner = new Scanner(new FileInputStream(
"D://Documents/Downloads/datum.txt"));
while (scanner.hasNext()) {
int i = scanner.nextInt();
if (max < i) {
max = i;
}
if (min > i) {
min = i;
}
sum += i;
System.out.println(i);
}
scanner.close();
System.out.printf("max:%d,min:%d,sum:%d", max, min, sum);
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}