IO 框架
Key Point
* File 类
* 流的分类
* 基本字节流
* 字节过滤流
* 基本字符流、桥转换
* 字符过滤流
* 对象序列化
练习
1. (File 类)以下关于File 类说法正确的是:
A. 一个File 对象代表了操作系统中的一个文件或者文件夹
B. 可以使用File 对象创建和删除一个文件
C. 可以使用File 对象创建和删除一个文件夹
D. 当一个File 对象被垃圾回收时,系统上对应的文件或文件夹也被删除
2. (File 类)有如下代码:
public class TestFile{
public static void main(String args[]){
File file = new File(“chp13/corejava.txt”);
}
}
请选择一个正确答案:
A. corejava.txt 文件在系统中被创建
B. 在windows 系统上运行出错,因为路径分隔符不正确
C. corejava.txt 文件在系统中没有被创建
D. 如果corejava.txt 文件已存在,则抛出一个异常
3. (File 类)将下列代码补充完整
class TestMyFile{
public static void main(String args[]) throws Exception{
File file;
//创建一个File 对象表示当前目录下的“hello.txt”文件
//判断该文件是否存在
//如果该文件存在,则输出该文件的完整路径
}
}
4. (流的分类)对于FileInputStream 来说,从方向上来分,它是_________流,从数据单
位上分,它是__________流,从功能上分,它是____________流。
5. (字节流, FileInputStream)FileInputStream 有三个重载的read 方法,其中
1) 无参的read 方法返回值为___类型,表示_________________
2) int read(byte[]
bs)方法返回值表示______________,参数表示________________
3) int read(byte[] bs, int offset, int len)
方法返回值表示_______________,参数分别表示
___________________________。
6. (FileInputStream)下面关于FileInputStream 类型说法正确的是:
A. 创建FileInputStream 对象是为了读取硬盘上的文件
B. 创建FileInputStream 对象时,如果硬盘上对应的文件不存在,则抛出一个异常
C. 利用FileInputStream 对象可以创建文件
D. FileInputStream 对象读取文件时,只能读取文本文件。
7. (FileOutputStream)填空:
创建FileOutputStream 对象时,如果对应的文件在硬盘上不存在,则会___________;如
果对应的文件在硬盘上已经存在,则_______________;
如果使用FileOutputStream(String path, boolean append) 这个构造方法创建
FileOutputStream 对象,并给定第二个参数为true,则效果为__________________。
创建FileOutputStream 时_______(会|不会)产生异常。
8. 代码改错
class TestFileInputStream{
public static void main(String args[]){
FileInputStream fin = new FileInputStream(“test.txt”);
try{
System.out.println( fin.read() );
fin.close();
}catch(Exception e){}
}
}
9. (FileInputStream 和FileOutputStream)利用FileInputStream
和FileOutputStream,完成
下面的要求:
1) 用FileOutputStream 在当前目录下创建一个文件“test.txt”,并向文件输出“Hello
World”,如果文件已存在,则在原有文件内容后面追加。
2) 用FileInputStream 读入test.txt 文件,并在控制台上打印出test.txt 中的内容。
3) 要求用try-catch-finally 处理异常,并且关闭流应放在finally 块中。
10. (Data 流)利用Data 流,完成下面操作:
1) 判断当前目录下是否存在一个“test.dat”的文件,如果该文件不存在,则往该文件
中写入一个long 类型的数值:10000L
2) 如果该文件存在,则从该文件中读出数值,并把该数值加1 之后,再存回文件中。
11. (字符流、桥转换)要想从某个文件中获得一个字符输出流,则至少有以下三种方式
A. 利用FileWriter 类
B. 利用PrintWriter 类
C. 利用FileOutputStream 类,并通过OutputStreamWriter 类获得Writer
请简述这三种方式获得Writer 的区别。
12. (字节流、字符流)以下几种文件格式,应当使用字节流还是字符流?
1) .java 源文件
2) .class 字节码文件
3) .html 网页文件
4) .jpg 图像文件
5) .mp3 音乐文件
6) 配置文件.bash_profile
7) .jar 文件
13. (过滤流)连线题。把过滤流和相应的功能用线连起来。注意,左右两边不是一一对应
的关系。
ObjectInputStream 字节流
ObjectOutputStream 字符流
BufferInputStream 读八种基本类型
BufferedOutputStream 写八种基本类型
DataInputStream 读对象
DataOutputStream 写对象
PrintWriter 缓冲功能
PrintStream 读入一行文本
BufferedReader 写字符串并换行
BufferedWriter 写字符串
14. (对象序列化)
为了让某对象能够被序列化,要求其实现________________________接口;
为了让该对象某个属性不参与序列化,应当使用____________修饰符。
15. *(字符流、桥转换)完成下面功能:
事先在当前目录下准备好一个test.txt 的文本文件,要求该文本文件是使用GBK 编码的
多行文本文件。如:
test.txt
窗前明月光
疑是地上霜
举头望明月
低头思故乡
利用字节流+桥转换读入这个文本文件,然后按照行的顺序,以UTF-8 的编码方式,写
到test2.txt 文件中,例:
test2.txt
低头思故乡
举头望明月
疑是地上霜
窗前明月光
16. *(Data 流)有以下代码
public class Check{
public static void main(String args[]) throws Exception{
FileOutputStream fout = new FileOutputStream(“test.dat”);
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(1);
dout.writeDouble(0.01);
dout.close();
}
}
问:这个程序总共往文件中写入了多少字节?
A. 2
B. 8
C. 12
D. 16
E. 字节数取决于具体平台
17. *(对象序列化)
在PrintWriter 中,有一个方法print(Object obj)
在ObjectOutputStream 中,有一个方法writeObject(Object obj)
请简述这两个方法的区别
18. *(对象序列化)写出下面代码运行结果
import java.io.*;
class Address implements Serializable{
private String addressName;
private String zipCode;
//构造方法
//set/get 方法
public String toString(){
return addressName + “ ” + zipCode;
}
}
class Student implements Serializable {
private String name;
private transient int age;
private Address addr;
//构造方法…
//set/get 方法…
public String toString(){
return name + “ ” + age + “” + addr.toString();
}
}
public class TestObjectStream{
public static void main(String args[]) throws Exception{
Address addr = new Address(“Beijing”, “100000”);
Student stu = new Student(“Tom”, 18, addr);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(“stu.dat”) );
oos.writeObject(stu);
oos.close();
ObjectInputStream oin = new ObjectInputStream(
new FileInputStream(“stu.dat”) );
Student stu2 = (Student) oin.readObject();
oin.close();
System.out.println(stu2);
}
}
19. *(对象序列化)有以下代码:
import java.io.*;
class Address{
private String addressName;
private String zipCode;
//构造方法…
//get/set 方法…
}
class Worker implements Serializable{
private String name;
private int age;
private Address address;
//构造方法…
//get/set 方法…
}
public class TestSerializable {
public static void main(String args[]) throws Exception{
Address addr = new Address("Beijing", "100000");
Worker w = new Worker("Tom", 18, addr);
ObjectOutputStream oout = new ObjectOutputStream(
new FileOutputStream("fout.dat") );
oout.writeObject(w);
oout.close();
}
}
选择正确答案
A. 该程序编译出错
B. 编译正常,运行时异常
C. 编译正常,运行时也正常。
20. *(字节流,BufferedReader)完成下面操作。
在当前目录下创建一个worldcup.txt 的文本文件,其格式如下:
2006/意大利
2002/巴西
…
该文件采用“年份/世界杯冠军”的方式保存每一年世界杯冠军的信息。
要求:读入该文件的基础上,让用户输入一个年份,输出该年的世界杯冠军。如果该年
没有举办世界杯,则输出“没有举办世界杯”
21. **(Buffered 流,缓冲区)有下面代码
import java.io.*;
public class TestBufferedWriter{
public static void main(String args[]) throws Exception{
FileWriter fw = new FileWriter(“test.txt”);
BufferedWriter bw = new BufferedWriter(fw);
String str = “Hello World”;
bw.write(str);
}
}
在处放入什么代码,能够使得test.txt 文件被正确写入?
A. bw.close()
B. bw.flush();
C. fw.close();
22. **(Data 流)在原有自动分配id 的Account 对象基础上,利用Data 流,完成下面的要
求:
要求每次启动程序时,id 的自动分配都能在上一次运行的基础上继续。例如,假设有以
下代码:
public class TestAccount{
public static void main(String args[]){
Account a1 = new Account();
Account a2 = new Account();
Account a3 = new Account();
System.out.println(a1.getId() );
System.out.println(a2.getId() );
System.out.println(a3.getId() );
}
}
编译之后,第一次运行
java TestAccount
时,输出
100001
100002
100003
第二次运行
java TestAccount
时,输出
100004
100005
100006
23. **(综合)
从命令行中读入一个文件名,判断该文件是否存在。如果该文件存在,则在原文件相同
路径下创建一个文件名为“copy_原文件名”的新文件,该文件内容为原文件的拷贝。
例如:读入
/home/java/photo.jpg
则创建一个文件
/home/java/copy_photo.jpg
新文件内容和原文件内容相同。
24. ***(可选,综合)用两种方式保存对象。
有Worker 对象,部分代码如下:
class Worker{
private String name;
private int age
private double salary;
//构造方法
…
//get/set 方法
…
//toString 方法
…
}
1) 完善Worker 对象,并使其能使用对象序列化机制。
2) 利用ObjectOutputStream 存入两个Worker 对象, 然后使用
ObjectInputStream 读出这两个对象,并打印这两个对象的信息。
3) 写一个方法saveWorkerToFile(Worker w, File file),该方法完成下面的
功能:
假设有一个Worker 对象w1,File 对象f1 如下:
Worker w1 = new Worker(“Tom”, 30, 5000);
File f1 = new File(“test.txt”);
则调用saveWorkerToFile(w1, f1),会在test.txt 中增加一行:
Tom/30/5000
4) 写一个方法List
readWorkerFromFile(File file),该方法读某
个文件,从文件信息中创建一个Worker 类型的List。
例如,假设文件内容如下:
Tom/30/5000
Jim/25/3000
Terry/33/4500
则返回一个包含三个Worker 对象的List。