第九章 Java I/O系统
1、题目
1.1、 何为流?根据流的方向,流可分为哪两种?
流表示文件传播的方向和传播的文件信息的集合。根据流的方向,流可分为输入与输出流。
PPT:流是在计算机的输入、输出操作中流动的数据序列。
1.2、 InputStream,OutputStream,Reader和Writer类的功能有何异同?
其中InputStream与Reader同为输入流,程序可以通过它们从文件读取信息;而OutputStream与Writer同为输出流,程序可以通过它们向文件输出信息。
PPT:
字节流类主要用于读写诸如图象或声音等的二进制数据。字符流类用于向字符流读写16位二进制字符。
1.3、 编写一个程序,将两个文件中的内容合并到一个文件中。
(这里只实现了从1和2文件读取输出到3文件,还不能从1复制到2而不改变2原有的值)
package xiti9;
//以字节流方式,将一个文件中的信息复制到另一个文件
//读入:程序<-FileInputStream<-文件(信息源)
//写出:程序->FileOutputStream->文件(信息去向)
//未考虑异常处理
import java.io.*;
public class xiti9_3 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
int b = 0;
FileInputStream in1 = null,in2 = null;
FileOutputStream out = null;
//数据源,用于向程序中读取信息
in1 = new FileInputStream("e://source1.txt");
//目标文件,程序将信息写到此文件中,会自动创建文件
in2 = new FileInputStream("e://source2.txt");
out = new FileOutputStream("e://dest.txt");
while((b=in1.read())!=-1){//一次读一个字节,判断是否读到文件结尾
out.write(b);//一次写一个字节
}
while((b=in2.read())!=-1){//一次读一个字节,判断是否读到文件结尾
out.write(b);//一次写一个字节
}
in1.close();
in2.close();
out.close();
System.out.println("文件已复制");
}
}
1.4、 编程实现以下功能
在屏幕上显示:输入姓名,然后将用户输入的姓名保存到文本文件中,重复进行,直到用户输入空字符串为止。
package xiti9;
import java.io.*;
public class xiti9_4 {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//使用System.in创建InputStreamReader类对象iin
InputStreamReader iin = new InputStreamReader(System.in);
//创建BufferedReader类对象bin,并关联到iin
BufferedReader bin = new BufferedReader(iin);
//或者合并写成如下
//BufferedReader stdin= new BufferedReader( new InputStreamReader(System.in));
String str;
//System.out.println("请输入姓名:");
//str = bin.readLine();
//创建文件输出 FileWriter类对象fw1
FileWriter fw = new FileWriter("e:\\name.txt");
//创建带缓冲的BufferedWriter类对象bw,并关联到fw1
BufferedWriter bw = new BufferedWriter(fw);
//循环读入字符串
while(true){
System.out.println("请输入姓名: ");
//清空输出缓冲区
System.out.flush();
//读入输入的一行
str = bin.readLine();
//若遇到空行则break,结束读-写工作
if(str.length()==0)break;
//将本行字符串写出到对象bw
bw.write(str);
//在对象bw中创建新行,为下一行输出做准备
bw.newLine();
}
//关闭输出对象
bin.close();
bw.close();
}
}
1.5、 使用 字符流 编程实现以下功能
(1)从键盘输入姓名、学号、成绩,并保存到文本文件中,重复进行,直到输入空字符串为止
(2)从文件中读取各学生的成绩,并计算所有学生成绩的平均值、最大值和最小值
package xiti9;
import java.io.*;
public class xiti9_5 {
public static void main(String[] args) throws Exception{
InputStreamReader iin = new InputStreamReader(System.in);
BufferedReader bin = new BufferedReader(iin);
String str;
FileWriter fw = new FileWriter("e:\\student.txt");
//创建带缓冲的BufferedWriter类对象bw,并关联到fw1
BufferedWriter bw = new BufferedWriter(fw);
//循环读入字符串
while(true){
System.out.println("请输入姓名、学号: ");
//清空输出缓冲区
System.out.flush();
//读入输入的一行
str = bin.readLine();
//若遇到空行则break,结束读-写工作
if(str.length()==0)break;
//将本行字符串写出到对象bw
bw.write(str);
//在对象bw中创建新行,为下一行输出做准备
bw.newLine();
System.out.println("请输入成绩: ");//为了方便提取成绩信息,将其单独作为一行写入文件
System.out.flush();
str = bin.readLine();
if(str.length()==0)break;
bw.write(str);
bw.newLine();
}
//关闭输出对象
bin.close();
bw.close();
System.out.println("姓名、学号、成绩已保存到文本");
//对student.txt文件的操作
FileReader fr = new FileReader("e:\\student.txt");
BufferedReader bin1 = new BufferedReader(fr);
//建立缓冲BufferedReader对象bin1,关联到fr
String str2;
str2=bin1.readLine();
double temp=0,ave=0,min=1000,sum=0,max=0;
int linenum=0;//以行数的奇偶判断成绩所在的行
while(str2!=null) {
linenum++;
if(linenum%2==0) {//偶数行为成绩
temp = Double.parseDouble(str2);
sum+=temp;//求和
if(min>temp) {
min=temp;
}
if(max<temp) {
max=temp;
}
}
str2=bin1.readLine();
}
ave = sum/(linenum/2);
System.out.println("学生成绩的平均值为:"+ave);
System.out.println("学生成绩的最大值为:"+max);
System.out.println("学生成绩的最小值为:"+min);
}
}