IO流概述
IO流,即输入输出流(Input Output Stream),是一种抽象概念,用来处理设备之间的数据传输问题,例如文件复制、文件上传、文件下载等。在Java中,对数据的操作通常是通过流的方式进行的,这些用于操作流的类都包含在IO包中。
按照流向分类,IO流可以分为输入流和输出流。输入流主要用于从外部设备(如文件、键盘、网络等)读取数据,而输出流则用于将数据写入外部设备。
按照数据类型分类,IO流可以分为字节流和字符流。字节流通常用于处理二进制数据,如图片、音频、视频等而字符流则只能操作纯字符数据,适用于处理文本文件等。
Java IO流还包括一些常用的父类,如字节流的InputStream和OutputStream,以及字符流的Reader和Writer。这些父类提供了读写数据的基本方法,子类可以通过继承这些父类来实现具体的数据读写操作。
字节输入流
以下是使用FileInputStream读取文件内容的基本步骤:
- 创建一个FileInputStream对象,指定要读取的文件的路径。
- 读取文件中的数据。可以使用read()方法一次读取一个字节,或者使用read(byte[] b)方法一次读取多个字节到字节数组中。
- 处理读取到的数据。
- 关闭输入流,释放系统资源。
实例一: 读取文本内容
public class IOLearn1 {
public static void main(String[] args) throws Exception {
//创建一个FileInputStream对象
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
int data;
//每次读取一个字节
while ((data=fileInputStream.read())!=-1){
System.out.print((char)data);
}
//关闭输入流
fileInputStream.close();
}
}
a.txt文本内容
实现结果:
实例二:以数组方式读取文本内容
import java.io.FileInputStream;
public class IOLearn2 {
public static void main(String[] args) throws Exception {
//创建一个FileInputStream对象
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
byte[] buffer=new byte[3];
//每次读取字节数组
int readCount;//返回此次读取到数组中字节个数
while ((readCount=(fileInputStream.read(buffer)))!=-1){
String s = new String(buffer, 0, readCount);
System.out.print(s);
}
//关闭输入流
fileInputStream.close();
}
}
注意:在以数组方式读取字节时, 新读取的字节会从前到后替代原有数组字符。
字节输出流
实例:复制文件,将a.txt内容复制到b.txt中
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class IOLearn3 {
public static void main(String[] args) throws Exception {
//创建一个FileInputStream对象
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
//创建文件输出流对象
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
//读取a.txt文件中的数据写入到b.txt中
int data;
while ((data=fileInputStream.read())!=-1){
fileOutputStream.write(data);
}
fileInputStream.close();
fileOutputStream.close();
}
}
结果:文件内容复制成功
注意:字节输入输出流适用于文件的复制,在读取文件可能会出现乱码,即使用字节输入流中的数组读取方式也不是好的选择,因为要使的不出现乱码就要求一次读取完文件中所用的字节,就要求数组长度要容纳文件中数据而内存远小于磁盘,此种方式会出现内存溢出,因此,字节输入流不适用读取文件内容。
字符输入流
实例:使用字符输入流读取文件内容
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
public class IOLearn4 {
public static void main(String[] args) throws Exception {
//创建字符输入流管道
FileReader fileReader = new FileReader("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
//读取数据
int read;
// while((read = fileReader.read())!=-1){
// System.out.print((char) read);
// }
// fileReader.close();
System.out.println("======================");
//使用字符数组读取数据
char [] chars=new char[3];
while ((read = fileReader.read(chars))!=-1){
System.out.print(new String(chars,0,read));
}
}
}
结果:
字符输出流
实例:复制文件
import java.io.FileReader;
import java.io.FileWriter;
public class IOLearn5 {
public static void main(String[] args) throws Exception {
//创建字符输入流管道
FileReader fileReader = new FileReader("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\a.txt");
//读取数据
int read;
FileWriter fileWriter=new FileWriter("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\lambada\\b.txt");
//使用字符数组读取数据
char [] chars=new char[3];
while ((read = fileReader.read(chars))!=-1){
fileWriter.write(chars, 0, read);
fileWriter.flush();
}
fileReader.close();
fileWriter.close();
}
}
结果:
注意在使用字符输出流输出数据到外部文件中时,要将缓存中的数据写入到外部文件中,也就是刷新流或者关闭流。