IO流
IO:数据的写入写出,(数据持久化)针对操作数据的特点不同,采用不同的流。
File类的使用
File类的一个对象,代表一个文件或者一个文件目录。
//path 可以是绝对路径也可以是相对路径
File file= new File(path);
关于相对路径,不同的IDE的相对路径不同。
Eclipse和IDEA的相对路径不同。
-
IDEA的相对路径:
如果使用Junit中的单元测试方法进行测试,相对路径即为Module下;
如果使用main()测试,相对路径就是当前的project中。 -
路径分隔符
在不同的OS中,分隔符是不同的。 -
FIle类常用的方法
IO流原理及流的分类
IO是非常使用的技术,用于处理设备和设备之间的数据传输。如读写文件,网络通讯等。
对于数据的操作以流(stream)的方式进行。
-
文件到程序:输入
-
程序到文件:输出
-
网络到内存:输入
-
内存到网络:输出
-
内存到数据库:输出
程序员站位是程序也就是内存,只有站位准了才能选择正确的类。
流的分类:
按照数据单位不同划分
- 字节流8bit byte
- 字符流16bit char
字符流更加适合处理文本。字节流适合处理图片、视频、音频等。
按照角色不同分为:
- 节点流(直接作用在文件file类上)
- 处理流(作用在已有流的基础上)
按照流的流向不同划分
- 输入流
- 输出流
流的抽象类
- 字符的读入
//1.实例化File类对象,指明要操作的文件
File file = new File("hello.txt");
//2.提供具体的流
FileReader fr = new FileReader(file);
//3.数据的读入
//read();返回读入的一个字符,如果达到文件末尾就返回-1
//无参数的read()方法,每次读入一个字符。
int data = fr.read();//将字符转化为int值
while(data != -1){
System.out.print((char)data);
data = fr.read();
}
//流的关闭
fr.close();
为了保证流的资源一定能关闭,要使用try catch finally进行异常处理, 在finally中关闭流。
总结:数据的读入操作,要保证被读入的文件一定要存在,否则就会报FileNotFoundException。
对read()的操作升级,使用read的重载方法
File file = new File("hello.txt");
//1.File类的实例化
//2. XXX流的实例化
FileReader fr = new FileReader(file);
//3. 读入的操作
//每次读入的字符的个数。
char[] cbuf = new char[5];
int len;
while((len = fr.read(cbuf)) != -1){
//错误写法:
//for(int i = 0; i<cbuf.length;i++){
// System.out.print(cbuf[i]);
//}
//正确写法
for(int i = 0;i<len;i++){
System.out.print(cbuf[i]);
}
//另一种写法
String str = new String(cbuf,0,len);
System.out.print(str);
}
//4. 流的关闭
从内存中写出数据到硬盘的文件中
//1.实例化File类对象,指明要写出到的文件
File file = new File("hello.txt");
//2.提供fileWriter对象,用于文件的写出
FileWriter fw = new FileWriter(file);
//3.写出操作
fw.witer("i have a dream");
//4.流资源的关闭
fw.close();
总结:如果文件不存在,在输入的过程中,会自动创建该文件。
如果存在:如果流使用的构造器是FileWriter(file,false);就不会被覆盖,如果使用的是FileWriter(file)就会对原有文件进行覆盖。
先读进来再写出去
@Test
public void method() throws IOException {
//指明读入文件的位置
File fileRead = new File("hello.txt");
//指明写出文件的位置
File fileWriter = new File("hello1.txt");
//创建输入流和输出流对象
FileReader fr = new FileReader(fileRead);
FileWriter fw = new FileWriter(fileWriter);
//创建字符数组
int len;
char[] chars = new char[5];
while ((len = fr.read(chars))!= -1){
//每次写入len个长度的字符
fw.write(chars,0,len);
}
//关闭流
fr.close();
fw.close();
}
实际应用中使用try catch finally 保证流得到关闭。