字节流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

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

  1. package io;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7.  
  8. public class IOTest {
  9.  
  10. public static void main(String[] args) throws IOException {
  11. //内存中的字节数组
  12. byte[] bArr = new byte[]{1,2,3};
  13.  
  14. //字节输入流
  15. InputStream is = new ByteArrayInputStream(bArr);
  16. //字节输出流
  17. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  18.  
  19. byte[] bff = new byte[3];
  20. //从输入流中读取字节
  21. is.read(bff,0,3);
  22. System.out.println(bff[0] + "," + bff[1] + "," + bff[2]);
  23.  
  24. //往字节输出流中写入字节数组
  25. bos.write(bff);
  26. //从输出流中获取字节数组
  27. byte[] bArryFromOs = bos.toByteArray();
  28. System.out.println(bArryFromOs[0] + "," + bArryFromOs[1] + "," + bArryFromOs[2]);
  29.  
  30. is.close();
    bos.close();
  31. }
  32. }

FileInputStream/FileOutputStream

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

  1. package io;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. public class IOTest {
  10.  
  11. public static void main(String[] args) throws IOException {
  12.  
  13. // 字节输入流
  14. InputStream is = new FileInputStream("C:\\test.jpg");
  15. // 字节输出流
  16. OutputStream os = new FileOutputStream("C:\\copy_test.jpg", false);
  17.  
  18. int bTmp = -1;
  19. while ((bTmp = is.read()) != -1) {
  20. os.write(bTmp);
  21. }
  22. is.close();
  23. os.close();
  24. }
  25. }

