字节流InputStream/OutputStream

简介:

字节流InputStream/OutputStream

本篇将对JAVA I/O流中的字节流InputStream/OutputStream做个简单的概括:

总得来说,每个字节流类都有一个对应的用途,如下:

  • ByteArrayInputStream/ByteArrayOutputStream     //字节数组相关
  • FileInputStream/FileOutputStream                        //文件操作相关
  • PipedOutputStream/PipedInputStream                  //线程间通信(管道)    
  • BufferedInputStream/BufferedOutputStream         //装饰其它字节流,增加缓冲功能                 
  • FilterInputStream/FilterOutputStream                    //装饰其它字节流,增加一些过滤处理
  • PushbackInputStream                                           //装饰其它字节流,增加回退读取功能            
  • DataOutputStream/DataInputStream                     //装饰其它字节流,增加对JAVA基本数据类型的读取/写入功能        
  • PrintStream                                                           //装饰其它字节流,增加格式化数据写入功能
  • ObjectInputStream/ObjectOutputStream               //装饰其它字节流,增加对象的序列化,以字节形式读取/写入到本地文件
  • SequenceInputStream                                           //以串行形式连接若干字节输入流

再看下字节流InputStream/OutputStream的组成结构,如下图

接下来逐个介绍;

ByteArrayInputStream/ByteArrayOutputStream

简单地说,就是字节数组与字节输入输出流之间的各种转换,举个例子如下:

复制代码
package io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class IOTest {

    public static void main(String[] args) throws IOException {
        //内存中的字节数组
        byte[] bArr = new byte[]{1,2,3};
        
        //字节输入流
        InputStream is = new ByteArrayInputStream(bArr);
        //字节输出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        byte[] bff = new byte[3];
        //从输入流中读取字节
        is.read(bff,0,3);
        System.out.println(bff[0] + "," + bff[1] + "," + bff[2]);

        //往字节输出流中写入字节数组
        bos.write(bff);
        //从输出流中获取字节数组
        byte[] bArryFromOs = bos.toByteArray();
        System.out.println(bArryFromOs[0] + "," + bArryFromOs[1] + "," + bArryFromOs[2]);
    
        is.close();
bos.close(); } }
复制代码

FileInputStream/FileOutputStream

可以用FileInputStream/FileOutputStream对文件进行写入及读取,如下代码,可以实现文件的复制:

复制代码
package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class IOTest {

    public static void main(String[] args) throws IOException {

        // 字节输入流
        InputStream is = new FileInputStream("C:\\test.jpg");
        // 字节输出流
        OutputStream os = new FileOutputStream("C:\\copy_test.jpg", false);

        int bTmp = -1;
        while ((bTmp = is.read()) != -1) {
            os.write(bTmp);
        }
        is.close();
        os.close();
    }
}
复制代码

PipedOutputStream/PipedInputStream

可用于同一个JVM中的两个线程间通信,字节流传输,举个例子:

