IO(三)字节流练习

public class ByteStreamDemo {

    /*
        int available();                         可以取得输入文件的大小(字节个数),没有返回0
        void close();                            关闭输入流
        abstract int read();                    读取一个字节,并把读到的字节返回,没有返回-1
        int read(byte[] b);                        将内容读到byte数组,并且返回读入的字节的个数。,没有返回-1
        int read(byte[] b ,int off ,int len);    将内容读到byte数组,从off开始读,读len个结束。,没有返回-1
     */

    /*
        public void close();                    关闭输出流。
        public void flush();                    刷新缓冲区。
        public void write(byte[] b);            将byte数组写入数据流
        write(byte[] b ,int off ,int len);        将指定范围的数据写入数据流。
        public abstract void write(int b);        将一个字节数据写入数据流
     */

    //输入流没有找到文件报异常,输出流没有文件会自动创建

    public static void executeByteFile(){
        File inFile = new File("D:"+File.separator+"intest.txt");
        File outFile = new File("D:"+File.separator+"outtest.txt");

        long start = System.currentTimeMillis();

        FileInputStream in = null;
        OutputStream out = null;
        try {
             in = new FileInputStream(inFile);
             //true表示在原文件上追加。
             out = new FileOutputStream(outFile,true);

            byte[] inb = new byte[1024];

            int size = 0;
            while ((size = in.read(inb)) != -1) {
//                System.out.println(new String(inb,0,size,"gbk"));
                out.write(inb, 0, size);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            CloseUtil.close(out);
            CloseUtil.close(in);
        }

        System.out.println("结束时间:"+(System.currentTimeMillis() - start));
    }

    /**操作字节数组的输入流
     * @throws IOException */
    public static void executeByteIn() throws IOException{
        final String str = "我爱中华!";
        byte[] bytes = str.getBytes();

        ByteArrayInputStream byin = new ByteArrayInputStream(bytes);
        byte[] db = new byte[3];
        int read = byin.read(db);
        while ( read !=-1 ) {
            String s = new String(db,0,read,"UTF-8");

            System.out.println(s);
            read = byin.read(db);
        }

        byin.close();
    }

    /**操作字节数组的输出流
     * @throws IOException */
    public static void executeByteOut() throws IOException{
        final String str1 = "我爱中华!";
        final String str2 = "字节数组输出流!";
        byte[] bytes1 = str1.getBytes();
        byte[] bytes2 = str2.getBytes();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        out.write(bytes1);
        out.write(bytes2);

        //先把数据都写进字节数组输出流中。之后统一输出
        System.out.println(out.toString());
        out.close();
    }

    /** 管道流*/
    public static void executePip() throws IOException{
        PipedByteOut out = new PipedByteOut();
        PipedByteIn in = new PipedByteIn();
        out.getOut().connect(in.getIn());

        Thread inThread = new Thread(in,"thread-piped-in");
        Thread outThread = new Thread(out,"thread-piped-out");
        inThread.start();
        outThread.start();
    }

    /** 缓存字节流*/
    public static void executeBufferStream() throws Exception{
        File inFile = new File("D:"+File.separator+"intest.txt");
        File outFile = new File("D:"+File.separator+"outtest.txt");

        long start = System.currentTimeMillis();
        BufferedInputStream inbuffer = new BufferedInputStream(new FileInputStream(inFile));
        BufferedOutputStream outbuffer = new BufferedOutputStream(new FileOutputStream(outFile,true));

        byte[] inb = new byte[1024];

        int size = 0;
        while ((size = inbuffer.read(inb)) != -1) {

            outbuffer.write(inb, 0, size);
        }
        outbuffer.flush();
        CloseUtil.close(outbuffer);
        CloseUtil.close(inbuffer);
        System.out.println("结束时间:"+(System.currentTimeMillis() - start));
    }

    /** 对象流可以将对象序列化*/
    public static class SerializeUtil{

        public static byte[] serializeObject(Object object){
            ObjectOutputStream out = null;
            ByteArrayOutputStream by = new ByteArrayOutputStream();

            try {
                out = new ObjectOutputStream(by);
                out.writeObject(object);
                return by.toByteArray();
            } catch (IOException e) {
                throw new RuntimeException("对象序列化错误");
            }finally{
                CloseUtil.close(by);
                CloseUtil.close(out);
            }
        }

        public static <T> T unSerialized(byte[] by){
            if(by == null || by.length == 0) return null;
            ByteArrayInputStream byin = null;
            ObjectInputStream in = null;
            try {
                 byin = new ByteArrayInputStream(by);
                 in = new ObjectInputStream(byin);
                return (T) in.readObject();
            } catch (IOException | ClassNotFoundException e) {
                throw new RuntimeException("对象反序列化错误");
            }finally{
                CloseUtil.close(in);
                CloseUtil.close(byin);
            }
        }
    }

    public static void main(String[] args) throws Exception{
        User user = new User();
        user.setAddres("地址");
        user.setId(1);
        user.setName("测试");

        byte[] bs = SerializeUtil.serializeObject(user);

        Object object = SerializeUtil.unSerialized(bs);
        System.out.println(object);

    }
}

class PipedByteIn implements Runnable{

