字节流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();
- }
- }
字节流InputStream/OutputStream的更多相关文章
- IO 流(InputStream,OutputStream)
1. InputStream,OutputStream都是抽象类,所以不能创建对象. 1个中文占两个字节 package com.ic.demo01; import java.io.File; imp ...
- Java:IO流之字节流InputStream、OutputStream详解
字节流: (抽象基类)InputStream类(读): (抽象基类)OutputStream类(写): InputStream: 构造方法摘要 InputStream() ...
- Java中的流(2)字节流-InputStream和OutputStream
字节流的两个顶层类是抽象类:InputStream和OutputStream 1. OutputStream void write(int b) 往流中写一个字节b void write(byte b ...
- Java IO流详解(三)——字节流InputStream和OutPutStream
我们都知道在计算机中,无论是文本.图片.音频还是视频,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流.字节流是程序中最常用的流.在JDK中,提供了两 ...
- Java字节流:InputStream OutputStream
字节输入流:InputStream 类声明: public abstract class InputStream implements Closeable 位于java.io包下,是一个抽象类. 官方 ...
- [五] JavaIO之InputStream OutputStream简介 方法列表说明
InputStream 和 OutputStream 对于字节流的输入和输出 是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定 这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具 ...
- 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream
目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...
- IO流的字节输入输出流(InputStream,OutputStream)
字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import ...
- Java:IO流(二)——InputStream/OutputStream具体用法:FileXXXStream、ByteArrayXXXStream
1.说明 InputStream和OutputStream是Java标准库中最基本的IO流,它们都位于java.io包中,该包提供了所有同步IO的功能. 2.模块:java.io.InputStrea ...
随机推荐
- C#编程总结(十二)断点续传
C#编程总结(十二)断点续传 我们经常使用下载工具,如bit精灵.迅雷.FlashGet,这些软件都支持断点续传. 断点续传即下载任务暂停后可以继续,而无需重新下载,即下载时需要通知服务器的起始位置. ...
- html+jquery翻页相册(原创)
呵呵 今天心情大好,再发一篇最进前端实现的相册模仿功能 这个相册是在一个网站的案例展示页面上实现的,没单独写出来,没时间,重用性也很差,以后有时间了再单独提取出来, 写这个玩意前,我在网上找了一些案例 ...
- Java主要知识结构
Java基础(建议看java编程规范): Java语言基础:数据类型,命名规则,权限控制符,注释 操作符:算术操作符,逻辑操作符,关系操作符,移位操作符,按位操作符 流程控制 数组 字符串 Java高 ...
- 形象化的spring 依赖注入原理
转. IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制.这称为控制反转. 下面我们以几个例子来说明什 ...
- Selenium学习笔记之外部化相关测试数据---xml
我们也可以用xml来定义一个信息更为丰富的UIMap.xml文件,比如,额外还添加控件所属的页,控件的类型,然后解析构建一个XMLParser类来读取相应的值. <?xml version=&q ...
- Java经典实例:在文本中匹配换行符
默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTI ...
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- MagicSuggest – Bootstrap 主题的多选组合框
MagicSuggest 是专为 Bootstrap 主题开发的多选组合框.它支持自定义呈现,数据通过 Ajax 异步获取,使用组件自动过滤.它允许空间免费项目,也有动态加载固定的建议. 您可能感兴趣 ...
- 原生JS:Object对象详细参考
Object对象详细参考 本文参考MDN做的详细整理,方便大家参考MDN JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象. 构造函数: Objec ...
- bootstrapcss3触屏滑块轮播图
插件描述:bootslider响应bootstrapcss3触屏滑块轮播图 小海已经好久没分享技术性文章了,这个基于bootstrap的触屏版轮播图绝对满足大家的胃口,并且支持移动端触摸滑动.功能上, ...