复制代码
package io;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class IOTest {

    public static void main(String[] args) throws IOException {

        
        final PipedOutputStream pos = new PipedOutputStream();
        final PipedInputStream pis = new PipedInputStream(pos);

        ExecutorService es = Executors.newFixedThreadPool(2);

        es.execute(new Runnable() {

            @Override
            public void run() {
                try {
                    byte[] bArr = new byte[]{1,2,3};
                    pos.write(bArr);
                    pos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        es.execute(new Runnable() {

            @Override
            public void run() {

                byte[] bArr = new byte[3];
                try {
                    // 会导致线程阻塞
                    pis.read(bArr, 0, 3);
                    pis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                System.out.println(bArr[0] + "," + bArr[1] + "," + bArr[2]);
                
            }
        });
    }
}
复制代码

BufferedInputStream/BufferedOutputStream

带缓冲区的字节流,装饰器模式在jdk中的一个应用,可用于装饰其它字节流;

一次读取/写入一大块字节到缓冲区,避免每次频繁访问外部媒介,提高性能;

下面是一个例子:

复制代码
package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {

    public static void main(String[] args) throws IOException {

        // 字节输入流
        BufferedInputStream is = new BufferedInputStream(new FileInputStream("C:\\test.jpg"), 10 * 1024);
        // 字节输出流
        BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("C:\\copy_test.jpg", false));

        int bTmp = -1;
        while ((bTmp = is.read()) != -1) {
            os.write(bTmp);
        }

        is.close();
        os.close();
    }
}
复制代码

FilterInputStream/FilterOutputStream

可装饰其它字节流,实现自定义过滤字节流的基类,基本上是简单的覆盖了InputStream/OutputStream中的方法,意义不是很大;

PushbackInputStream

可装饰其它字节输入流,增加的功能是是回退读取,如下例子:

复制代码
package io;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PushbackInputStream;

public class IOTest {

    public static void main(String[] args) throws IOException {

        byte[] bArr = new byte[] { 1, 2, 3 };
        
        // 字节输入流
        PushbackInputStream pis = new PushbackInputStream(new ByteArrayInputStream(bArr));

        System.out.println(pis.read());
        System.out.println(pis.read());
        // 回退
        pis.unread(1);
        System.out.println(pis.read());

        pis.close();

    }
}
复制代码

DataOutputStream/DataInputStream

可装饰其它字节输入流,增加从输入流中读取Java基本类型数据的功能;

举个例子:

复制代码
package io;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest {

    public static void main(String[] args) throws IOException {
        // 字节输入流
        
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\\data.data"));
        DataInputStream dis = new DataInputStream(new FileInputStream("C:\\data.data"));
        
        dos.writeDouble(2.0235);
        dos.writeInt(520);
        dos.flush();
        
        System.out.println(dis.readDouble());
        System.out.println(dis.readInt());

        dos.close();
        dis.close();

    }
}
复制代码

PrintStream

PrintStream可以装饰其它字节输出流,允许将格式化数据写入到字节输出流中,如下示例,将格式化数据写到控制台上;

复制代码
package io;

import java.io.IOException;
import java.io.PrintStream;

public class IOTest {

    public static void main(String[] args) throws IOException {
        // 字节输出流
        PrintStream ps = System.out;
        //输出格式化数据
        ps.println("hello");
        ps.printf("%5d\n", 101);
        ps.write('2');
        
        ps.close();

    }
}
复制代码

ObjectInputStream/ObjectOutputStream

可以装饰其它字节输出流,主要用于对象序列化,可以将一个对象以字节流的形式写入/读取到本地文件中,如下例子:

复制代码
package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Dog implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -3581113588185842098L;
    private int age;

    public Dog(int age) {
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }
}

public class IOTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("C:\\object.data"));
        ObjectInputStream input = new ObjectInputStream(new FileInputStream("C:\\object.data"));

        Dog dog = new Dog(2);

        output.writeObject(dog); 
        output.flush();

        Dog obj = (Dog) input.readObject();
        System.out.println(obj.getAge());

        output.close();
        input.close();
    }
}
复制代码

SequenceInputStream

把一个或者多个InputStream串行连接起来,第一个流读完,继续读取第二个流,如下例子

复制代码
package io;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;

public class IOTest {

    public static void main(String[] args) throws IOException {
        // 内存中的字节数组
        byte[] bArr = new byte[] { 1, 2, 3 };
        byte[] bArr2 = new byte[] { 4, 5, 6 };

        // 字节输入流
        InputStream is = new ByteArrayInputStream(bArr);
        // 字节输入流
        InputStream is2 = new ByteArrayInputStream(bArr2);
        // 字节输入流,连接以上两个流
        SequenceInputStream sis = new SequenceInputStream(is, is2);

        byte[] bff = new byte[3];
        // 从输入流中读取字节
        sis.read(bff, 0, 3);
        System.out.println(bff[0] + "," + bff[1] + "," + bff[2]);
        // 会从第二个字节流读取数据
        sis.read(bff, 0, 3);
        System.out.println(bff[0] + "," + bff[1] + "," + bff[2]);

        is.close();
        is2.close();
        sis.close();
    }
}
复制代码

 

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5367823.html,如需转载请自行联系原作者
相关文章
|
9月前
|
C语言 C++ 开发者
C++输入流和输出流介绍
C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。 要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含
55 0
|
10月前
|
Java
Java IO流之访问文件的字节输入流FileInputStream和字节输入流FileOutputStream的详解
Java IO流之访问文件的字节输入流FileInputStream和字节输入流FileOutputStream的详解
78 0
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
440 0
|
存储 缓存 Java
【Java I/O 流】字节输入输出流:InputStream & OutputStream
本篇介绍字节输入输出流,它们是所有字节流的超类,提供了一些常用方法,我们一起看一下。
57 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
121 0
|
存储 缓存 Java
输入流--outputStream
输入流--outputStream
|
存储 Java API
输入流--InputStream
输入流--InputStream
|
文件存储
IO流的字节输入输出流(InputStream,OutputStream)及文件复制
字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import java.io.IOException; /* java.io.OutputStream:字节输出
|
消息中间件 前端开发 JavaScript
InputStream 和 OutputStream 基础
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
InputStream 和 OutputStream 基础
|
移动开发
字节流InputStream和OutputStream(二)上
字节流InputStream和OutputStream(二)
156 0
字节流InputStream和OutputStream(二)上