1. 简介
1.1. IO流的分类
- 按照流中数据流动的方向,可以分为输入流和输出流
- 按照数据在流中的大小单位,可以分为字节流和字符流
1.2. 基础的IO流
在java.io包中有很多流,但基本上所有的流都直接或者间接继承自这几个流,这几个流也被称为父类流。
-
字节输入流:InputStream
-
字节输出流:OutputStream
-
字符输入流:Reader
-
字符输出流:Writer
1.3. 注意事项:
-
他们都是抽象类,不能直接实例化,需要借助子类对象
-
流对象一旦实例化完成,此时这个流会持有这个文件,此时将不能对这个文件进行某些操作
-
流在使用后需要释放资源
2. 基础流
2.1. InputStream & FileInputStream
-
FileInputStream的构造方法
FileInputStream(File file); FileInputStream(String file);
-
FileInputStream的常用方法
//每次读取一个字节 int read(); //读取流中数据,存到arr数组中 int read(byte[] arr);
try(InputStream fileInputStream=new FileInputStream("directory\\day24\\test")){ //1.实例化一个字节数组,用来读取流中的数据 byte[] array=new byte[512]; int count; while ((count=fileInputStream.read(array))!=-1){ //将读取的[0,count)转换成字符串 String str=new String(array,0,count); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); }
2.2. OutputStream & FileOutStream
-
FileOutputStream的构造方法
FileOutputStream(File file); FileOutputStream(File file,boolean b); //第二个代表是否是追加数据 FileOutputStream(String file); FileOutputStream(String file,boolean b);
-
FileOutputStream的常用方法
write(int b); write(byte[] array); write(byte[] array,int start,int end); flush();//冲刷输出流,加速流中的数据流动到文件中
2.3. Reader & FileReader
-
FileReader的构造方法
FileReader(File file); FileReader(String fileName);
-
FileReader的常用方法
read()// : 从输入流中读取一个字符,这个方法的返回值,并不是一个char,而是一个int。这个int,就是这个字符在字符集中存储的数字 read(char[] array) // : 从输入流中读取数据到一个字符数组中
2.4. writer & FileWriter
-
FileWrite的常用方法
write(int c) : 将一个字符,写入到输出流中 write(char[] array) : 将一个字符数组中的所有的数据写到输出流中 write(char[] array, int offset, int length) : 将一个字符数组中指定部分的数据写入到输出流中 write(String str) : 将一个字符串中的数据写入到输出流中 write(String str, int offset, int length) : 将一个字符串中的指定部分的数据写入到输出流中
2.5. 拷贝文件夹\文件
/**
* 拷贝文件夹,给的是源文件,以及目标地址,因此我们需要先得到“目标文件”
* @param src 源文件
* @param dise 目标地址
*/
private static void copyDirectory(File src,File dise){
//得到目标文件的File
File file=new File(dise,src.getName());
//源文件是文件,拷贝并退出
if (src.isFile()){
copy(src,file);
return;
}
//源文件是个目录,创建目标地址,将目录内的数据遍历拷贝
file.mkdirs();
File[] files = src.listFiles();
for (File f : files) {
//将源文件,和目标文件夹传递过去
copyDirectory(f,file);
}
}
/**
* 拷贝文件
* @param src 源文件
* @param dise 目标文件
*/
private static void copy(File src,File dise){
try(BufferedReader bufferedReader=new BufferedReader(new FileReader(src));
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(dise,true))) {
String line=null;
while ((line=bufferedReader.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}