流,其实是个抽象的概念,就像我们生活中常见的水流一样,那么水流就有从哪里来?到哪里去?这两个问题,就分别对应的java中的数据源和目的地,流中传送的是java中要处理的数据,可以是字符形式也可以是字节形式。
流的分类有以下几种:
如下图所示
我以前学的时候总是搞不清楚输入流输出流到底是从哪里来到哪里去,今天总结一下,感觉还挺便于理解的。
首先我们始终记住一点:我们的输入流、输出流是相对我们编写的应用程序来说的。
假如说我们有一个A.txt文件,我们编写了一个java程序,想操作这个A文件,将操作后的结果变为B文件。那么这时
说到API,这个IO流确实真的是太太太讨厌了,API真的是太多太多了,就像高中背课文一样,还总忘,着实很尴尬,不过我今天就把我的一些总结理解通过这个真实的例子写出来(只是操作磁盘文件API),感觉或许会帮到一些忙呢
A文件
注意: 每一行的双引号都去掉了
B文件
关注此公众号 xhJaver ,后台回复“09IO” 即可获得此思维导图以及文中全套代码,重要的地方都有备注及注释
老大现在发给了我们一个A.txt,让我们处理下,一个小时之后把处理好的文本B.txt发给他,所以我们现在有文件A,自己也可以创建个文件B.txt,如图所示
我们来实现下
//输入流 (读取数据到程序中)
public static List<String> read(String APath) throws IOException {
//创建一个字节输入流 从A.txt里读取数据出来
FileInputStream fileInputStream = new FileInputStream(APath);
// 因为字节流的话,没有行的概念,需要转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
//从转换的字符输入流中读取文本,这个时候就有行的概念了
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//读出来的每一行的值
String s = "";
//用个list存储修改后读出来的每一行的值
List<String> list = new ArrayList<String>();
while ((s = bufferedReader.readLine()) != null) {
//对读出来的这一行的值进行操作,这次我们是替换引号,以后就是根据业务来操作了
s =s.replace("\"","");
//将修改后的值存储进list
list.add(s);
}
//关掉资源
bufferedReader.close();
inputStreamReader.close();
fileInputStream.close();
//打印下list,看下我们的list存储的数据对不对(是不是去除引号后的数据)
for (int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
return list;
}
运行后控制台的结果是
//输出流(从程序中输出到B文本文件)
public static void writer(String BPath, List<String> list) throws IOException{
//字节输出流,true的意思是追加在文件末尾,默认是false不追加,替换
FileOutputStream fileOutputStream = new FileOutputStream(BPath,true);
//将字节流转换为字符流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
//从转换的字符输出流中写入文本,这个时候就有行的概念了
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
for (int i=0;i<list.size();i++){
//将list内的内容写入到文件中
bufferedWriter.write(list.get(i));
//换行
bufferedWriter.newLine();
}
//关闭流
bufferedWriter.close();
System.out.println("写入结束啦");
}
这时我们打开B文件会发现内容已经从无到有了
我们代码中做了很多层转换,例如编写输入流时的代码
//创建一个字节输入流 从A.txt里读取数据出来
FileInputStream fileInputStream = new FileInputStream(APath);
// 因为字节流的话,没有行的概念,需要转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
//从转换的字符输入流中读取文本,这个时候就有行的概念了
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
编写输出流时的代码
//字节输出流,true的意思是追加在文件末尾,默认是false不追加,替换
FileOutputStream fileOutputStream = new FileOutputStream(BPath,true);
//将字节流转换为字符流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
//从转换的字符输出流中写入文本,这个时候就有行的概念了
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
那我们可不可以简化下呢?当然是可以的啦
我们可以通过FileReader和FileWriter来简化上面的字符流的读写操作。
FileReader fileReader = new FileReader(APath);
BufferedReader bufferedReader = new BufferedReader(fileReader);
FileWriter fileWriter = new FileWriter(BPath);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
结果还是一样的,但是API变的更加精炼了起来。
我们通过这个我实际遇到过的问题,来熟悉了解了下IO流的一些操作,我再梳理总结一下,如下图所示(若有错误请指出,谢谢大佬们指点)
A a = new A();
B b = new B(a);