Java IO流系统整理

Java IO流的分类

Java中的流,可以从不同的角度进行分类。

按流向分类:

输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。

按数据传输单位分类:

字节流:以字节(8位二进制)为单位进行处理。主要用于读写诸如图像或声音的二进制数据。

字符流:以字符(16位二进制)为单位进行处理。

都是通过字节流的方式实现的。字符流是对字节流进行了封装,方便操作。在最底层,所有的输入输出都是字节形式的。

后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

 

按功能分类:

节点流:从特定的地方读写的流类,如磁盘或者一块内存区域。

过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或者输出流连接创建的。

 

不同的输入输出流

JDK提供的流继承了四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)

字节输入流:

字节输入流抽象类及其关键的方法:

类 InputStream


1

2

java.io.InputStream

abstract int read()

从输入流中读取数据的下一个字节。


1

int read(byte[] b)

从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。


1

int read(byte[] b, int off, int len)

将输入流中最多 len 个数据字节读入 byte 数组。

 

输入流的操作:

打开一个输入流
循环读取
关闭输入流

这里使用InputStream的子类FileInputStream读入文件:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

public static void main(String[] args) throws IOException {

 

    //创建文件输入流

    InputStream is = new FileInputStream("D:/itzhai/arthinking.txt");

    //创建字节缓冲

    byte[] buffer = new byte[100];

    int length = 0;

    //以字节形式循环读取文件

    while((length = is.read(buffer, 0, buffer.length)) != -1){

        //把字节转换成字符并输出

        String str =new String(buffer, 0, length);

        System.out.println(str);

    }

}

抽象类InputStream的类层次:

字节数组输入流ByteArrayInputStream

把字节数组作为源的输入流。

相关例子:

字节数组输入流:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public static void main(String[] args) {

 

    //创建读取数据源

    String input = "arthinking";

    //获取字节数组

    byte[] b = input.getBytes();

    //创建字节数组输出流

    ByteArrayInputStream bis = new ByteArrayInputStream(b);

    //循环逐个读取

    for(int i = 0; i < input.length(); i++){

        int c;

        //读取下一个字节

        while((c = bis.read()) != -1){

            System.out.print((char)c);

        }

    }

    //将缓冲区的位置重置为标记位置

    bis.reset();

}

 

字节数组输出流:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public static void main(String[] args) throws IOException {

 

    //创建字节输出流

    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    String output = "arthinking";

    //创建需要输出的字节数组

    byte[] buffer = output.getBytes();

    //把字节数组写到输出流

    bos.write(buffer);

    //创建文件输出流

    OutputStream os = new FileOutputStream("D:/itzhai/arthinking.txt");

    //把字节输出流写到文件输出流

    bos.writeTo(os);

 

}

  

 

字节输出流:

字节输出流的抽象类及其最关键的方法:


1

2

3

4

类 OutputStream

java.lang.Object

java.io.OutputStream

void write(byte[] b)

将 b.length 个字节从指定的 byte 数组写入此输出流。


1

void write(byte[] b, int off, int len)

 

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。


1

abstract void write(int b)

将指定的字节写入此输出流。

由此可以看出,只有最后一个方法才是抽象的,原因是前面两个都调用了第三个抽象方法,这样继承这个抽象类的子类都必须提供抽象的write(int b)的实现,从而使得每个子类的实现都不一样。

输出流的操作:

打开输出流
循环写入
关闭输入流

这里使用了OutputStream的子类FileOutputStream输出到文件:


1

2

3

4

5

6

7

8

9

10

11

public static void main(String[] args) throws IOException {

    //创建一个输出流

    OutputStream os = new FileOutputStream("D:/itzhai/arthinking.txt"true);

    String output = "http://www.itzhai.com";

    //从字符串中获取字节数组

    byte[] buffer = output.getBytes();

    //写出到输出流

    os.write(buffer);

    //关闭输出流

    os.close();

}

  

抽象类OutputStream的类层次结构:

过滤流:

过滤流不能直接跟文件打交道,只能通过节点流进行相关的操作。可以从其构造方法中看出:


1

FilterOutputStream(OutputStream out)

需要传入一个OutputStream。

在InputStream和OutputStream的子类中,

