1.节点流和处理流接2.处理流bufferedinputstream和bufferedoutstream2.1介绍bufferedinputstream62.6
bufferedinputstream是创建bufferedinputstream的字节流。.
2.2介绍Bufferedoutstream62bufferedoutstream是字节流,实现缓冲输出流,可以将多个字节写入底层输出流,而无需调用底层系统
3.应用案例627要求:编程完成图片/音乐的复制(Buffered需要使用..流).
com中的代码.stulzl.bufferedcopy_.BufferedCopy包
package com.stulzl.bufferedcopy_;import java.io.*;//案例BufferedInputstreamer 和 BufferedOutputStream 627//使用它们,可以复制二进制文件.//要求:编程完成图片/音乐副本(Buffered需要使用..流).public class BufferedCopy_ { public static void main(String[] args) { String srcFilePath = "e:\\guidao.jpg"; String destFilePath = "e:\guidao2.jpg"; //思考:字节流可以操作二进制文件,文本文件可以操作吗?当然可以////// String srcFilePath = "e:\\story.txt";// String destFilePath = "e:\story3.txt"; //创建BufferedInputstreamer 和 bufferedoutstream对象 BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(srcFilePath)); bos = new BufferedOutputStream(new FileOutputStream(destFilePath)); //循环读取文件,并写入到 destFilePath byte[] buff = new byte[1024];///临时缓冲字节数组 int readLen = 0; //当返回 -1 时,这意味着文件已读完 while((readLen=bis.read(buff))!=-1){ bos.write(buff,0,readLen); } System.out.println(成功复制文件…); } catch (IOException e) { e.printStackTrace(); } finally { //关闭流 try { if(bis!=null){ bis.close(); } if(bos!=null){ bos.close(); } } catch (IOException e) { e.printStackTrace(); } } }}
4.Objectinputstream和Objectoutstream628
➢看一个需求
1.将intnum=100这个int数据保存在文件中,注意不是100数字,而是int100,井,能够
int1000直接从文件中恢复
2.将Dogdog=newDog(“小黄”,3)这个dog对象保存在文件中,可以从文件中恢复.
3.上述要求是能够序列化和反序列化基本数据类型或对象
4.1序列化和反序列化6281.序列化是指在保存数据时,保存数据的值和类型
2.反序列化是指在恢复数据时,恢复数据的值和类型
3.如果某个对象需要支持序列化机制,则必须使其类可序列化。为了使某个类可序列化,该类必须实现以下两个接口之一:
Serializable///这是一个标记接口,没有办法
Externalizable//有办法实现这个接口,所以我们通常会实现上面的Serializable接口
4.2对象流介绍功能:为基本类型或对象类型提供序列化和反序列化的方法
Objectoutstream提供序列功能
Objectinputstream提供反序列功能
4.3应用案例Objectoutstream序列6291.使用Objectoutstream序列化基本数据类型和Dog对象(name,age),并
保存到data.在dat文件中
com中的代码.stulzl.objectoutputstream_.包中Dog类4.4案列也有这个Dog
package com.stulzl.objectoutputstream_;import java.io.Serializable;//如果需要序列化某一类的对象,需要实现Serializable接口或Externalizable接口publice class Dog implements Serializable { private String name; private int age; //serialVersionUID 序列化版本号,兼容性privatete可以提高 static final long serialVersionUID = 1L; public Dog(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; }}
ObjectOutputStream_
package com.stulzl.objectoutputstream_;import java.io.FileOutputStream;import java.io.ObjectOutputStream;//应用案例Objectoututstreamt 完成序列化 629/1.使用Objectoutstreama 基本数据类型的序列化和Dog对象(name, age),并///保存到data.publicic在dat文件中 class ObjectOutputStream_ { public static void main(String[] args) throws Exception { ///序列化后,保存的文件格式不存储文本,而是按照他的格式保存 String filePath = "e:\\data.dat"; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath)); ///序列化数据到e:\data.txt ///这里的int boolean char double String实现了Serializable接口 //所以可以序列化 oos.writeInt(100);// int -> Integer (实现了 Serializable) oos.writeBoolean(true);//// boolean -> Boolean (实现了 Serializable) oos.writeChar('a');// char -> Character (实现了 Serializable) oos.writeDouble(9.5);// double -> Double (实现了 Serializable) oos.writeUTF(中国);///String类型(实现 Serializable) ///保存一个dog对象 oos.writeObject(new Dog(“旺财”,10)); oos.close(); System.out.println(完成数据序列化); }}
4.4应用案例Objectinputstream反序列化6300
2.使用Objectinputstream读取datata.dat和反序列化恢复数据
com中的代码.stulzl.objectinputstream_.包中ObjectInputStream_
package com.stulzl.objectinputstream_;import com.stulzl.objectoutputstream_.Dog;import java.io.FileInputStream;import java.io.ObjectInputStream;//应用案例Objectinputstream反序列化 630//2. 使用Objectinputstream读取datata.数据publiccat反序列化恢复 class ObjectInputStream_ { public static void main(String[] args) throws Exception { //指定反序列化文件 String filePath = "e:\\data.dat"; ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath)); //读取 //读取(反序列化)的顺序需要与您保存的数据的顺序一致,否则会出现异常 System.out.println(ois.readInt()); System.out.println(ois.readBoolean()); System.out.println(ois.readChar()); System.out.println(ois.readDouble()); System.out.println(ois.readUTF());///这是读取字符串 //dog 编译类型是 Object , dog 操作类型是 Dog Object dog = ois.readObject();///这里接收dog对象 System.out.println(运行类型=”+dog.getClass()); System.out.println(dog信息=”+dog);//底层 Object->Dog //这是一个特别重要的细节: //1. 假如我们想调用Dog的方法, 需要向下转型 //2. 我们需要定义Dog类,放在可引用的位置 Dog dog2 = (Dog)dog; System.out.println(dog2.getName()); //旺财 //关闭流 ois.close(); System.out.println(“反序列化”); }}
5.对象节点流和处理流细节631
1)读写顺序要致
2)Serializablee对象需要序列化或反序列化
3)建议在序列化类中添加SerialVersionUID,以提高版本的兼容性
4)在序列化对象中,默认情况下,除了static或transient修改的成员外,所有属性都是序列化的。
5)在序列化对象中,要求内部属性的类型也需要序列化接口
6)序列化是可继承的,也就是说,如果某一类已经实现了序列化,那么它的所有子类都已经默认实现了序列化
6.标准输入输出流6326.1介绍632 6.2应用案例标准输入输出流632Systemem传统方法.out.println(””);使用out对象将数据输出到显示器
Scannner是从标准输入键盘接收数据的传统方法
com中的代码.stulzl.standard_.InputAndoutputut包
package com.stulzl.standard_;import java.util.Scanner;///演示标准输入输出流 632public class InputAndOutput_ { public static void main(String[] args) { //System.in是 System类中的属性-public final static InputStream in = null // System.in 编译类型 InputStream // System.in 运行类型 BufferedInputStream // 表示标准输入 键盘 System.out.println(System.in.getClass()); //System.out是 System类中的属性-public final static PrintStream out = null; //2. 编译类型 PrintStream //3. 运行类型 PrintStream //4. 表示标准输出 显示器 System.out.println(System.out.getClass()); //例,这个例子没有特殊意义,不需要追究 System.out.println("hello,world"); Scanner scanner = new Scanner(System.in); System.out.println(“请输入内容”; String next = scanner.next(); System.out.println("next="+next); }}
7.转换流Inputstreamreader和outputstreamwriter6337.1先看一个文件乱码问题,引出转换流的必要性。633com中的代码.stulzl.transformation_.CodeQuestion_
package com.stulzl.transformation_;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;///先看文件乱码问题,导致学习转换流的必要性. 633public class CodeQuestion_ { public static void main(String[] args) throws IOException { //读取 e:\\a.txt 文件到程序 //思路 //1. 创建字符输入流 BufferedReader [处理流] //2. 使用 BufferedReader 对象读取 a.txt //3. 默认情况下,读取文件是按照的 utf-8 编码 String filePath = "e:\\a.txt"; BufferedReader br = new BufferedReader(new FileReader(filePath)); ///我们在默认读取文件数据时遵循utf-8 编码的,但是,我们改变了文件的编码形式 // ,再读的时候会出现乱码问题 String s = br.readLine();///按行读取 System.out.println(”读取的内容为=”+s); br.close(); }}
7.2基本介绍634
1.InputStreamReader:Reader的子类可以将InputStream(字节流)包装成(转换)Reader(字符流)
2.OutputStreamWriter:Writer子类将OutputStream(字节流)包装成Writer(字符流)
3.在处理纯文本数据时,如果使用字符流更有效,并且能有效地解决中文问题,建议将字节流转换为字符流
4.使用时可指定编码格式(如utf8,gbk,gb2312,IS0859-1等。
7.3Inputstreader字节输入转换流编程将字节流FileinputStream包装成(转换成)字符流InputStreamReader,读取文件(按utf-8/gbk格式),然后包装成bufferedReader
com中的代码.stulzl.inputstreamreader_.包中InputStreamReader_
package com.stulzl.inputstreamreader_;import java.io.*;///演示InputStreamreader转换流,解决中文乱码问题。 634// 将字节流 FileInputStream 转成字符流 InputStreamReader, 指定编码 gbk/utf-8// 读取文件(按utf-8/gbk格式),然后包装成Bufferedreadpublic class InputStreamReader_ { public static void main(String[] args) throws IOException { String filePath = "e:\\a.txt"; //解读 //1. 把 FileInputStream 转成 InputStreamReader //2. 指定编码为 gbk InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk"); //3. 把 InputStreamReader 传入 BufferedReader BufferedReader br = new BufferedReader(isr); //将 2 和 3 合在一起////// BufferedReader br = new BufferedReader(new InputStreamReader(// new FileInputStream(filePath), "gbk")); //读取 String s = br.readLine();///按行读取 System.out.println(”读取的内容为=”+s); //关闭流 br.close(); }}
7.4案例OutputstreamWriter字节输出转换流635
2.编程将字节流Fileoutstream包装成(转换成)字符流OutstreamWriter,并写入文件(按gbk格式指定,如utf-8)
com中的代码.stulzl.outputstreamwriter_.包中OutputStreamWriter_
package com.stulzl.outputstreamwriter_;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;//演示 OutputStreamWriter 使用 635//2.编程将字节流Fileoutstream包装成(转换成)字符流OutputstreamWriter,// 写入文件(按gbk格式,可指定其他文件,例如utf-8)public class OutputStreamWriter_ { public static void main(String[] args) throws IOException { String filePath = "e:\\lzl.txt"; String charSet = "utf-8"; OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet); osw.write("hi,中国");///按gbk编码输出此句:\lzl.txt osw.close(); System.out.println("按照 "+charSet+“成功保存文件”); }}