目录
一、IO流概述
(一)、什么是IO流
(二)、IO的分类
1、根据数据的流向分为:输入流和输出流。
2、格局数据的类型分为:字节流和字符流。
3、按流操作的对象分为:节点流与处理流
(三)、IO流的顶级父类
二、字节流
(一)、 一切皆为字节
(二)、字节输出流【OutputStream】
(三)、 FileOutputStream类
1、概述
2、构造方法:
3、写入数据的方法
4、写出换行
(四)、 字节输入流【InputStream】
(五)、 FileInputStream类
1、概述
2、构造方法
3、读取数据的方法
4、循环读取
三. 字符流
(一)、字符输入流【Reader】
(二)、FileReader类
1、概述
2、构造方法
3、读取字符数据的方法
(三)、字符输出流【Writer】
(四)、FileWriter类
1、概述
2、构造方法
3、写出数据的方法
4、关闭和刷新
四. IO异常的处理
1、JDK7前处理
2、JDK7的处理(扩展知识点了解内容)
3、JDK9的改进(扩展知识点了解内容)
一、IO流概述
(一)、什么是IO流
O流是Java提供的一种用于读写数据的机制。IO流分为输入流和输出流两种。输入流用于从外部读取数据到程序中,输出流用于将程序中的数据输出到外部。
Java中I/O操作主要是指使用
java.io
包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
(二)、IO的分类
1、根据数据的流向分为:输入流和输出流。
- 输入流 :把数据从
其他设备
上读取到内存
中的流。 - 输出流 :把数据从
内存
中写出到其他设备
上的流。
2、格局数据的类型分为:字节流和字符流。
- 字节流 :以字节为单位,读写数据的流。
- 字符流 :以字符为单位,读写数据的流。
3、按流操作的对象分为:节点流与处理流
- 节点流:直接对文件操作的流 特点:这种流直接操作文件,一般用于文件读或者写
- 处理流:操作其他流对象的流 特点:这种流不能直接操作文件 ,只能操作其他流对象,一般用于转换流的类型
(三)、IO流的顶级父类
InputStream -----> 字节输入流
OutputStream -----> 字节输出流
Reader -----> 字符输入流
Writer -----> 字符输出流
二、字节流
(一)、 一切皆为字节
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
(二)、字节输出流【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)
:将指定的字节输出流。
(三)、 FileOutputStream类
1、概述
FileOutputStream类是Java中用于将数据写入文件的类。它属于Java IO库中的一部分,位于java.io包中。FileOutputStream类提供了多个构造方法,可以根据需要选择不同的构造方法来创建输出流。
2、构造方法:
- FileOutputStream(String name):根据文件名创建输出流。
- FileOutputStream(String name, boolean append):根据文件名创建输出流,并指定是否在文件末尾添加数据。
- FileOutputStream(File file):根据File对象创建输出流。
- FileOutputStream(File file, boolean append):根据File对象创建输出流,并指定是否在文件末尾添加数据。
3、写入数据的方法
4、写出换行
- 回车符
\r
和换行符\n
:
- 回车符:回到一行的开头(return)。
- 换行符:下一行(newline)。
- 系统中的换行:
- Windows系统里,每行结尾是
回车+换行
,即\r\n
;- Unix系统里,每行结尾只有
换行
,即\n
;- Mac系统里,每行结尾是
回车
,即\r
。从 Mac OS X开始与Linux统一。
(四)、 字节输入流【InputStream】
java.io.InputStream
抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
public void close()
:关闭此输入流并释放与此流相关联的任何系统资源。public abstract int read()
: 从输入流读取数据的下一个字节。public int read(byte[] b)
: 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
(五)、 FileInputStream类
1、概述
FileInputStream类是Java中用于读取文件数据的类。它继承自InputStream类,并提供了一些额外的方法来读取文件中的字节数据。
2、构造方法
FileInputStream(File file)
: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。FileInputStream(String name)
: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
3、读取数据的方法
4、循环读取
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("StreamProgram\\a.txt");
int b;
while ((b = fis.read()) != -1) {
System.out.println((char) b);
}
fis.close();
}
三. 字符流
(一)、字符输入流【Reader】
java.io.Reader
抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
public void close()
:关闭此流并释放与此流相关联的任何系统资源。public int read()
: 从输入流读取一个字符。public int read(char[] cbuf)
: 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
(二)、FileReader类
1、概述
java.io.FileReader
类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
2、构造方法
FileReader(File file)
: 创建一个新的 FileReader ,给定要读取的File对象。FileReader(String fileName)
: 创建一个新的 FileReader ,给定要读取的文件的名称。
3、读取字符数据的方法
(三)、字符输出流【Writer】
java.io.Writer
抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。
void write(int c)
写入单个字符。void write(char[] cbuf)
写入字符数组。abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分,off数组的开始索引,len写的字符个数。void write(String str)
写入字符串。void write(String str, int off, int len)
写入字符串的某一部分,off字符串的开始索引,len写的字符个数。void flush()
刷新该流的缓冲。void close()
关闭此流,但要先刷新它。
(四)、FileWriter类
1、概述
java.io.FileWriter
类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
2、构造方法
FileWriter(File file)
: 创建一个新的 FileWriter,给定要读取的File对象。FileWriter(String fileName)
: 创建一个新的 FileWriter,给定要读取的文件的名称。
3、写出数据的方法
4、关闭和刷新
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要
flush
方法了。
flush:
刷新缓冲区,流对象可以继续使用。close:
先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
四. IO异常的处理
1、JDK7前处理
public class HandleException1 {
public static void main(String[] args) {
// 声明变量
FileWriter fw = null;
try {
//创建流对象
fw = new FileWriter("fw.txt");
// 写出数据
fw.write("IO中的异常");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、JDK7的处理(扩展知识点了解内容)
public class HandleException2 {
public static void main(String[] args) {
// 创建流对象
try ( FileWriter fw = new FileWriter("fw.txt"); ) {
// 写出数据
fw.write("IO中的异常");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、JDK9的改进(扩展知识点了解内容)
public class TryDemo {
public static void main(String[] args) throws IOException {
// 创建流对象
FileReader fr = new FileReader("in.txt");
FileWriter fw = new FileWriter("out.txt");
// 引入到try中
try (fr; fw) {
// 定义变量
int b;
// 读取数据
while ((b = fr.read())!=-1) {
// 写出数据
fw.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}