FilterInputStream和FilterOutputStream是过滤流,其又派生出子类DataInputStream和DataOutputStream数据输入流和数据输出流。

过滤流的主要特点是在输入输出数据同时对所传输的数据做指定类型或格式的转换。

缓冲输出流BufferedOutputStream

该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

当缓冲区写满或者关闭输出流时,一次性输出到流,或者调用flush()方法主动将缓冲区输出到流。

过滤流的使用例子:

使用过滤流类BufferedOutputStream和DataOutputStream装饰FilterOutputStream的例子


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public static void main(String[] args) throws IOException {

 

    //创建数据输出流

    DataOutputStream dos = new DataOutputStream(

            new BufferedOutputStream(new FileOutputStream("D:/itzhai/arthinking.txt")));

    byte a = 1;

    char b = 'a';

    int c = 2;

    //使用数据输出流对象的方法写出数据到输出流

    dos.write(a);

    dos.write(b);

    dos.write(c);

    //关闭数据输出流

    dos.close();

    //创建数据输入流

    DataInputStream dis = new DataInputStream(

            new BufferedInputStream(new FileInputStream("D:/itzhai/arthinking.txt")));

    //使用数据输入流的方法从输入流中读取数据

    System.out.println(dis.readByte() + dis.readChar() + dis.readInt());

    //关闭数据输入流

    dis.close();

}

  

使用DataInputStream和DataOutputStream数据文件流的一般步骤:

  • 创建字节文件流对象
  • 基于字节文件流对象建立数据文件流对象
  • 用数据文件流对象的方法对基本类型的数据进行输入/输出 

字符输入流:

字符输出流:

时间: 2024-08-31 12:50:22

Java IO流系统整理的相关文章

Java IO流 文件传输基础_java

一.文件的编码 package com.study.io; /** * 测试文件编码 */ public class EncodeDemo { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String s="好好学习ABC"; byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是

Java IO流学习总结一:输入输出流

Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入

Java IO: 流

原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) Java IO流是既可以从中读取,也可以写入到其中的数据流.正如这个系列教程之前提到过的,流通常会与数据源.数据流向目的地相关联,比如文件.网络等等. 流和数组不一样,不能通过索引读写数据.在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAccessFile 处理文件.流仅仅只是一个连续的数据流. 某些类似PushbackInputStream 流的实现允许你将数据重新推回

java io流,下载图片问题

问题描述 java io流,下载图片问题 下载到本地的图片,为何是这样的,求解 解决方案 这个应该是解码的问题,你可以在上传图片的地方,打印出字节. 然后再下载的地方,打印字节,就可 以知道下的对不对了

java io流 如何判断结尾,-1和readline的null是怎么得到的

问题描述 java io流 如何判断结尾,-1和readline的null是怎么得到的 java io流 如何判断结尾,-1和readline的null是怎么得到的 在读取文件和在流里读取数据时怎么知道已经读完了. 我用server接收http请求,要判断结尾 解决方案 判断流的read是否为-1,类似如下 byte[] buffer = new byte[4096]; int n = 0; while (-1 != (n = input.read(buffer))) { output.writ

java IO流 之 输入流 InputString()的使用_java

本文主要给大家介绍java的InputStream 流的使用. (1)FileInputstream: 子类,读取数据的通道 使用步骤: 1.获取目标文件:new File() 2.建立通道:new FileInputString() 3.读取数据:read() 4.释放资源:close() //一些默认要导入的包 import java.io.File; import java.io.FileInputStream; import java.io.IOException; public sta

Java IO流学习总结八:Commons IO 2.5-IOUtils

Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/55051917 本文出自[赵彦军的博客] 在上一篇文章中,介绍了IO FileUtils的常规用法,今天介绍IOUtils的使用. 福利 另外我已经把Commons IO 2.5的源码发布到Jcenter,大家就不用下载jar包了,可以直接引用. Maven引用 <dependency> <group

Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream

Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54946762 本文出自[赵彦军的博客] 类的继承关系 InputStream |__ ByteArrayInputStream OutputStream |__ ByteArrayOutputStream ByteArrayInputStream 可以将字节数组转化为

Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54894451 本文出自[赵彦军的博客] InputStream |__FilterInputStream |__BufferedInputStream 首先抛出一个问题,有了InputStream为什么还要有BufferedInputStream? Buffere