JavaIO流基本操作
1.流的概念
定义:在 Java中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传 输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象 为各种类,方便更直观的进行数据操作。
2.输入输出流
输入 就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中。
输出 则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。
3.字节流、字符流
字节流:数据流中最小的数据单元是字节 。InputStream、OutputStream
字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节 。Reader、Writer
Java中的IO流的体系结构图:
4.字节流
4.1 FileInputStream 和 FileOutputStream
FileInputStream从文件系统中的某个文件中获得输入字节。
方法 | 解释 |
---|---|
FileInputStream(File file) | 通过打开与实际文件的连接创建一个,该文件由文件系统中的对象命名 |
FileInputStream(String name) | 通过打开与实际文件的连接来创建一个 FileInputStream,该文件由文件系统中的路径名 name 命名。 |
FileOutputStream用于读取诸如图像数据之类的原始字节流。
方法 | 解释 |
---|---|
FileOutputStream(File file) | 创建文件输出流以写入由指定的 File 对象表示的文件。 |
FileOutputStream(String name) | 创建文件输出流以指定的名称写入文件 |
示例:使用 FileInputStream 和 FileOutputStream 复制图片
public class Test4 {
public static void main(String[] args) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
try {
fileInputStream = new FileInputStream("/Users/yangtongchun/Downloads/JavaSe.png");
fileOutputStream = new FileOutputStream("/Users/yangtongchun/Downloads/ytc.png");
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
} finally {
fileInputStream.close();
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.2字节缓冲流 BufferedInputStream 和 BufferedOutputStream
缓冲流的作用:
当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作 起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区 数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高。
方法 | 解释 |
---|---|
BufferedInputStream(InputStream in) | 创建一个BufferedInputStream 并保存其参数,输入流,供以后使用 |
BufferedInputStream(InputStream in, int size) | 创建BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流,供以后使用 |
示例:使用BufferedInputStream 和 BufferedOutputStream 实现文件拷贝
public class Test4 {
public static void main(String[] args) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
try {
fileInputStream = new FileInputStream("/Users/yangtongchun/Downloads/JavaSe.png");
bufferedInputStream = new BufferedInputStream(fileInputStream);
fileOutputStream = new FileOutputStream("/Users/yangtongchun/Downloads/ytc.png");
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = bufferedInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
}
} finally {
bufferedOutputStream.flush();
fileInputStream.close();
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.字符流
5.1字符流FileReader和FileWriter
※ 如果要从文件中读取内容,可以直接使用 FileReader 子类。
※ FileReader 是用于读取字符流。 要读取原始字节流,请考虑使用 FileInputStream 。
方法 | 解释 |
---|---|
FileReader(File file) | 创建一个新的FileReader,给出File读取 |
FileReader(String fileName) | 创建一个新的FileReader,给定要读取的文件的名称 |
※ 如果是向文件中写入内容,应该使用 FileWriter 子类
※ FileWriter 是用于写入字符流。 要编写原始字节流,请考虑使用 FileOutputStream
方法 | 解释 |
---|---|
FileWriter(File file) | 给一个File对象构造一个FileWriter对象。 |
FileWriter(String fileName) | 构造一个给定文件名的FileWriter对象。 |
示例:使用FileReader 和 FileWriter 复制文件
public class Test4 {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader(new File("/Users/yangtongchun/Downloads/JavaSe.png"));
FileWriter fileWriter = new FileWriter(new File("/Users/yangtongchun/Downloads/ytc.png"));
int len = 0;
while ((len = fileReader.read()) != -1) {
fileWriter.write(len);
}
fileWriter.flush();
fileReader.close();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.2字符缓冲流 BufferedReader 和 BufferedWriter
为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度。
方法 | 解释 |
---|---|
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流 |
BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入流 |
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
方法 | 解释 |
---|---|
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流 |
BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区 |
示例:使用BufferedReader 和 BufferedWriter 进行文件拷贝
public class Test4 {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("/Users/yangtongchun/Downloads/JavaSe.png");
BufferedReader bufferedReader = new BufferedReader(fileReader);
FileWriter fileWriter = new FileWriter("/Users/yangtongchun/Downloads/ytc.png");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
String s = null;
while ((s = bufferedReader.readLine()) != null) {
bufferedWriter.write(s);
}
bufferedReader.close();
fileReader.close();
bufferedWriter.close();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.字节流与字符流对比
1.字节流操作的基本单位是字节;字符流操作的基本单位是Uncode码元。
2.字节流在操作的时候本身不会用到缓冲区,是与文件本身直接操作的;而字符流在操作的时候使用到缓冲区
3.所有文件的存储都是字节(byte)的存储,在磁盘上保留的是字节
4.在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的话,不会输出任何内容。
7.字符字节转换流
有时候我们需要进行字节流与字符流二者之间的转换,因为这是两种不同的流,所以,在进行转换的时候我们需要用到 OutputStreamWriter 和 InputStreamReader 。
InputStreamReader 是Reader的子类,将输入的字节流转换成字符流
方法 | 解释 |
---|---|
InputStreamReader(InputStream in) | 创建一个使用默认字符集的 InputStreamReader |
InputStreamReader(InputStream in,Charset cs) | 创建一个使用给定字符集的 InputStreamReader |
public static void test6() {
//当前 Java 类实际工作目录
try {
System.out.println(System.getProperty("user.dir"));
File f = new File("src/test1.txt");
System.out.println(f.exists());
FileInputStream fileInputStream = new FileInputStream(f);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,
StandardCharsets.US_ASCII);
char[] chars = new char[1024];
int len = 0;
while ((len = inputStreamReader.read(chars)) != -1) {
System.out.println(new String(chars, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
InputStreamWriter 是Writer的子类,将输出的字符流转换成字节流。
方法 | 解释 |
---|---|
OutputStreamWriter(OutputStream out) | 创建一个使用默认字符编码的OutputStreamWriter |
OutputStreamWriter(OutputStream out, Charset cs) | 创建一个使用给定字符集的OutputStreamWriter |
public class Test4 {
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream("/Users/yangtongchun/Downloads/JavaSe.png");
FileOutputStream fileOutputStream = new FileOutputStream("/Users/yangtongchun/Downloads/ytc.png");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1) {
outputStreamWriter.write(len);
}
fileInputStream.close();
outputStreamWriter.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上一篇: Java 优雅判空的方法