IO流(一)字符流
- 一、IO流是什么?
- 二、File类
- 三、引入IO流
- 四、代码演示
- 例题:通过java程序完成文件的复制操作
- 从文件中读取数据(一个一个读)
- 向文件中写入数据(一个一个写)
- 利用缓冲数组读取
- 利用缓冲数组输出
- 利用FileReader,FileWriter进行文件复制
- 正片开始!!!
- 五、使用IO流建议
- 总结
一、IO流是什么?
我们在初学Java的时候通常都使用控制台达成需求,但是我们写入的数据的作用域只存在于控制台,数据随着程序执行完毕就消失了,等下一次再运行程序的时候需要重新写入数据,IO流的作用可以将程序中的数据永久的保存到一个数据源中。
二、File类
File类:封装文件/目录的各种信息,对目录/文件进行操作,但是我们 不可以获取到文件/目录中的内容。
File类就是上文提到的数据源,因为我们刚开始使用IO流通常都会将数据写到一个记事本文件里,
File就是将这个文件封装到File中再用IO流进行操作,一下是File的实例化以及一些方法,不过多演示,有兴趣的话可以将代码复制到IDEA中去感受一下。
public static void main(String[] args) {
//将目录封装为File类的对象:
File f = new File("D:\\IDEA_workspace");
System.out.println("文件是否可读:"+f.canRead());
System.out.println("文件是否可写:"+f.canWrite());
System.out.println("文件的名字:"+f.getName());
System.out.println("上级目录:"+f.getParent());
System.out.println("是否是一个目录:"+f.isDirectory());
System.out.println("是否是一个文件:"+f.isFile());
System.out.println("是否隐藏:"+f.isHidden());
System.out.println("文件的大小:"+f.length());
System.out.println("是否存在:"+f.exists());
System.out.println("绝对路径:"+f.getAbsolutePath());
System.out.println("相对路径:"+f.getPath());
System.out.println("toString:"+f.toString());
三、引入IO流
I/O : Input/Output的缩写,用于处理设备之间的数据的传输。
形象理解:IO流 当做一根 “管”
四、代码演示
例题:通过java程序完成文件的复制操作
从文件中读取数据(一个一个读)
public static void main(String[] args) throws IOException {
//文件--》程序:
//1.创建一个File类的对象
File f = new File("d:\\Test.txt");
//2.创建一个FileReader的流的对象,利用FileReader这个流,这个“管”连接到数据源上去
FileReader fr = new FileReader(f);
//3.进行操作“吸”的动作 ---》读取动作
int n = fr.read(); //读取程序中的数据
while(n!=-1){
System.out.println(n); //循环读取,打印到控制台
n = fr.read();
}
//4.关闭流
//流靠虚拟机本身没有办法帮我们关闭,此时必须程序员手动关闭:
fr.close();
}
向文件中写入数据(一个一个写)
public static void main(String[] args) throws IOException {
//1.有个目标文件:
File f = new File("d:\\demo.txt");
//2.创建一个FileWriter的流的对象,利用这个对象,将这个“管”连接到数据源上去
FileWriter fw = new FileWriter(f);
//3.开始动作:输出动作:
//一个字符一个字符的往外输出:
String str = "hello你好";
//因为字符串的底层逻辑是char类型数组,所以字符串可以获得到长度
for (int i = 0 ;i < str.length();i++){
fw.write(str.charAt(i));
}
//4.关闭流:
fw.close();
}
利用缓冲数组读取
public static void main(String[] args) throws IOException {
//1.创建一个File类的对象
File f = new File("d:\\Test.txt");
//2.创建一个FileReader的流的对象
FileReader fr = new FileReader(f);
//3.读取动作
char[] ch = new char[50];//缓冲数组
int len = fr.read(ch);//一次读取50个:返回值是这个数组的有效长度
while(len!=-1){//如果读取动作结束后数组里有东西,也就是有效长度不是-1
//方式1:
/*for (int i = 0 ;i < len;i++){
System.out.println(ch[i]);
}*/
//正确方式2:将数组转为String:(建议使用)
String str = new String(ch,0,len);
System.out.print(str);
len = fr.read(ch);//重新读取下一次
}
//4.关闭流
fr.close();
}
利用缓冲数组输出
public static void main(String[] args) throws IOException {
//1.有个目标文件:
File f = new File("d:\\demo.txt");
//2.创建一个FileWriter的流的对象,利用这个对象,将这个“管”连接到数据源上去
FileWriter fw = new FileWriter(f,true);
//3.开始动作:输出动作:
char[] ch = new char[50];
int len = fr.read(ch);
while(len!=-1){
String s = new String(ch,0,len);
fw.write(s);
len = fr.read(ch);//继续写下一批
}
//4.关闭流:
fw.close();
}
利用FileReader,FileWriter进行文件复制
正片开始!!!
思路:边读边写
public class Test04 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) throws IOException {
//1.有一个源文件
File f1 = new File("d:\\Test.txt");
//2.有一个目标文件:
File f2 = new File("d:\\Demo.txt");
//3.新建一个读取的管连接到源文件上:
FileReader fr = new FileReader(f1);
//4.新建一个输出的管连接到目标文件上:
FileWriter fw = new FileWriter(f2);
//方式3:利用缓冲字符数组,将数组转为String写出。
char[] ch = new char[50];
int len = fr.read(ch);
while(len!=-1){
String s = new String(ch,0,len);
fw.write(s);
len = fr.read(ch);
}
//6.关闭流:(关闭流的时候,先开的后关!!!)
fw.close();
fr.close();
}
五、使用IO流建议
文本文件:.txt、 .java、 .c、 .cpp --------------------------------------建议使用字符流操作
非文本文件:.jpg、 .mp3、 .mp4、 .doc 、 .ppt---------------------建议使用字节流操作
总结
以上就是IO流的字符流的使用,以及文本文件复制的全过程,本文重点有File类,大家如果不了解可以自行查阅资料,读取和写入的几种方法,其中使用缓冲数组提升效率,还有就是利用字符流完成文本文件的复制,主要思路是一边读取一边写入,初学者慢慢体会,欢迎各位大神指正。