字节流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() {@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相关推荐
- IO流:输入字节流:InputStream 、 输出字节流:OutputStream 、输入字符流:Reader 、输出字符流:Writer、 BufferedInputStream
## 1_ IO流的介绍及其分类 * IO流: * I: Input 输入 * O: Output 输出 ...
- File 和 InputStream, OutputStream 的用法
一.File 首先我们要先了解文件路径: 文件路径分为 绝对路径 和 相对路径 两种. 绝对路径:相对于树来说就是,从根节点到叶子结点的整个路径.windows即是从各个磁盘 ...
- 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
字节流 抽象类InputStream和OutputStream是字节流的顶级父类 所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStream InputStream的 ...
- [五] JavaIO之InputStream OutputStream简介 方法列表说明
InputStream 和 OutputStream 对于字节流的输入和输出 是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定 这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具体的 ...
- InputStream OutputStream 傻傻分不清
总是混淆他们的区别: InputStream is used for many things that you read from. OutputStream is used for many thi ...
- InputStream/OutputStream(文件的输入输出)
文章目录 一.InputStream 1.关于文件的读 1.直接读取 2.文本读取 二.OutputStream 1.直接写入 2.文本写入 3.缓冲区 前面我们已经讲过了关于File类的一些常用的方 ...
- 使用流进行通讯的一种可能犯的错误 (InputStream + OutputStream)
今天写代码实现两个实时同步进程之间的通信,类似于生产者与消费者问题,一个线程产生数据,通过流输送到另一个线程. 下面说我刚刚犯的错误,希望大家引以为戒. 我用的 Java管道流(这个无所谓,重点是通讯 ...
- java 将整型数组内容写入txt文件_Java自学-I/O 字节流
Java 字节流 InputStream OutputStream InputStream字节输入流 OutputStream字节输出流 用于以字节的形式读取和写入数据 步骤 1 : ASCII码 所 ...
- 字符流和字节流的原理及区别
参考:https://www.cnblogs.com/absfree/p/5415092.html 1. 流的概念 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不 ...
最新文章
- 程志明就智慧城市建设要求 完善基础设施提升管理水平
- html5添加随机率,HTML5 canvas 绘制随机曲线 并实现放大功能
- Eviews学习笔记
- sklearn自学指南(part44)--生成数据集
- 企业高可用切换的说明
- 大数据建模、分析、挖掘技术应用研修班的通知
- 转帖Masonry介绍与使用实践(快速上手Autolayout)
- 力扣Java编译器_力扣(LeetCode)位1的个数 个人题解
- CSS 颜色代码大全 CSS颜色对照表
- delphi控件切图界面闪烁_ui界面切图方法
- 教育专家妙论生命法则
- 隐藏IP的功能和原理
- CTFHUB-技能树-WEB通关
- 简单 洛谷 P1563 【模拟】玩具谜题普及场
- 【李开复】给中国学生的第五封信——你有选择的权利(五)
- MySql的相关资操作
- 量化回测平台Backtrader实战-陆一潇-专题视频课程
- 基于API调用管理的SDN应用层DDoS攻击防御机制
- 印度提高关税,富士康或是大赢家
- 【就业】签offer和签三方协议的不同