Java关于IO流的介绍(2)

4.BufferedInputStream和BufferedOutputStream

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。

在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。

在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

Java关于IO流的介绍

BufferedOutputStream 该类实现缓冲的输出流。

通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

Java关于IO流的介绍

下面讲一个例子:

package com.chen.test;

import Java.io.*;
/**
 *
 * @author 陈家小帅
 *
 */
public class Test4 {
    public static void main(String[] args) throws Exception {
        String path1 = "E:/WorkSpace/Mouth/bin/Dest.txt";
        String path2 = "E:/WorkSpace/Mouth/bin/D.txt";   
        ReadByBIS(path1, path2);
    }
/**
    * 使用BufferInputStream将一个文件的内容写入到另一个文件中,并在控制台输出
    *
    * @param path1
    * @param path2
    * @throws Exception
    */
    public static void ReadByBIS(String path1, String path2) throws Exception {
        InputStream in = new BufferedInputStream(new FileInputStream(path1));    //创建文件输入流
        OutputStream out = new BufferedOutputStream(new FileOutputStream(path2));    //创建文件输出流
        byte[] buffer = new byte[1024];                    //定义字节数组
        int len = 0;
        while ((len = in.read(buffer)) > 0) {            //将最多buffer.lenth个字节的数据读入byte数组中
            out.write(buffer, 0, len);                    //将读取到的信息写入到文件中
            out.flush();                                // 刷新此缓冲的输出流
            String s = new String(buffer, 0, len);        //将读入的字节转换成String类型
            System.out.println(s);                        //输出读取到的信息
        }               
        in.close();                        //关闭输入输出流
        out.close();
    }
}

输出结果:

Java关于IO流的介绍

如果大家学过设计模式中的装饰者模式,会很容易发现BufferedinputStreamBufferedOutputStream其实是对FileInputStream和FileOutputStream进行了包装。

为它创建一个内部缓冲区数组,应用程序就可以将各个字节读/写入底层输出流中,而不必针对每次字节读/写入调用底层系统。

5.读写对象:ObjectInputStream 和ObjectOutputStream

该流允许读取或写入用户自定义的类,但是要实现这种功能,被读取和写入的类必须实现Serializable接口,

其实该接口并没有什么方法,可能相当 于一个标记而已,但是确实不合缺少的。

例子如下:

package com.chen.test;

import java.io.*;
/**
 *
 * @author 陈家小帅
 *
 */
public class Test4 {
    public static void main(String[] args) throws Exception {
        String path1 = "E:/WorkSpace/Mouth/bin/Dest.txt";
        String path2 = "E:/WorkSpace/Mouth/bin/D.txt";
        ReadbyOnjiect(path2);
    }
public static void ReadbyOnjiect(String path2){
        ObjectInputStream oibs = null;
        ObjectOutputStream oobs = null;
        try {
            oobs = new ObjectOutputStream(new FileOutputStream(path2));
            oobs.writeObject(new Student("张三", 18));
            oobs.writeObject(new Student("李四", 18));
            oibs = new ObjectInputStream( new FileInputStream(path2));
            for(int i=0;i<2;i++){
                System.out.println(oibs.readObject());
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    oibs.close();
    oobs.close();


}
//自定义的类实现了Serializable接口,可序列化
class Student implements Serializable{
    private String name;
    private int age;
    public Student(String name,int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student[name="+name+",age="+age+"]";
    }
}

6.读写对象:DataInputStream和DataOutputStream

DataInputStream、DataOutputStream来写入或读出数据。DataInputStream的好处在于在从文件读出数据时,不用费心地自行判断读入字符串时或读入int类型时何时将停止,使用对应的readUTF()和readInt()方法就可以正确地读入完整的类型数据。

下面是一个例 子:

package com.chen.test;

import java.io.*;

/**
 *
 * @author 陈家小帅
 *
 */
public class Test4 {
    public static void main(String[] args) throws Exception {
        String path1 = "E:/WorkSpace/Mouth/bin/Dest.txt";
        String path2 = "E:/WorkSpace/Mouth/bin/D.txt";
        DataReader(path2);
    }
/**
 * 用DataOutputStream和DataInputStream将类写入到文件中,然后读出
 * @param path1
 */
    public static void DataReader(String path1){
        Student[] student = {
                new Student("zs", 18),
                new Student("ls", 20)};
        try {
            DataOutputStream oups = new DataOutputStream(new FileOutputStream(path1));
            DataInputStream  dips = new DataInputStream(new FileInputStream(path1));
            for (Student s : student) {
                //写入数据
                oups.writeUTF(s.getName());
                oups.writeInt(s.getAge());
            }
            oups.flush();
            oups.close();
            for(int i = 0 ; i<student.length;i++){
                String name = dips.readUTF();
                int age = dips.readInt();
                student[i] = new Student(name, age);
            }
            for (Student student2 : student) {
                System.out.println(student2.getName()+"  "+student2.getAge());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
class Student implements Serializable {
    private String name;
    private int 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;
    }

public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

@Override
    public String toString() {
        return "Student[name=" + name + ",age=" + age + "]";
    }

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/de98a15c32c69e323f65017ebb47404c.html