文章目录
一、IO概述
1. 什么是IO?
- 把计算机上数据的传输,按照流动的方向,以内存为基准,分为输入input和输出output
- 所谓的
IO
操作,就是利用java.io
包下的内容,进行输入输出操作
2. IO的分类
2.1 按流动的方向分
- 输入流:把数据从其他设备上读取到内存中的流
- 输出流:把数据从内存上写出到其他设备上的流
2.2 按数据的类型分
- 字节流:以字节为单位,读写数据的流
- 字节流处理的最基本单位是单个字节,通常用来处理二进制数据。
- 字符流:以字符为单位,读写数据的流
- Java中的字符流处理的最基本单位是Unicode码元,(大小2字节)。通常处理文本数据
3. IO流中的根类
二、字节流
1. 一切皆字节
- 一切文件数据(文本、图片、视频等)在存储的时候,都是以二进制数据保存的,最后都是一个一个的字节,那么在传输的时候肯定也是一样的
- 所以,字节流可以传输任意文件数据,在操作流的时候,需要明确的一点是,无论使用什么样的流对象,底层传输的始终都只是二进制数据,也就是字节
2. 字节输出流(抽象类):OutputStream
java.io.OutputStream
抽象类是表示字节输出流的所有类的根类,将指定的字节信息输出到目的地。它定义了字节输出流的基本的共性的功能和方法:public void close()
:关闭输出流,并释放与此流相关的任何系统资源。- 当完成流的操作时,必须调用此方法,释放系统资源。
public void flush()
:刷新此输出流,并强制任何缓冲的输出字节被写出public void write(byte[] b)
:将b.length
长度的字节从指定的字节数组写入此输出流public void write(byte[] b, int off, int len)
:从指定的直接数组写入长度为len
的字节,从偏移量off
开始输出到此输出流public abstract void write(int b)
:写入指定的字节到这个输出流
3. FileOutputStream
java.io.FileOutputStream
:文件输出流,将数据写出到文件。也就是抽象类OutputStream
最简单的一个继承类
3.1 构造方法
-
public FileOutputStream(File file)
:创建文件输出流以写入指定的File
对象表示的文件 -
public FileOutputStream(String name)
:创建文件输出流以指定的名称写入文件 -
当创建一个流对象的时候,必须传入一个文件路径。该路径下:
- 如果没有这个文件,则会创建该文件
- 如果有这个文件,会清空该文件的数据
-
示例代码
public class FileOutputStreamConstructor_Demo01 {
public static void main(String[] args) throws IOException {
//使用File对象创建流对象
File file = new File("aa.txt");
FileOutputStream fos = new FileOutputStream(file);
//使用文件名创建流对象
FileOutputStream fos1 = new FileOutputStream("b.txt");
}
}
- 效果:在当前项目的根目录下存在了两个
txt
文件
3.2 写出字节数据
3.2.1 写出单个字节
- 写出字节:
write(int b)
,每次可以写出一个字节数据 - 代码
public class FOSWrite_Demo02 {
public static void main(String[] args) throws IOException {
//0. 使用文件名创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
//1. 写出数据
fos.write(97);//1.1 对应ASCII码中 的a
fos.write(98);
fos.write(99);
//2. 关闭资源
fos.close();
}
}
- 结果
- 注意这里
int
类型的大小是4
个字节,但只会保留一个字节的信息写出,也就是第一个字节的int值
3.2.2 写出字节数组
-
write(byte[] b)
:每次写出数组中的数据 -
代码
public class FOSWrite_Demo03 {
public static void main(String[] args) throws IOException {
//0. 使用文件名创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
//1. 字符串转换为字节数组
byte[] b = "正在学IO".getBytes();
//2. 写出字节数组
fos.write(b);
//3. 关闭资源
fos.close();
}
}
- 效果
3.2.3 写出指定起点和长度的字节数组
-
write(byte[] b, int off, int len)
:从off
开始,往后len
个字节 -
代码
public class FOSWrite_Demo04 {
public static void main(String[] args) throws IOException {
//0. 使用文件名创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
//1. 字符串转换为字节数组
byte[] b = "abcde".getBytes();
//2. 写出指定开始位置和长度的 字节数组
//2.1 起始位置(索引) = 2:c
//2.2 长度=2,从起始位置算起, cd
fos.write(b,2,2);
//3. 关闭资源
fos.close();
}
}
-
效果
-
上述的写出字节数据,可以这样理解吗:通过
fos
这个输出流对象,把内存中的数据以字节为单位输出到了指定的一个文件中去
3.3 数据追加续写(2个相关的构造方法)
- 上面的写出方式中,每创建一个流对象,都会先清空掉文件中的内容
- 如何在保留文件内容的基础上,再往后面进行写入数据呢?
3.3.1 相关方法(构造方法)
-
public FileOutputStream(File file, boolean append)
:创建文件输出流写入由指定的File
对象表示的文件 -
public FileOutputStream(String name, boolean append)
:创建文件输出流,以指定的名称写入文件 -
上述方法中的
boolean
类型的append
true
:表示追加数据false
:表示清空原有数据
-
代码
public class FOSWrite_Demo05 {
public static void main(String[] args) throws IOException {
//0. 使用文件名创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt",true);
//1. 字符串转换为字节数组
byte[] b = "追加写入".getBytes();
//2. 写出字节数组
fos.write(b);
//3. 关闭资源
fos.close();
}
}
- 写入前
- 写入后
3.4 写出换行
3.4.1 不同操作系统换行的不同
- Windows系统里,每行结尾是 回车+换行 ,即
\r\n
- 回车符
\r
:回到一行的开头(return)。 - 换行符
\n
:下一行(newline)。
- 回车符
- Unix系统里,每行结尾只有 换行 ,即
\n
- Mac系统里,每行结尾是 回车 ,即`r `。从 Mac OS X开始与Linux统一