Java--IO

什么是 IO?

IO:Input/Output的首字母的缩写,即输入和输出。这里的输入输出都是相对内存来说的。

什么是流

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的 总称抽象 。即数据在两设备间的传输称为流。
流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的分类:
流可分为 节点流处理流 两种。

  • 节点流:可以从或向一个特定的地方(节点)读写数据。如FileInputStreamFileReader
  • 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

处理流与节点流相比可以隐藏底层节点流的差异,对外提供更加统一的IO方法,让开发人员只需关心高级流的操作(使用更加简单, 执行效率更高)。

使用处理流的思路:使用处理流来包装节点流,程序通过处理流执行IO,让节点流与底层IO设备/文件交互。

流.png

IO流的分类:
根据处理数据类型的不同分为:字符流字节流;根据数据流向不同分为:输入流输出流

字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图所示。
JavaIO.png

我们通过两个案列,来看两者的区别:

使用字节流不关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.File;    
import java.io.FileOutputStream;
import java.io.OutputStream;
public class IODemo {
public static void main(String[] args) throws Exception { // 异常抛出, 不处理
// 使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File 对象
// 通过子类实例化父类对象
OutputStream out = new FileOutputStream(f);

String str = "Hello World!!!";
byte b[] = str.getBytes();
// 字符串转byte数组
out.write(b);

// 关闭输出流
// out.close();
}
}

虽然没有关闭字节流操作,但是我们依然发现test.txt文件中存在输入的内容。证明字节流是直接操作文件本身的。

使用字符流不关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.File;    
import java.io.FileWriter;
import java.io.Writer;
public class IODemo {
public static void main(String[] args) throws Exception { // 异常抛出, 不处理
// 使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");// 声明File 对象
// 通过子类实例化父类对象
Writer out = new FileWriter(f); String str = "Hello World!!!";
out.write(str);

// 关闭输出流
// out.close();
}
}

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出。但是如果程序没有关闭,则缓冲区中的内容是无法输出的。

什么叫缓冲区?
可以简单地把缓冲区理解为一段特殊的内存。某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

文件操作

Java使用 java.io.File 来提供对底层文件的抽象, File能够新建/删除/重命名文件和目录,但不能访问文件内容本身(需要使用IO流).
关于文件的具体操作请看:JavaIO – File类
关于JavaIO的具体实现请看:Java–IO详解

有收获再赞赏哦🤭
------ 本文结束感谢您的阅读-------------
0%