文件字节输入/输出流
对象序列化
BufferedReader/PrintWriter
桥转换流
(1)为了让某对象能够被序列化,要求其实现?serializable 接口;
(2)为了让该对象某个属性不参与序列化,应当使用?transient修饰符。
![]() |
A.?该程序编译出错 B.?编译正常,运行时异常
C.?编译正常,运行时也正常 D.?以上描述都不正确
writeObject(Object obj)存放到文本中是以对象形式的,输出的也是对象 ???所以该方法调用的对象必须实现序列化接口 ??implements ??Serializable ???以此表明是可读的
对象过滤流是在读写对象的完整信息,所以可以对对象进行序列号及反序列化
而Print Writer中print(Object obj)方法是调用了对象中的toString()方法把对象变为了字符串,存入到文本中去,所以该方法引用的对象可以不用序列化 不用implements ?Serializable接口
print()只是在读写对象引用的toString方法的结果,并未读写对象的完整信息,所以无法对对象进行序列号及反序列化
(1)利用FileWriter?类
(2)利用PrintWriter?类
(3)利用FileOutputStream?类,并通过OutputStreamWriter?类获得 Writer 请简述以上三种方式获得Writer?的区别。
(1)利用Filewriter 节点字符流,可以获取文本元素,但是比较后两种来说相对较慢
(2)利用PrintWriter 过滤字符流 ???可以再File Writer基础上增加一个缓冲区,可以有效提高运行速
(3)利用FileOutputStream 节点字节流 ??先创建 ?再用Output Stream Writer 桥转换流 ?可以实现字符集的转换,这是前两个流所没有的功能
(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("位置错误");
????????}
????}
}
?
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());
????}
}
事先在当前目录下准备好一个 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);
????????}
????}
}
在当前目录下创建一个 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();
????????}
????}
}