Java中的IO流

布鸽不鸽 Lv4

前言

IO流是Java中有一个重要的概念,指的是数据从一个地点到另一个地点的过程。输入输出的介质有很多,包括:文件、网络、键盘(输入)、显示器(输出)……

原文地址:https://xuedongyun.cn/post/17650/

IO分类

Java对IO操作提供了相应的API,包含在java.io包中。java中对流的分类包括:

  • 按流向分(站在程序的角度)
    • 输入流(Input)
    • 输出流(Output)
  • 按流的处理类型分
    • 字节流
    • 字符流
  • 按流的功能来分
    • 节点流(直接跟输入输出源交互)
    • 处理流(对其他流包装的流:包装流)

常用API

Java中,几乎所有的流都是从以下四个父类继承而来的:

输入流输出流
字节流java.io.InputStreamjava.io.OutputStream
字符流java.io.Readerjava.io.Writer

InputStream常用方法

  • int available():获取流中可读字节数
  • int read():从流中读取一个字节(0-255,-1表示已读到末尾)
  • int read(byte[] b):将读取的字节存储到字节数组中,返回实际读到的长度(-1表示已读到末尾)
  • skip(int b):跳过指定字节

OutputStream常用方法

  • write(int b):将一个字节写出到目标源
  • write(byte[] b):将一个字节数组写出到目标输
  • write(byte[] b,int offset,int len)将一个字节数组,从offset开始,写出len个字节,到目标输出源

字节流

计算机中,所有文件都是以字节的形式存储的。因此可以使用字节流进行读写操作。

字节输入流

JDK对于字节输入提供了一些子类:

  • FileInputStream
  • ByteArrayInputStream
  • BufferedInputStream
  • ObjectInputStream

FileInputStream

FileInputStream是一个针对文件的输入字节流

  • 常见构造器
    • FileInputStream(File file):根据文件构建
    • FileInputStream(String filePath):根据文件路径构建
  • 读取文件
1
2
3
4
5
6
7
8
9
InputStream in = new FileInputStream("C:\\data\\Test.java");

byte[] b = new byte[1024];
int len = 0;

while((len = in.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}

字节输出流

JDK对于字节输出提供了一些子类:

  • FileOutputStream
  • ByteArrayOutputStream
  • BufferedOutputStream
  • ObjectOutputStream

FileOutputStream

FileOutputStream主要用于对文件进行写入操作

  • 常用构造器
    • FileOutputStream(String filePath):基于一个标准文件的路径,创建对其操作的输出流
    • FileOutputStream(String filePath,boolean append):同上,但使用追加模式
    • FileOutputStream(File file):基于一个标准文件对象,创建对其操作的输出流
    • FileOutputStream(File file,boolean append):同上,但使用追加模式

文件不存在会自动创建,文件存在会操作原有文件,目标不是文件而是目录会抛出异常

  • 写文件
1
2
3
4
5
6
7
// 使用了try...with...resource语法
// Java中文件相对路径是相对于项目目录而言的
try (FileOutputStream os = new FileOutputStream("test.txt", true)) {
os.write("你好世界".getBytes());
} catch (IOException e) {
e.printStackTrace();
}

字符流

字符输入流

字符输入流一般用于对文本数据进行读取操作,常见的子类:

  • InputStreamReader
  • FileReader
  • BufferedReader
  • CharArrayReader

FileReader

FileReader是一个以字符流的形式进行文件内容读取的流,从InputStreamReader继承而来

  • 常用构造方法
    • FileReader(File file):根据文件对象,获取字符输入流
    • FileReader(String path):根据文件路径,获取字符输入流
  • 具体使用
1
2
3
4
5
6
7
8
FileReader fr = new FileReader("C:\\data\\test.txt");

char[] ch = new char[100];
int len = 0;
while((len = fr.read(ch)) != -1){
String s = new String(ch, 0, len);
System.out.print(s);
}

字符输出流

字符输出流一般用于对文本数据进行写出操作,常见的子类:

  • OutputStreamWriter
  • BufferedWriter
  • CharArrayWriter
  • FileWriter
  • PrintWriter

FileWriter

FileWriter是一个以字符流的形式进行文件内容写出的流,从OutputStreamWriter继承而来

  • 常用构造方法

    • FileWriter(File file):根据文件对象,获取字符输出流

    • FileWriter(File file, boolean append):同上,但使用追加模式

    • FileWriter(String path):根据文件路径,获取字符输出流

    • FileWriter(String path, boolean append):同上,但使用追加模式

  • 具体使用

1
2
3
4
5
FileWriter fw = new FileWriter("readme.txt");
fw.write("你好世界");
fw.flush(); //允许在流未关闭之前,强制将字符缓冲区中的数据写出到目标输出源
fw.write("abcdefg");
fw.close();

处理流

按流的功能来分类,可以分为:

  • 节点流
    • 又称低级流。直接跟输入输出源沟通
  • 处理流
    • 又称高级流或包装流。可以对其他流进行包装,以实现流的类型转换或效率的提升。
    • 缓冲流转换流构成

包装使用了23种设计模式中的:装饰器模式

缓冲流

缓冲流是一种自带缓冲区的流,主要有四种

  • BufferedInputStream:字节缓冲输入流
  • BufferedOutputStream:字节缓冲输出流
  • BufferedReader:字符缓冲输入流
  • BufferedWriter:字符缓冲输出流

缓冲流内部使用了一个默认大小为8kb的字节缓冲区,每次将缓冲区的空间存满之后再将数据通过流对象完成读写操作

1
2
3
4
5
6
7
8
9
10
11
FileInputStream fis = new FileInputStream("test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);

byte[] b = new byte[1024*1024*8];
int len = 0;
while((len = bis.read(b)) != -1){
String s = new String(b, 0, len);
System.out.println(s);
}

bis.close();

转换流

一些需求:

字节流转换为字符流、字符流转换为字节流……

1
2
3
4
5
6
7
8
9
10
InputStream is = System.in;

// 字节流转换为字符流
InputStreamReader isr = new InputStreamReader(is);

// 字符流包装为缓冲流
BufferedReader br = new BufferedReader(isr);

// 读取一行
String s = br.readLine();
  • 标题: Java中的IO流
  • 作者: 布鸽不鸽
  • 创建于 : 2023-07-16 20:34:15
  • 更新于 : 2023-07-16 23:07:30
  • 链接: https://xuedongyun.cn//post/17650/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论