PipedOutputStream/PipedInputStream

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

  1. package io;
  2.  
  3. import java.io.IOException;
  4. import java.io.PipedInputStream;
  5. import java.io.PipedOutputStream;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8.  
  9. public class IOTest {
  10.  
  11. public static void main(String[] args) throws IOException {
  12.  
  13. final PipedOutputStream pos = new PipedOutputStream();
  14. final PipedInputStream pis = new PipedInputStream(pos);
  15.  
  16. ExecutorService es = Executors.newFixedThreadPool(2);
  17.  
  18. es.execute(new Runnable() {
  19.  
  20. @Override
  21. public void run() {
  22. try {
  23. byte[] bArr = new byte[]{1,2,3};
  24. pos.write(bArr);
  25. pos.close();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. });
  31.  
  32. es.execute(new Runnable() {
  33.  
  34. @Override
  35. public void run() {
  36.  
  37. byte[] bArr = new byte[3];
  38. try {
  39. // 会导致线程阻塞
  40. pis.read(bArr, 0, 3);
  41. pis.close();
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. System.out.println(bArr[0] + "," + bArr[1] + "," + bArr[2]);
  46.  
  47. }
  48. });
  49. }
  50. }

BufferedInputStream/BufferedOutputStream

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

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

下面是一个例子:

  1. package io;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.BufferedOutputStream;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8.  
  9. public class IOTest {
  10.  
  11. public static void main(String[] args) throws IOException {
  12.  
  13. // 字节输入流
  14. BufferedInputStream is = new BufferedInputStream(new FileInputStream("C:\\test.jpg"), 10 * 1024);
  15. // 字节输出流
  16. BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("C:\\copy_test.jpg", false));
  17.  
  18. int bTmp = -1;
  19. while ((bTmp = is.read()) != -1) {
  20. os.write(bTmp);
  21. }
  22.  
  23. is.close();
  24. os.close();
  25. }
  26. }

FilterInputStream/FilterOutputStream

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

PushbackInputStream

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

  1. package io;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.IOException;
  5. import java.io.PushbackInputStream;
  6.  
  7. public class IOTest {
  8.  
  9. public static void main(String[] args) throws IOException {
  10.  
  11. byte[] bArr = new byte[] { 1, 2, 3 };
  12.  
  13. // 字节输入流
  14. PushbackInputStream pis = new PushbackInputStream(new ByteArrayInputStream(bArr));
  15.  
  16. System.out.println(pis.read());
  17. System.out.println(pis.read());
  18. // 回退
  19. pis.unread(1);
  20. System.out.println(pis.read());
  21.  
  22. pis.close();
  23.  
  24. }
  25. }

DataOutputStream/DataInputStream

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

举个例子:

  1. package io;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8.  
  9. public class IOTest {
  10.  
  11. public static void main(String[] args) throws IOException {
  12. // 字节输入流
  13.  
  14. DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\\data.data"));
  15. DataInputStream dis = new DataInputStream(new FileInputStream("C:\\data.data"));
  16.  
  17. dos.writeDouble(2.0235);
  18. dos.writeInt(520);
  19. dos.flush();
  20.  
  21. System.out.println(dis.readDouble());
  22. System.out.println(dis.readInt());
  23.  
  24. dos.close();
  25. dis.close();
  26.  
  27. }
  28. }

PrintStream

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

  1. package io;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintStream;
  5.  
  6. public class IOTest {
  7.  
  8. public static void main(String[] args) throws IOException {
  9. // 字节输出流
  10. PrintStream ps = System.out;
  11. //输出格式化数据
  12. ps.println("hello");
  13. ps.printf("%5d\n", 101);
  14. ps.write('2');
  15.  
  16. ps.close();
  17.  
  18. }
  19. }

ObjectInputStream/ObjectOutputStream

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

  1. package io;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;
  8. import java.io.Serializable;
  9.  
  10. class Dog implements Serializable {
  11. /**
  12. *
  13. */
  14. private static final long serialVersionUID = -3581113588185842098L;
  15. private int age;
  16.  
  17. public Dog(int age) {
  18. this.age = age;
  19. }
  20.  
  21. public int getAge() {
  22. return this.age;
  23. }
  24. }
  25.  
  26. public class IOTest {
  27.  
  28. public static void main(String[] args) throws IOException, ClassNotFoundException {
  29. ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("C:\\object.data"));
  30. ObjectInputStream input = new ObjectInputStream(new FileInputStream("C:\\object.data"));
  31.  
  32. Dog dog = new Dog(2);
  33.  
  34. output.writeObject(dog);
  35. output.flush();
  36.  
  37. Dog obj = (Dog) input.readObject();
  38. System.out.println(obj.getAge());
  39.  
  40. output.close();
  41. input.close();
  42. }
  43. }

SequenceInputStream

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

  1. package io;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.SequenceInputStream;
  7.  
  8. public class IOTest {
  9.  
  10. public static void main(String[] args) throws IOException {
  11. // 内存中的字节数组
  12. byte[] bArr = new byte[] { 1, 2, 3 };
  13. byte[] bArr2 = new byte[] { 4, 5, 6 };
  14.  
  15. // 字节输入流
  16. InputStream is = new ByteArrayInputStream(bArr);
  17. // 字节输入流
  18. InputStream is2 = new ByteArrayInputStream(bArr2);
  19. // 字节输入流,连接以上两个流
  20. SequenceInputStream sis = new SequenceInputStream(is, is2);
  21.  
  22. byte[] bff = new byte[3];
  23. // 从输入流中读取字节
  24. sis.read(bff, 0, 3);
  25. System.out.println(bff[0] + "," + bff[1] + "," + bff[2]);
  26. // 会从第二个字节流读取数据
  27. sis.read(bff, 0, 3);
  28. System.out.println(bff[0] + "," + bff[1] + "," + bff[2]);
  29.  
  30. is.close();
  31. is2.close();
  32. sis.close();
  33. }
  34. }

字节流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. C#编程总结(十二)断点续传

    C#编程总结(十二)断点续传 我们经常使用下载工具,如bit精灵.迅雷.FlashGet,这些软件都支持断点续传. 断点续传即下载任务暂停后可以继续,而无需重新下载,即下载时需要通知服务器的起始位置. ...

  2. html+jquery翻页相册(原创)

    呵呵 今天心情大好,再发一篇最进前端实现的相册模仿功能 这个相册是在一个网站的案例展示页面上实现的,没单独写出来,没时间,重用性也很差,以后有时间了再单独提取出来, 写这个玩意前,我在网上找了一些案例 ...

  3. Java主要知识结构

    Java基础(建议看java编程规范): Java语言基础:数据类型,命名规则,权限控制符,注释 操作符:算术操作符,逻辑操作符,关系操作符,移位操作符,按位操作符 流程控制 数组 字符串 Java高 ...

  4. 形象化的spring 依赖注入原理

      转. IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制.这称为控制反转. 下面我们以几个例子来说明什 ...

  5. Selenium学习笔记之外部化相关测试数据---xml

    我们也可以用xml来定义一个信息更为丰富的UIMap.xml文件,比如,额外还添加控件所属的页,控件的类型,然后解析构建一个XMLParser类来读取相应的值. <?xml version=&q ...

  6. Java经典实例:在文本中匹配换行符

    默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTI ...

  7. Java继承的初始化

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  8. MagicSuggest – Bootstrap 主题的多选组合框

    MagicSuggest 是专为 Bootstrap 主题开发的多选组合框.它支持自定义呈现,数据通过 Ajax 异步获取,使用组件自动过滤.它允许空间免费项目,也有动态加载固定的建议. 您可能感兴趣 ...

  9. 原生JS:Object对象详细参考

    Object对象详细参考 本文参考MDN做的详细整理,方便大家参考MDN JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象. 构造函数: Objec ...

  10. bootstrapcss3触屏滑块轮播图

    插件描述:bootslider响应bootstrapcss3触屏滑块轮播图 小海已经好久没分享技术性文章了,这个基于bootstrap的触屏版轮播图绝对满足大家的胃口,并且支持移动端触摸滑动.功能上, ...