一、O流的概述和分类
1.概述:
IO流:可以从文件中读取数据,也可以把数据存储到文件中。
常见应用:文件复制(U盘拷贝内容)、上传内容(微信图片、QQ空间图片)、下载文件(迅雷下载)。
2.分类:输入流(从文件中读取数据到Java程序)和输出流(从Java程序中将数据写入文件)
二、FileWriter类(输出流类,往文件中写数据)
FileWriter fw = new FileWriter("d:\\a.txt"); //创建输出流对象
fw.write("IO流你好"); //调用输出流对象的写数据方法,写一个字符串数据
fw.flush(); //数据并没有直接写到内存中,而是写到了内存缓冲区,经过flush()方法进行刷新后即可
fw.close(); //释放资源,通知系统释放和该文件相关的资源
//while(true){} 用于测试释放资源,若不执行close(),此时若程序不结束,则该文件一直被占用,执行close()函数后,则资源释放,文件将不再被占用
创建输出流对象的做了哪些事情:A:调用系统资源创建了一个文件;B:创建输出流对象;C:把输出流对象指向该文件。
路径:相对路径,即相对于当前项目而言的根目录,若创建流对象时不指定;绝对路径,在计算机中的路径。
close()方法与flush()方法的区别:flush()方法只是刷新缓冲区,流对象还可以继续使用;而close()方法是在释放资源前刷新缓冲区,资源释放后,流对象关闭,不可以再用。
FileWriter类写数据的5种方法:
1): void write(String str):写一个字符串数据;
2): void write(String str, int index, int len):写一个字符串中的一部分数据(从索引index开始,长度为len);
3): void write(int ch):写一个字符数据,这里写int类型的好处是即可以写char类型的数据,也可以写char类型对应的int型数据,如传递的参数可以是’a’,也可以是97,最后的输出都为a;
4): void write(char[] chs):写一个字符数组数据;
5): void write(char[] chs, int index, int len):写一个字符数组的一部分数据,从索引index开始写,长度为len。
FileWriter类写入时换行和追加写入:
1)换行:Java虚拟机中,\n可以实现换行,但是在操作系统中的换行识别符号不一致;
在Windows系统中:换行符为\r\n
在Linux系统中:换行符为\n
在MAC系统中:换行符为\r
for(int i = 0; i < 10; i++){
fw.write("hello"+i);
fw.write("\r\n");
}
2)追加:FileWriter的构造方法:FileWriter(String filename, Boolean append)
当append为true时,表示追加,为false或者只有filename一个参数,则代表决绝追加。
FileWriter fw = new FileWriter(“c.txt”, true); //表示追加
三、FileReader类(输入流类,往程序中读取数据)
通过一次读写一个字符:
注意:调用读数据方法,每次执行读取一个字符,并且文本中的空格和换行符也能被读取。
FileReader fr = new FileReader("fw.txt");
int ch;
while((ch = fr.read()) != -1){ //如果读到ch等于-1,则表示读到结尾了,跳出循环
System.out.print((char)ch); //不用执行换行打印,ch中也会读到换行符,可以输出对应格式,这里读取的是字符的数字表示,可将其转化为字符表示
}
fr.close(); //释放资源
通过一次读写一个字符复制文本文件:
数据源:writetxt.java - - - 读数据 - - - FileReader类 - - -
目的地:copy.txt - - - 写数据 - - - FileWriter类 - - -
FileReader fr = new FileReader("writetxt.java"); //创建输入流对象,从writetxt.java读取数据送到程序中的fr
FileWriter fw = new FileWriter("copy.txt"); //创建输出流对象,从程序往copy.txt文本中写数据
int ch;
while((ch = fr.read()) != -1) { //不断读取数据
fw.write(ch); //不断写数据
}
fw.close(); //释放fr和fw资源,先后顺序无影响
fr.close();
通过一次读取一个字符数组:
int read(char[] cbuf)方法,调用过后,cbuf将填入读取值,并返回读取长度len
FileReader fr = new FileReader("writetxt.java");
char[] chs = new char[5]; //这里的5最好换成1024极其整数倍
int len;
while((len = fr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len)); //通过使用String类的构造方法将字符数组转化为字符串输出
}
fr.close(); //释放资源
通过一次读取一个字符数组复制文本文件:
FileReader fr = new FileReader("writetxt.java"); //创建输入流对象,从writetxt.java读取数据送到程序中的fr
FileWriter fw = new FileWriter("copy.txt"); //创建输出流对象,从程序往copy.txt文本中写数据
char[] chs = new chs[1024];
int len;
while((len = fr.read(chs)) != -1) { //不断读取数据并放入数组中
fw.write(chs, 0, len); //不断写数组数据
}
fw.close(); //释放fr和fw资源,先后顺序无影响
fr.close();
两种读取数据方式的区别:
方式一:public int read() :首先定义一个fr对象,指向内存中的fr.txt文件,然后挨个字符读取并赋值到变量ch中。
方式二:public int read(char[] cbuf):定义一个数组,首先将读取到的5个字符放到数组中,第二次读取时将另外的5个或者小于5个的字符读取到数组中,并冲掉原来对应位置的数据。
注意:windows中.txt文件的换行符为/r/n.
四、缓冲流
1.缓冲流的基本使用
BufferedWriter(字符输出流):将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入;
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); //创建输出流缓冲对象
bw.write("hello"); //将字符串写到输出缓冲流中
bw.flush(); //刷新输出缓冲流
bw.close(); //释放资源
BufferedReader(字符输入流):从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和字符串的高效读取。
BufferedReader br = new BufferedReader(new FileReader("Demo.java")); //创建输入流缓冲对象
int ch;
while((ch = br.read()) != -1) { //每次按一个字符读取
System.out.print((char)ch);
}
BufferedReader br = new BufferedReader(new FileReader("Demo.java")); //创建输入流缓冲对象
char[] chs = new char[1024];
int len;
while((len = br.read(chs)) != -1) { //每次按字符数组读取
System.out.print(new String(chs, 0, len));
}
br.close(); //释放资源
2.缓冲流复制文本文件的两种方式
与上述的普通输入输出流方式的区别主要为:
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); //创建输出流缓冲对象
BufferedReader br = new BufferedReader(new FileReader("Demo.java")); //创建输入流缓冲对象
/*普通方式
FileReader fr = new FileReader("writetxt.java"); //创建输入流对象,从writetxt.java读取数据送到程序中的fr
FileWriter fw = new FileWriter("copy.txt"); //创建输出流对象,从程序往copy.txt文本中写数据
*/
其余代码部分完全一致。
3.缓冲流的特殊功能
BufferedWriter(字符输出流):
void newLine():向缓冲流中写入一个换行符,这个换行符由系统(不同的系统写不同的换行符)决定。
BufferedReader(字符输入流):
String readLine():一次读取一行数据,但是不读取换行符,打印输出时要采用println()。
缓冲流的特殊功能复制文件:
BufferedReader br = new BufferedReader(new FileReader("Demo.java")); //创建输入流缓冲对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); //创建输出流缓冲对象
String line;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
br.close(); //释放资源
bw.close();
4.实现文本复制的5种方法:
1)普通流按照每次读写一个字符的方法;
2)普通流按照每次读写一个字符数组的方法;
3)缓冲流按照每次读写一个字符的方法;
4)缓冲流按照每次读写一个字符数组的方法;
5)缓冲流特殊功能函数,缓冲输入流每次读取一行数据,输出流将其写入文本文件,同时写入换行符。
5.将集合与文本文件之间读写:
1.将集合中数据写到文本文件中:
//创建集合对象
ArrayList<String> array = new ArrayList<String>();
//往集合中添加字符串元素
array.add("hello");
array.add("world");
array.add("add");
//创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));
//遍历集合,每遍历一个字符串元素,则将其看作数据写到文本文件中
for(int i=0; i < array.size(); i++){
String s = array.get(i);
bw.write(s);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
2.将文本文件中数据读取到集合中:
//创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("array.txt"));
//创建集合对象
ArrayList<String> array = new ArrayList<String>();
//读取数据
String line;
while((line = br.readLine()) != null) {
array.add(line);
}
//释放资源
br.close();
//遍历集合数据
for(int i=0; i < array.size(); i++){
String s = array.get(i);
System.out.println(s);
}