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

六、Java IO流 之内存操作流

程序员文章站 2024-03-05 18:36:07
...

在之前实际上使用的基本上都属于文件流,在用文件流处理的时候操作的终端就是磁盘上的文件内容。

文件流
六、Java IO流 之内存操作流

在java.io包里面对于内存操作流提供有两类支持:
字节内存流:ByteArrayInputStream、ByteArrayOutputStream;
字符内存流:CharArrayReader、CharArrayWriter。

以字节内存流为例,来观察字节内存流的继承结构以及它提供的构造方法。

内存流 ByteArrayInputStream、ByteArrayOutputStream

继承结构:

public class ByteArrayInputStream extends InputStream
public class ByteArrayOutputStream extends OutputStream

构造方法:

ByteArrayInputStream(byte[] buf) 
          创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。
ByteArrayOutputStream() 
          创建一个新的 byte 数组输出流。

内存流继承结构图
六、Java IO流 之内存操作流
内存流
六、Java IO流 之内存操作流

例:使用内存流实现一个字符串大写转小写的操作

public class TestDemo_05 {
    public static void main(String[] args)throws Exception{
        //设置要进行处理的操作数据
        InputStream inputStream = new ByteArrayInputStream("helloyouguys".getBytes());
        OutputStream outputStream = new ByteArrayOutputStream();
        int data=0; //读取单个内容
        while((data=inputStream.read())!=-1){ //数据全部都在内存输出流中
            outputStream.write(Character.toUpperCase(data));
        }
        System.out.println(outputStream.toString()); //输出内存流取出的数据
        outputStream.close();
        inputStream.close(); //关闭流
    }
}

执行结果:
六、Java IO流 之内存操作流
对于此时的代码实质上就是在内存里面专门又开辟了一块新的空间进行数据的IO处理,本次实现了IO处理但是又没有产生任何的文件,所以那些临时的操作文件就可以基于IO的形式完成,可以采用内存流处理。

ByteArrayOutputStream类里面有一个方法非常有意义:public byte[] toByteArray(),将所有保存在内存输出流中的数据全部以字节数组的形式返回。

public byte[] toByteArray()创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。 

返回:
以 byte 数组的形式返回此输出流的当前内容。

在最初的时候使用InputStream读取数据会比较尴尬,因为它在进行数据读取的时候必须首先开辟一个完整的字节数组,而后进行数据的部分读取,如果面对数据量较大的情况下,如果要想将内容全部读取进来,实际上就必须利用内存输出流来进行操作,即:分批将数据保存在内存输出流里面,读取完成后再使用
toByteArray() 方法 再取出全部内容

例: 使用内存输出流读取文件的全部内容

public class TestDemo_05 {
    public static void main(String[] args)throws Exception{
        //设置要进行处理的操作数据
        InputStream inputStream = new FileInputStream("d:"+File.separator+"zz.jpg");
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte data[] = new byte[1024];
        int len=0;
        while((len=inputStream.read(data))!=-1){
            output.write(data,0,len); //把数据保存在内存输出流

        }
        System.out.println(new String(output.toByteArray()));//获取全部的内容
        inputStream.close();
        output.close(); //关闭流


    }
}

从JDK1.9之后即便不知道以上方法的使用形式,实际上也可以实现内容的全部读取,因为InputStraem类中
提供了“readAllBytes()”方法。

相关标签: Java重点知识