当前位置: 首页 > 图灵资讯 > 技术篇> 节点流和处理流二

节点流和处理流二

来源:图灵教育
时间:2023-05-22 09:23:34

1.节点流和处理流接2.处理流bufferedinputstream和bufferedoutstream2.1介绍bufferedinputstream62.6

节点流和处理流二_System

bufferedinputstream是创建bufferedinputstream的字节流。.

节点流和处理流二_java_02

2.2介绍Bufferedoutstream62

节点流和处理流二_java_03

bufferedoutstream是字节流,实现缓冲输出流,可以将多个字节写入底层输出流,而无需调用底层系统

节点流和处理流二_节点流和处理流_04

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序列化和反序列化628

1.序列化是指在保存数据时,保存数据的值和类型

2.反序列化是指在恢复数据时,恢复数据的值和类型

3.如果某个对象需要支持序列化机制,则必须使其类可序列化。为了使某个类可序列化,该类必须实现以下两个接口之一:

Serializable///这是一个标记接口,没有办法

Externalizable//有办法实现这个接口,所以我们通常会实现上面的Serializable接口

节点流和处理流二_System_05

4.2对象流介绍

功能:为基本类型或对象类型提供序列化和反序列化的方法

Objectoutstream提供序列功能

Objectinputstream提供反序列功能

节点流和处理流二_java_06

节点流和处理流二_节点流和处理流_07

4.3应用案例Objectoutstream序列629

1.使用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

节点流和处理流二_System_08

6.2应用案例标准输入输出流632

Systemem传统方法.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等。

节点流和处理流二_System_10

节点流和处理流二_序列化_11

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();    }}

 

节点流和处理流二_序列化_12

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+“成功保存文件”);    }}

节点流和处理流二_序列化_13