晚上在研习循环结构程序设计[注]的时候,有一节是关于文件操作的。要求从文件中读入数据,求出它们的最小值、最大值和平均值。入门算法对我们不是问题,不过文件读取还是值得写一下的。
注:相关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 {
}
}
}