IO中其他流--节点流

来源:互联网 发布:足迹美图软件 编辑:程序博客网 时间:2024/06/05 13:28

节点流

1、字节数组节点流
输入流:ByteArrayInputStream read(byte[] b,int off,int len) + close()
输出流:ByteArrayOutputStream write(byte[] b,int off,int len) + toByteArray()(父类没有的新方法,不要使用多态)

import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;/** * 字节数组节点流 * 数组的长度有限,数据量不会很大 */public class ByteArrayStream {    public static void main(String[] args) throws IOException {        read(write("传入字符"));    }    /**     * 输入流操作与文件输入流操作一致     * 读取字节数组     * @throws IOException      */    public static void read(byte[] src) throws IOException{        //数据源(模拟其它电脑上的内存)//      String msg = "输入流操作与文件输入流操作一致";//      byte[] src = msg.getBytes();        //数据源改为传入        //选择流        InputStream is = new BufferedInputStream(            new ByteArrayInputStream(                src                 )        );        //操作        byte[] flush = new byte[1024];        int len = 0;        while(-1 != (len=is.read(flush))){            System.out.println(new String(flush,0,len));        }        //释放资源,可以不调用        is.close();    }     /**     * 输出流操作与文件输出流有些不同,有新增方法,不能使用多态     * @throws IOException      */    public static byte[] write(String msg) throws IOException{        //目的地        byte[] des;        //选择流   与文件输出流的一个不同点:没有传入参数        ByteArrayOutputStream baos = new ByteArrayOutputStream();        //操作    写出        //String msg = "输出流操作与文件输出流有些不同,有新增方法,不能使用多态";        byte[] info = msg.getBytes();        baos.write(info,0,info.length);        //获取数据        des = baos.toByteArray();        //释放资源        baos.close();        return des;    }}

字节数组流、与文件流对接,也就是利用节点流实现文件的拷贝

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;/** * 1、文件 -程序->字节数组 * 文件输入流 * 字节数组输出流 * 2、字节数组 -程序->文件 * 字节数组输入流 * 文件输出流 */public class ByteArrayAndFile {    public static void main(String[] args) throws IOException {        byte[] data = getBytesFromFile("D:/安装包/aa/bb/a.txt");//        System.out.println(new String(data));        toFileFromByteArray(data,"D:/安装包/aa/bb/c.txt");    }    /**     * 1、文件 -程序->字节数组     * @param srcPath     * @return     * @throws IOException     */    public static byte[] getBytesFromFile(String srcPath) throws IOException{        //创建文件源        File src = new File(srcPath);        //创建字节数组目的地        byte[] des = null;        //选择流        //文件输入流        InputStream is = new BufferedInputStream(new FileInputStream(src));        //字节数组输出流   不能使用多态        ByteArrayOutputStream baos = new ByteArrayOutputStream();        //操作    不断读取文件,写出到字节数组流中        byte[] flush = new byte[1024];        int len = 0;        while(-1 != (len=is.read(flush))){            //写出到字节数组流中            baos.write(flush,0,len);        }        baos.flush();        //获取数据,因为inputStream里面的内容你不知道具体有多长,所以无法确定到底buffer需要多长1024也许未必够用,所以只能把buffer当做缓存,        //每次读进一部分,在把buffer的内容,写到足够大的内存区。如果你确定你的输入流中字节数小于1024,你也可以直接返回buffer        //ByteArrayOutputStream时将数据窜存放在管道中,但是FileOutputStream将数据写入到文件中,所以需要使用这个方法将数据取出来使用        des = baos.toByteArray();        //释放资源        baos.close();        is.close();        return des;    }    /**     * 2、字节数组 -程序->文件     */    public static void toFileFromByteArray(byte[] src,String desPath) throws IOException{        //创建源        //目的地        File des = new File(desPath);        //选择流        //字节数组输入流        InputStream is = new BufferedInputStream(new ByteArrayInputStream(src));        //文件输出流        OutputStream os = new BufferedOutputStream(new FileOutputStream(des));        //操作    不断读取字节数组        byte[] flush = new byte[1024];        int len = 0;        while(-1 != (len=is.read(flush))){            //写出到文件中            os.write(flush, 0, len);        }        os.flush();        //释放资源        is.close();        os.close();    }}