字节流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() {@Overridepublic void run() {try {byte[] bArr = new byte[]{1,2,3};pos.write(bArr);pos.close();} catch (IOException e) {e.printStackTrace();}}});es.execute(new Runnable() {@Overridepublic 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();}
}

转载于:https://www.cnblogs.com/chenpi/p/5367823.html

字节流InputStream/OutputStream相关推荐

  1. IO流:输入字节流:InputStream 、 输出字节流:OutputStream 、输入字符流:Reader 、输出字符流:Writer、 BufferedInputStream

    ## 1_ IO流的介绍及其分类          * IO流:          *         I: Input 输入          *         O: Output 输出      ...

  2. File 和 InputStream, OutputStream 的用法

    一.File 首先我们要先了解文件路径: 文件路径分为 绝对路径 和 相对路径 两种. 绝对路径:相对于树来说就是,从根节点到叶子结点的整个路径.windows即是从各个磁盘              ...

  3. 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流

    字节流 抽象类InputStream和OutputStream是字节流的顶级父类 所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStream InputStream的 ...

  4. [五] JavaIO之InputStream OutputStream简介 方法列表说明

    InputStream 和 OutputStream 对于字节流的输入和输出 是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定 这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具体的 ...

  5. InputStream OutputStream 傻傻分不清

    总是混淆他们的区别: InputStream is used for many things that you read from. OutputStream is used for many thi ...

  6. InputStream/OutputStream(文件的输入输出)

    文章目录 一.InputStream 1.关于文件的读 1.直接读取 2.文本读取 二.OutputStream 1.直接写入 2.文本写入 3.缓冲区 前面我们已经讲过了关于File类的一些常用的方 ...

  7. 使用流进行通讯的一种可能犯的错误 (InputStream + OutputStream)

    今天写代码实现两个实时同步进程之间的通信,类似于生产者与消费者问题,一个线程产生数据,通过流输送到另一个线程. 下面说我刚刚犯的错误,希望大家引以为戒. 我用的 Java管道流(这个无所谓,重点是通讯 ...

  8. java 将整型数组内容写入txt文件_Java自学-I/O 字节流

    Java 字节流 InputStream OutputStream InputStream字节输入流 OutputStream字节输出流 用于以字节的形式读取和写入数据 步骤 1 : ASCII码 所 ...

  9. 字符流和字节流的原理及区别

    参考:https://www.cnblogs.com/absfree/p/5415092.html 1. 流的概念 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不 ...

最新文章

  1. 程志明就智慧城市建设要求 完善基础设施提升管理水平
  2. html5添加随机率,HTML5 canvas  绘制随机曲线 并实现放大功能
  3. Eviews学习笔记
  4. sklearn自学指南(part44)--生成数据集
  5. 企业高可用切换的说明
  6. 大数据建模、分析、挖掘技术应用研修班的通知
  7. 转帖Masonry介绍与使用实践(快速上手Autolayout)
  8. 力扣Java编译器_力扣(LeetCode)位1的个数 个人题解
  9. CSS 颜色代码大全 CSS颜色对照表
  10. delphi控件切图界面闪烁_ui界面切图方法
  11. 教育专家妙论生命法则
  12. 隐藏IP的功能和原理
  13. CTFHUB-技能树-WEB通关
  14. 简单 洛谷 P1563 【模拟】玩具谜题普及场
  15. 【李开复】给中国学生的第五封信——你有选择的权利(五)
  16. MySql的相关资操作
  17. 量化回测平台Backtrader实战-陆一潇-专题视频课程
  18. 基于API调用管理的SDN应用层DDoS攻击防御机制
  19. 印度提高关税,富士康或是大赢家
  20. 【就业】签offer和签三方协议的不同

热门文章

  1. 使用ReaderWriterLock优化文件缓存
  2. Tom Clancy's Splinter Cell: Double Agent
  3. 聪明的程序员用Delphi,真正的程序员用C++,偷懒的程序员用PowerShell
  4. JVM NativeMemoryTracking 分析堆外内存泄露
  5. 禁止微信下拉 露出黑色背景
  6. 用户利益何在:微软Windows10新政背后的疑问
  7. 怪不的软件开发这么挣钱,原来是有这么多职位
  8. 使用Volley传输网络数据
  9. Spring 事务管理高级应用难点剖析
  10. 女生学编程有哪些好处呢?