文件字节输入/输出流
对象序列化
BufferedReader/PrintWriter
桥转换流
1:Java 中字节流的父类为 InputStream 和 OutputStream;字符流的父类为 Reader和 Writer。以上 4 个类都位于 java.io包中。
2:对象序列化:
(1)为了让某对象能够被序列化,要求其实现 serializable 接口;
(2)为了让该对象某个属性不参与序列化,应当使用 transient修饰符。
3.以下描述正确的是()
- InputStream 和OutputStream 是基于字节流的
- Reader 和Writer 是基于字符流的
- Reader 和Writer 是支持对象序列化的
- PrintWriter 是支持对象序列化的
4.创建一个BufferedOutputStream 的语句为()
- new BufferedOutputStream(“out.txt”);
- new BufferedOutputStream(new OutputStream(“out.txt”));
- new BufferedOutputStream(new FileOutputStream(“out.txt”));
- new BufferedOutputStream(new FileInputStream(“out.txt”));
5.仔细阅读以下代码,关于程序描述正确的是()
A. 该程序编译出错 B. 编译正常,运行时异常
C. 编译正常,运行时也正常 D. 以上描述都不正确
6:对象序列化和字符流)在PrintWriter 中,有一个方法 print(Object obj) ; 在ObjectOutputStream 中,有一个方法 writeObject(Object obj)
请简述这两个方法的区别
writeObject(Object obj)存放到文本中是以对象形式的,输出的也是对象 所以该方法调用的对象必须实现序列化接口 implements Serializable 以此表明是可读的
对象过滤流是在读写对象的完整信息,所以可以对对象进行序列号及反序列化
而Print Writer中print(Object obj)方法是调用了对象中的toString()方法把对象变为了字符串,存入到文本中去,所以该方法引用的对象可以不用序列化 不用implements Serializable接口
print()只是在读写对象引用的toString方法的结果,并未读写对象的完整信息,所以无法对对象进行序列号及反序列化
7:(字符流、桥转换)要想从某个文件中获得一个字符输出流,则至少有以下三种方式:
(1)利用FileWriter 类
(2)利用PrintWriter 类
(3)利用FileOutputStream 类,并通过OutputStreamWriter 类获得 Writer 请简述以上三种方式获得Writer 的区别。
(1)利用Filewriter 节点字符流,可以获取文本元素,但是比较后两种来说相对较慢
(2)利用PrintWriter 过滤字符流 可以再File Writer基础上增加一个缓冲区,可以有效提高运行速
(3)利用FileOutputStream 节点字节流 先创建 再用Output Stream Writer 桥转换流 可以实现字符集的转换,这是前两个流所没有的功能
8:(字节过滤流)利用 Object流,完成下面操作:
(1)往当前目录下“test.dat”的文件中写入一个long类型的数值:10000L
(2)从该文件中读出数值,并把该数值加 1 之后,再存回文件中。
package com.by.homeworkIO2;
import java.io.*;
public class Test9 {
public static void main(String[] args) {
try( ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("file/test.txt",true));
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("file/test.txt"));){
oos.writeLong(10000L);
oos.flush();
long l=0;
/*while(true){
try {
l= (long) ois.readObject();
System.out.println(l+1);
} catch (EOFException e) {
break;
}
}*/
oos.writeLong(ois.readLong()+1);
System.out.println(ois.readLong());
}catch (FileNotFoundException e){
System.out.println("文件路径有误");
}catch (IOException e){
System.out.println("读写有误");
} catch (Exception e) {
System.out.println("位置错误");
}
}
}
9:编程:根据提示完成以下代码
package com.by.homeworkIO2;
import javax.swing.plaf.basic.BasicDesktopIconUI;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
public class Test10 {
public static void main(String[] args) throws IOException {
File f=new File("file/hello.txt");
System.out.println(f.exists());
if (f.exists()){
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
System.out.println(f.isFile());
}
}
10:(字符流、桥转换)完成下面功能:
事先在当前目录下准备好一个 test.txt 的文本文件,要求该文本文件是使用 GBK 编码的多行文本文件。如test.txt :
package com.by.homeworkIO2;
import java.io.*;
public class Test11GBK {
public static void main(String[] args) {
try (OutputStream os=new FileOutputStream("file/test1.txt");
InputStream is=new FileInputStream("file/test1.txt");
OutputStreamWriter osw=new OutputStreamWriter(os,"GBK");
InputStreamReader isr=new InputStreamReader(is,"GBK");
PrintWriter pw=new PrintWriter(osw);
BufferedReader br=new BufferedReader(isr);){
pw.println("床前明月光");
pw.println("疑似地上霜");
pw.println("举头望明月");
pw.println("低头思故乡");
pw.flush();
while(true){
String str=br.readLine();
if (str==null){
break;
}
System.out.println(str);
}
}catch (FileNotFoundException e){
System.out.println("文件路径有误");
}catch (IOException e){
System.out.println("读写有误");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
利用字节流+桥转换读入这个文本文件,按照行的顺序,以UTF-8 编码方式,写到 test2.txt 文件中。例 :test2.txt :
package com.by.homeworkIO2;
import java.io.*;
public class Test11GBK {
public static void main(String[] args) {
try (OutputStream os=new FileOutputStream("file/test1.txt");
InputStream is=new FileInputStream("file/test1.txt");
OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
InputStreamReader isr=new InputStreamReader(is,"UTF-8");
PrintWriter pw=new PrintWriter(osw);
BufferedReader br=new BufferedReader(isr);){
pw.println("床前明月光");
pw.println("疑似地上霜");
pw.println("举头望明月");
pw.println("低头思故乡");
pw.flush();
while(true){
String str=br.readLine();
if (str==null){
break;
}
System.out.println(str);
}
}catch (FileNotFoundException e){
System.out.println("文件路径有误");
}catch (IOException e){
System.out.println("读写有误");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
11:编程:根据描述完成以下程序:
在当前目录下创建一个 worldcup.txt 的文本文件,其格式如下:
要求:读入该文件的基础上,让用户输入一个年份,输出该年的世界杯冠军。如果该年没有举办世界杯, 则输出“没有举办世界杯”
package com.by.homeworkIO2;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Test12WorldCup {
public static void main(String[] args) {
try (
//创建输入流读取数据
BufferedReader br = new BufferedReader(new FileReader("file/worldcup.txt"))
) { //获取用户输入
Scanner scanner =new Scanner(System.in);
System.out.println("请输入年份:");
String year = scanner.next();
//读取文件内容并比较
boolean flag=false;
while (true){
String line = br.readLine();
if (line==null)break;
String[] strs = line.split("/");
if (strs[0].equals(year)){
flag=true;
System.out.println(strs[1]);
}
}
if (!flag){
System.out.println("没有举办世界杯");
}
} catch (FileNotFoundException e) {
System.out.println("文件找不到");
} catch (IOException e) {
System.out.println("IO异常");
e.printStackTrace();
} catch (Exception e) {
System.out.println("未知异常");
e.printStackTrace();
}
}
}