    private PipedInputStream in = new PipedInputStream();

    @Override
    public void run() {
        try {

            byte[] by = new byte[1024];
            int i = in.read(by);
            while (i != -1) {
                System.out.println(new String(by,0,i,"UTF-8"));
                i = in.read(by);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            CloseUtil.close(in);
        }
    }

    public PipedInputStream getIn(){
        return in;
    }
}

class PipedByteOut implements Runnable{
    private PipedOutputStream out = new PipedOutputStream();

    @Override
    public void run() {
        byte[] bytes = "我爱中华!".getBytes();
        try {
            out.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            CloseUtil.close(out);
        }
    }

    public PipedOutputStream getOut(){
        return out;
    }
}

class User implements Serializable{

    private static final long serialVersionUID = 1L;

    private Integer id;
    private String name;
    //transient代表该字段不被序列化
    private transient String addres;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddres() {
        return addres;
    }
    public void setAddres(String addres) {
        this.addres = addres;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", addres=" + addres + "]";
    }
}
class CloseUtil{
    public static void close(Closeable closeable){
        if(closeable != null){
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
时间: 2024-10-04 19:39:28

IO(三)字节流练习的相关文章

Java IO: 其他字节流(上)

作者: Jakob Jenkov 译者: 李璟([email protected]) 本小节会简要概括Java IO中的PushbackInputStream,SequenceInputStream和PrintStream.其中,最常用的是PrintStream,System.out和System.err都是PrintStream类型的变量,请查看Java IO: System.in, System.out, System.err浏览更多关于System.out和System.err的信息. P

IO流--字节流

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.LineNumberReader; import j

C++ 异步 IO(三) 异步IO

The oldest solution that people still use for this problem is select(). The select() call takes three sets of fds (implemented as bit arrays): one for reading, one for writing, and one for "exceptions". It waits until a socket from one of the se

IO(三)IO流之字节流与字节缓冲流(转)

在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,它们都是抽象类,不能实例化,数据流中的最小单位是字节,所以叫做字节流. 一.InputStream中的读取数据的方法如下: 1 .int read() 功能:读取一个字节的数据,并且返回读到得数据,如果返回-1,则表示读到输入流的末尾. 2.int read(byte[] b) 功能:从输入流中读取一定量的字节,并将其存储在字节数组b中,返回实际读取的字节数,如果返回-

java IO的字节流和字符流及其区别

1. 字节流和字符流的概念    1.1 字节流继承于InputStream    OutputStream,    1.2 字符流继承于InputStreamReader    OutputStreamWriter.在java.io包中还有许多其他的流,主要是为了提高性能和使用方便. 2. 字节流与字符流的区别    2.1 要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这

Java之IO流---字节流

1.1 IO流的引入 IO流在很多语言已有体现,诸如C语言的stdio.h,C++中的iostream.Java中的IO流大抵是用于在控制台.磁盘.内存上进行数据的读写操作,完成数据的传递. 我们可以对它进行如下分类: 按处理的数据类型可分为字节流与字符流 按流的流向可分为输入流(in)与输出流(out) 按流的功能可分为节点流(Node)和过滤流(Filter) 本篇侧重于梳理字节流相关的知识,毕竟作为字符流的前辈,它还是非常重要的.下篇继续梳理字符流. 1.2 IO流的继承体系图 大概描述了

黑马程序员------IO(三)

1.1 通过字节流演示读取键盘录入. System.out:对应的是标准输出设备,控制台.System.in:对应的标准输入设备:键盘. 代码 InputStream in=System.in; int by=in.read(); sop(by);结束录入 in.close(); 1.1.1 需求:通过键盘录入数据(示例1): 当录入一行数据后,就将该行数据进行打印.如果录入的数据是over,那么停止录入. 分析:键盘本身就是一个标准的输入设备.对于java而言,对于这种输入设备都有对应的对象.

java IO流——字节流

字节流主要操作byte类型数据,以byte数组为准,主要操作类有InputStream(字节输入流).OutputSteam(字节输出流)由于IputStream和OutputStream都是抽象类,所要要用这两个类的话,则首先要通过子类实例化对象.下面就是这两个类的一些子类结构图 一.InputStream中的读取数据的方法如下: 1 .int read() 功能:读取一个字节的数据,并且返回读到得数据,如果返回-1,则表示读到输入流的末尾. 2.int read(byte[] b) 功能:从

黑马程序员——Java基础---IO(三)--File类、Properties类、打印流、序列流(合并流)

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作,因此是对流操作的一种补充 3)File类的实例是不可变的:也就是说,一旦创建,