JAVA中的IO流操作规律总结
1. 说明
这篇博文,主要介绍JAVA中的IO流,JAVA中的IO流种类繁杂。如何使用正确的流对象去处理程序是一个令人棘手的问题。本篇博文将JAVA中的几大主要IO流,进行详细充分的讨论。希望可以给大家讲述清楚,什么情况下使用什么样的流对象去处理什么样的问题。
2. IO流的分类
JAVA中对数据的操作是通过流的方式来实现的即IO流,IO流主要用来处理设备之间的数据传输,流按流向分为两种:输入流,输出流。计算机中的所有文件都可以用字节去表示。因此便出现了字节流(包括字节输出流和字节输入流)。字节流可以操作任何数据。
但同时,为了便于字符的操作,出现了字符流(包括字符输出流和字符输入流)。字符流只能操作纯字符数据。字符是指我们人类所能看懂的文件符号。以下便是,这二大类流的抽象父类,以及分类详细介绍。
字节流的抽象父类:
InputStream 输入字节流超类
OutputStream 输出字节流超类
字符流的抽象父类:
Reader 输入字符流超类
Writer 输出字符流超类
3. 字节输出流OutputStream介绍
功能方法:
1. void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流。
2.void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
3.abstract void write(int b) : 将指定的字节写入此输出流。
4.void close(): 关闭此输出流并释放与此流有关的所有系统资源。
以上便是该抽象类的主要方法,但是创建对象的时候,不能使用抽象类,因此我们需要了解一下该超类的子类FileOutputStream 。
3.1子类FileOutputStream
1.FileOutputStream字节输出流的构造方法:
(1) FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
(2)FileOutputStream(File file, boolean append)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流,以追加的方式写入。
(3)FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
(4)FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流,以追加的方式写入, boolean append当表示为true时可以续写。
2.流对象的使用步骤
1. 创建流子类的对象,绑定数据目的(数据目的指你要写入的文件)
2. 调用流对象的方法write写
3. close()方法释放资源,关闭流对象。
3.注意事项
流对象的构造方法,可以创建文件,如果文件存在,直接覆盖.。
4.代码演示如下:
import java.io.FileOutputStream;
import java.io.IOException;
/*任务:
* FileOutputStream类
* 向c:\a.txt文件中写入数据,利用父类方法,使用子类创建对象
*/
public class FileOutputStreamDemo {
public static void main(String[] args)throws IOException {
//创建了一个FileOutputStream对象,并且在其构造方法中绑定了数据目的
FileOutputStream fos = new FileOutputStream("c:\\a.txt");
//流对象的方法write写数据
//写1个字节
fos.write(97);
//写字节数组
byte[] bytes = {65,66,67,68};
fos.write(bytes);
//写字节数组的一部分,1表示开始索引,2表示写几个
fos.write(bytes, 1, 2);
//写字符串
fos.write("hello".getBytes());
//关闭资源
fos.close();
}
}
4.字节输入流InputStream介绍
功能方法:
1. abstract int read() :
从输入流中读取数据的下一个字节。
2. int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
3. int read(byte[] b, int off, int len)
将指定 byte 数组中 从偏移量 off 开始的 len 个字节读入此输入流。
4.void close()
关闭此输入流并释放与该流关联的所有系统资源。
以上便是该类的功能方法,这个类的一个子类为FileInputStream类,下面我们对该子类进行详细介绍。
4.1子类FileInputStream
1.FileInputStream字节输入流的构造方法:
1.FileInputStream(File file)
创建一个向指定 File 对象表示的文件中读入数据的文件输入流。
2.FileInputStream(String name)
创建一个向指定name对象表示的文件中(name为文件名)读入数据的文件输入流。
3.流对象的使用步骤
1. 创建流子类的对象,绑定数据源(数据源指你要读入的文件)
2. 调用流对象的方法read()读。
3. close()方法释放资源,关闭流对象。
4.代码实现
import java.io.FileInputStream;
import java.io.IOException;
/*
* FileInputStream读取文件
* 读取方法 int read(byte[] b) 读取字节数组
* 数组作用: 缓冲的作用, 提高效率
* read返回的int,表示的含义为读取到多少个有效的字节数
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象,并且绑定数据源为c:\\a.txt。
FileInputStream fis = new FileInputStream("c:\\a.txt");
//创建字节数组
byte[] b = new byte[1024];
int len = 0 ;
//读取数据,并判断是否到达文件末尾,到文件末尾就会返回-1,循环结束。
while( (len = fis.read(b)) !=-1){
//采用了String类的构造方法。
System.out.print(new String(b,0,len));
}
//关闭流资源
fis.close();
}
}
5.字符输出流Writer介绍
Writer类是字符输出流类的抽象超类,只能写文本文件。它具有以下的功能方法:
1.功能方法
1. void write(int c)
表示写一个字符,到指定数据目的。
2. void write(char[] c)
表示写入一个字符数组。
3. abstract void write(char[] c int a ,int b)
表示写入一个字符数组的一部分,a,为开始写入的索引,b表示写几个。
4. void write(String str)
写入字符串。
5.abstract void flush()
刷新该流的缓冲。
6.abstract void close()
关闭此流,但要先刷新它。
5.1子类FileWriter
子类的构造方法
1.FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对象。
2.FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
代码实现:
import java.io.FileWriter;
import java.io.IOException;
/*
* 1.字符输出流
* java.io.Writer 所有字符输出流的超类
* 2.写文件,局限:只能写文本文件
* 3.构造方法: 写入的数据目的
* File 类型对象
* String 文件名
* 4.字符输出流写数据的时候,必须要运行一个功能,刷新功能, flush()
*/
public class WriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("c:\\a.txt");
//写1个字符
fw.write(100);
fw.flush();
//写1个字符数组
char[] c = {'a','b','c','d','e'};
fw.write(c);
fw.flush();
//写字符数组一部分
fw.write(c, 2, 2);
fw.flush();
//写字符串
fw.write("hello");
fw.flush();
fw.close();
}
}
6.字符输入流Reader介绍
Reader字符输入流为所有字符输入流的超类,只能读文本文件。该类的功能方法有如下:
1. int read()
读取1个字符
2.int read(char[] c)
读取字符数组
3. abstract void close()
关闭该流并释放与之关联的所有资源。
6.1子类FileReader
子类FileReader的构造方法 :
1. FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
2.FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
代码实现
import java.io.FileReader;
import java.io.IOException;
/*
* 字符输入流读取文本文件,所有字符输入流的超类
* 构造方法: 绑定数据源
* 参数:
* File 类型对象
* String文件名
*/
public class ReaderDemo {
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("c:\\a.txt");
//读取单个字符,并判断是否到达文件末尾,并打印读到的内容
/*int len = 0 ;
while((len = fr.read())!=-1){
System.out.print((char)len);
}*/
//读取字符数组
char[] ch = new char[1024];
int len = 0 ;
while((len = fr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
}
fr.close();
}
}
7.总结
以上,我们对JAVA中IO流部分的字节输入流、字节输出流、字符输入流、字符输出流以及它们的子类对象进行详细的介绍。同时,给出子类的构造方法以及读写数据方法,并且进行了代码演示。