字节流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的更多相关文章

  1. IO 流(InputStream,OutputStream)

    1. InputStream,OutputStream都是抽象类,所以不能创建对象. 1个中文占两个字节 package com.ic.demo01; import java.io.File; imp ...

  2. Java:IO流之字节流InputStream、OutputStream详解

    字节流: (抽象基类)InputStream类(读): (抽象基类)OutputStream类(写):   InputStream: 构造方法摘要 InputStream()              ...

  3. Java中的流(2)字节流-InputStream和OutputStream

    字节流的两个顶层类是抽象类:InputStream和OutputStream 1. OutputStream void write(int b) 往流中写一个字节b void write(byte b ...

  4. Java IO流详解(三)——字节流InputStream和OutPutStream

    我们都知道在计算机中,无论是文本.图片.音频还是视频,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流.字节流是程序中最常用的流.在JDK中,提供了两 ...

  5. Java字节流:InputStream OutputStream

    字节输入流:InputStream 类声明: public abstract class InputStream implements Closeable 位于java.io包下,是一个抽象类. 官方 ...

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

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

  7. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  8. IO流的字节输入输出流(InputStream,OutputStream)

    字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import ...

  9. Java:IO流(二)——InputStream/OutputStream具体用法:FileXXXStream、ByteArrayXXXStream

    1.说明 InputStream和OutputStream是Java标准库中最基本的IO流,它们都位于java.io包中,该包提供了所有同步IO的功能. 2.模块:java.io.InputStrea ...

随机推荐

  1. Java总结篇系列:Java String

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...

  2. iOS阶段学习第12天笔记(类的初始化)

    iOS学习(OC语言)知识点整理 一.类的初始化 1)init初始化方法(构造方法):一般和alloc一起调用,用于给成员变量初始化. 2)id类型:相当于C中的void*,可以指向任何对象,不能加* ...

  3. Mysql优化的几点总结

    正常情况下,初创公司的流量并不是很大,mysql数据库在未做优化的情况依然可以满足性能要求,特别是5.6版本后mysql在性能上还是有了很大提升,所以在初期并没有花精力在此上面.但后来发生的一系列问题 ...

  4. Js 风骚的代码

    1.写自动调用的匿名函数 当我们写完一个函数立即调用时,总是 function a(){ } a(); 或许 var a = function(){ } a(); 而高手总是 (function(){ ...

  5. GJM:用C#实现网络爬虫(二) [转载]

    上一篇<用C#实现网络爬虫(一)>我们实现了网络通信的部分,接下来继续讨论爬虫的实现 3. 保存页面文件 这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行 ...

  6. C# 7个读写Excel文件的类库

    转载自:http://www.cnblogs.com/wintersun/archive/2013/02/26/2933294.html 有时我们在项目需要操作Excel文件,读或写,导出数据等.   ...

  7. 【转】从MVC到前后端分离

    1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(P ...

  8. Microsoft SQL Server Compact 4.0&&ADO.NET Entity Framework 4.1&&MVC3

    最近重新查看微软MvcMusicStore-v3.0的源代码,发现忽略了很多重要的东西,特别是数据访问那一部分. 首先Microsoft SQL Server Compact 4.0 详细的介绍和下载 ...

  9. 推荐25款实用的 HTML5 前端框架和开发工具【下篇】

    快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验. ...

  10. yii create url (二)

    在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,actionX代表方法X.在Controller ...