一、首先了解一下File类
1.File类:文件类,不属于Java流系统,是对文件进行操作(新建、删除、重命名)的辅助类,是java.io包下与平台无关的文件和目录。
注:File类本身不能访问文件本身
文件:是程序中数据的初始源和目的地(主文件名+文件的扩展名)
2.构造方法
平常我们最常用的构造方法为:
File(String pathname);
①我们通常以字符串的形式传入一个文件的路径名(绝对/相对 路径)。
3.常用方法
在构造方法传参时,因为java中的反斜杠 ’\’是转义字符,所以当我们传入路径时,使用‘\’或者换为‘/’
思考:File类只能对文件进行一些简单的操作,如果我们需要读取文件内容或者改写文件内容呢?
二、I/O流是如何操作数据(体现形式为文件)的?
1.数据流:
2.数据流的分类:
①按照数据流方向的不同:输入流(写入操作)
(站在内存的角度) 输出流(读出操作)
②按处理数据单位的不同:字节流
字符流
③按功能不同:节点流(对数据流的原始操作)
处理流(对节点流进行的操作)
三、I/O流的框架图
1.字节流和字符流的区别:
1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
从图中我们可以看出:输入管道InputStream和Reader
输出管道OutputStream和Reader
在帮助文档中我们可以看到:
InputStream、Reader、 OutputStream和Reader都为抽象类,它们下边的子类才是可以具体实现的类:
四、字节流 InputStream和 OutputStream
(1) FileInputStream
1.构造函数
例:获取输入流:
File file=new File("test1.txt");
FileInputStream f=new FileInputStream(file);//获取输入流
2.主要方法
假如文件内容为:一只小老虎fdfsgvdfs
s=new byte[9]; //为了不浪费内存,我们可以开辟大小为 f.available()
s1=new byte[f.available()];
f.read(s);
f.read(s1);
f.close(); //读取完毕需关闭字节流
System.out.println(new String(s));
System.out.println(new String(s1));
输出结果为:一个汉字占三个字节。而在一次读取中,前边s已经读取的字节,s1读取时从后边开始读取。
所以当我们读取文件内容又不至于开辟过大空间时采取第二种。
(2) FileOutputStream
1.构造函数:
例:获取输出流
File file=new File("test1.txt");
String s="获取输出流";
FileOutputStream f=new FileOutputStream(file);
2.主要方法:
我们调用write(byte[] b)将字符串转为byte[]
f.write(s.getBytes());
f.close();
运行结果:会覆盖之前的内容