文章目录
前言
提示:针对最近几天对I/O流的学习,做出一些自己的理解,希望能帮助到大家,有不对的地方请指出。
一、I/O流体系结构图
在Java中File类对象,可以用来操作文件,但是不能处理文件内容。
为了处理文件内容,进行 I/O 操作,必须使用流的操作模式来完成。
二、字节流
1.字节输入流InputStream
使用InputStream类,可以在程序中读取文件内容。
InputStream类主要方法:
-
public int read(byte b[]) throws IOException
读取数据到字节数组中,返回数据的读取个数。如果此时开辟的字节数组大小大于读取的数据大小,则返回的就是读取个数;如果要读取的数据大于数组的内容,那么这个时候返回的就是数组长度;如果没有数据了还在读,则返回-1 -
public int read(byte b[], int off,int len) throws IOException
读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满了则返回长度(len),如果没有读取满则返回读取的数据个数,如果读取到最后没有数据了返回-1 -
public abstract int read() throwsIOException
读取单个字节,每次读取一个字节的内容,直到没有数据了返回-1
2.FileInputStream
-
FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文件系统中的路径名name命名。
-
字节输入流读取数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
-
一次读一个字节数组的方法
- public int read(byte[] b):从输入流读取最多b.length个字节的数据
- 返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
3.FileOutputStream
-
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
-
使用字节输出流写数据的步骤:
- 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
主要方法:
-
void write(int b)
将指定的字节写入此文件输出流 一次写一个字节数据 -
void write(byte[] b)
将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 -
void write(byte[] b, int off, int len)
将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 -
字节流写数据如何实现换行
- windows:\r\n
- linux:\n
- mac:\r
-
字节流写数据如何实现追加写入
- public FileOutputStream(String name,boolean append)
- 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
4.BufferedInputStream
BufferedInputStream继承于FilterInputStream,提供缓冲输入流功能。缓冲输入流相对于普通输入流的优势是,它提供了一个缓冲数组,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读取失败(缓冲区无可读数据),则选择从物理数据源(譬如文件)读取新数据(这里会尝试尽可能读取多的字节)放入到缓冲区中,最后再将缓冲区中的内容部分或全部返回给用户.由于从缓冲区里读取数据远比直接从物理数据源(譬如文件)读取速度快。同时正因为它们实现了缓冲功能,所以要注意在使用BufferedOutputStream写完数据后,要调用**flush()**方法或close()方法,强行将缓冲区中的数据写出。否则可能无法写出数据。
public class Demo {
public static void main(String[] args){
try {
BufferedInputStream bis=new BufferedInputStream("test\\java.txt");
byte[] buffer=new byte[1024];
int len;
while((len=bis.read(buffer))!=-1){
System.out.print(len);
}
//关闭的时候只需要关闭最外层的流就行了
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.BufferedOutputStream
bufferedoutputstream是带缓冲区的输出流,能够提高文件的写入效率。
public class Demo {
public static void main(String[] args){
try {
BufferedOutputStream bos=new BufferedOutputStream("test\\java.txt");
String content="我是缓冲输出流测试数据!";
bos.write(content.getBytes(),0,content.getBytes().length);
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、字符流
1.字符输入流Reader
常见的字符输入流有:
- Reader
- InputStreamReader
- FileReader
- BufferedReader
他们的区别与用途:
Reader是字符输入流的抽象基类 ,它定义了以下几个函数:
- read() :读取单个字符,返回结果是一个int,需要转成char;到达流的末尾时,返回-1
- read(char[] cbuf):读取cbuf的长度个字符到cbuf这种,返回结果是读取的字符数,到达流的末尾时,返回-1
- close() :关闭流,释放占用的系统资源。
- InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。它除了可以使用基类定义的函数,它自己还实现了以下函数:
- read(char[] cbuf, int offset, int length) :从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
- FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。
BufferedReader可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。它除了可以使用基类定义的函数,它自己还实现了以下函数:
- read(char[] cbuf, int offset, int length) :从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
- readLine() :读取一个文本行,以行结束符作为末尾,返回结果是读取的字符串。如果已到达流末尾,则返回 null
public void test40 throws lOException {
FileReader reader =new FileReader("test\\b.txt");
char[]cbuf=new char[1024];
int len;
while((len=reader.read(cbuf))!=-1){
System.out.println(new String(cbuf,0,len));}
reader.close():
}
2.字符输出流
常见的字符输出流有:
- Writer
- OutputStreamWriter
- FileWriter
- BufferedWriter
他们的区别与用途:
Writer是字符输出流的抽象基类, ,它定义了以下几个函数:
- write(char[] cbuf) :往输出流写入一个字符数组。
- write(int c) :往输出流写入一个字符。
- write(String str) :往输出流写入一串字符串。
- write(String str, int off, int len) :往输出流写入字符串的一部分。
- close() :关闭流,释放资源。 【这个还是抽象的,写出来是说明有这个关闭功能】
- flush():刷新输出流,把数据马上写到输出流中。
OutputStreamWriter可以使我们直接往流中写字符串数据,它里面会帮我们根据字符编码方式来把字符数据转成字节数据再写给输出流,它相当于一个中介\桥梁。
FileWriter与OutputStreamWriter功能类似,我们可以直接往流中写字符串数据,FileWriter内部会根据字符编码方式来把字符数据转成字节数据再写给输出流。
BufferedWriter比FileWriter还高级一点,它利用了缓冲区来提高写的效率。它还多出了一个函数:
- newLine() :写入一个换行符。
public class Demo {
public static void main(String[] args){
BufferedReader br=new BufferedReader(new FileReader("test\\java.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("test\\java2.txt"));
String line;
int count=1;
while ((line=br.readLine())!=null){
bw.write((count++)+line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}