欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java之IO流进阶篇:内存流,打印流,对象流

程序员文章站 2022-03-26 21:53:16
Java中的IO流,即为输入输出流。所谓输入输出流,都是相对于程序而言,程序就是这个参照物。一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputStream,Writer 输入输出流子类众多,详情见下图: 1.内存流 用来操作内存 ByteArr ......

java中的io流,即为输入输出流。所谓输入输出流,都是相对于程序而言,程序就是这个参照物。一张图看懂输入输出流:

 Java之IO流进阶篇:内存流,打印流,对象流

  输入流抽象基类:inputstream,reader

  输出流抽象基类:outputstream,writer

  输入输出流子类众多,详情见下图:

  Java之IO流进阶篇:内存流,打印流,对象流

1.内存流

  用来操作内存

  bytearrayinputstream     内存到程序  不需要关闭  不使用内存资源,内存不够建议不用

  bytearrayoutputstream  程序到内存  不需要关闭  不使用内存资源,内存不够建议不用

Java之IO流进阶篇:内存流,打印流,对象流

内存输入流和内存输出流:

首先创建字节数组,一般引用数据类型存放在内存中。显然此时,可以创建字节数组输入流,读入程序当中。

package com.test;

import java.io.bytearrayinputstream;
import java.io.ioexception;

public class bytearrayinputstreamdemo {

    public static void main(string[] args) throws ioexception {
        // todo auto-generated method stub
        //1.创建字节数组(要读取的数据)
        byte[] data= {10,15,50,33,12,22};
        //2.创建流
        bytearrayinputstream bais=new bytearrayinputstream(data);
        //3.读取
//        int d;
//        while((d=bais.read())!=-1) {
//            system.out.println(d);
//        }
//        bais.close();//实际操作中无需关闭流
        byte[] buf=new byte[1024];
        int len;
        while((len=bais.read(buf))!=-1) {
            for (int i = 0; i < len; i++) {
                system.out.println(buf[i]);
            }
        }
    }
}

 

package com.test;

import java.io.bytearrayoutputstream;

public class bytearrayoutputstreamdemo {

    public static void main(string[] args) {
        // todo auto-generated method stub
        //1.创建字节数组输出流对象
        bytearrayoutputstream baos=new bytearrayoutputstream();
        //2.写入数据
        baos.write(12);
        baos.write(20);
        baos.write(18);
        baos.write(32);
        //3.获取输出流中的字节数据
        byte[] data=baos.tobytearray();
        for (byte b : data) {
            system.out.println(b);
        }
    }
}

 

 

使用内存流读取图片:

package com.test;

import java.io.bytearrayinputstream;
import java.io.bytearrayoutputstream;
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;

public class readimg {

    public static void main(string[] args) throws ioexception {
        // todo auto-generated method stub
        //1.创建文件字节输入流
        fileinputstream fis=new fileinputstream("e:\\xx.png");
        bytearrayoutputstream baos=new bytearrayoutputstream();
        byte[] buf=new byte[1024];
        //2.读取数据
        int len;
        while((len=fis.read(buf))!=-1) {
            baos.write(buf,0,len);
        }
        //3.获取图片数据
        byte[] imgbyte=baos.tobytearray();
        system.out.println(imgbyte.length);
        //4.创建文件输出流
        fileoutputstream fos=new fileoutputstream("e:\\xx1.png");
        bytearrayinputstream bais=new bytearrayinputstream(imgbyte);
        //5.读取数组
        byte[] buf1=new byte[1024];
        int len1;
        while((len1=bais.read(buf1))!=-1) {
            fos.write(buf1,0,len1);
        }
        fis.close();
        fos.close();
        bais.close();
        baos.close();
    }

}

 

2.打印流

  printsream:操作字节,自动刷新,可设置字符集

  printwriter :不能操作字节,内部有缓冲区

 

打印字节流实例:

package com.test;

import java.io.bufferedoutputstream;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.printstream;

public class printstreamdemo {
    //打印流(字节)
    public static void main(string[] args) throws ioexception {
        // todo auto-generated method stub
        //printstream ps=new printstream("e:\\aaa.txt");
        bufferedoutputstream bos=new bufferedoutputstream(new fileoutputstream("e:\\xx.txt"));
        printstream ps=new printstream(bos,true);
        ps.print("123456");
        ps.print(true);
        ps.println("abcdef");
        ps.printf("%d", 200);
        ps.printf("%.2f", 3.1415926);
        ps.printf("%s", "我爱生活");
        ps.printf("%x", 256);
        
    }

}

 打印字符流实例:

package com.test;

import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.filewriter;
import java.io.ioexception;
import java.io.printwriter;

public class printwriterdemo {

    public static void main(string[] args) throws ioexception {
        // todo auto-generated method stub
        printwriter pw=new printwriter(new fileoutputstream("e:\\bbb.txt"));
        pw.println("123");
        pw.close();
    }

}

 

 

3.对象序列化与反序列化(对象流)

  本例举一个学生类student.class序列化和反序列化的过程。

创建的学生类:

package com.test;

import java.io.serializable;

public class student implements serializable {
        private static final long serialversionuid=123l;//序列化与反序列化的唯一标记
        private int stuno;//序列化和访问权限没有关系
        string name;
        //transient int age;//transient 瞬时的,不能序列化瞬时的属性
        //static string address="北京";//静态变量不能被序列化
        public student() {
            super();
            // todo auto-generated constructor stub
        }
        
        public student(int stuno, string name) {
            super();
            stuno = stuno;
            this.name = name;
        }

        public int getstuno() {
            return stuno;
        }
        public void setstuno(int stuno) {
            stuno = stuno;
        }
        public string getname() {
            return name;
        }
        public void setname(string name) {
            this.name = name;
        }
        
}

 

  

使用对象类序列化和反序列化学生类:

package com.test;

import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.objectinputstream;
import java.io.objectoutputstream;

public class serializedemo {

    public static void main(string[] args) throws ioexception, classnotfoundexception {
        //序列化过程:
        //1.创建序列化对象
        student stu=new student(1101,"小明");
        //2.创建文件输出流
        fileoutputstream fos=new fileoutputstream("e:\\receive.bin");
        //3.创建对象流接入输出流
        objectoutputstream oos=new objectoutputstream(fos);
        //4.对象流输出序列化对象保存在文件中
        oos.writeobject(stu);
        oos.close();
        //反序列化过程:
        //1.创建对象流
        fileinputstream fis=new fileinputstream("e:\\receive.bin") ;
        objectinputstream ois=new objectinputstream(fis);
        //2.反序列化
        student stu1=(student)ois.readobject();
        ois.close();
        system.out.println("学号:"+stu1.getstuno());
        system.out.println("姓名:"+stu1.getname());
    }
}

控制台输出信息(表明反序列化成功):

Java之IO流进阶篇:内存流,打印流,对象流