File类的理解
1.File类的一个对象,代表一个文件或者一个文件目录.(文件夹)
2. File类声明在java.io包下
3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,
并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用i0流来完成。
4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".
如何创建File对象 实例化File
1. File(string filePath)
2.File(String parentPath,String chiLdPath)
3. File(File parentFiLe, string childPath)
路径的分类
相对路径:相较于某个路径下,指明的路径。
绝对路径:包含盘符在内的文件或文件目录的路径
路径分隔符\\或/
说明: 在idea中
如果大家使用main()测试,相对路径即为当前的Project下。
如果大家开发使用JUnit中的单元测试方法测试(@Text),相对路径即为当前Module下.
File的常用方法
createNewFile() 创建一个新文件。
mkdir() 创建一个新目录。
delete() 删除文件或空目录。
exists() 判断File对象所对象所代表的对象是否存在。
getAbsolutePath() 获取文件的绝对路径。
getName()取得名字。
getParent()获取文件/目录所在的目录。
isDirectory() 是否是目录。
isFile() 是否是文件。
length()获得文件的长度。
listFiles()列出目录中的所有内容。
renameTo()修改文件名为。
File与io之间的关系
File类和四大家族没有关系,所以File类不能完成文件的读和写。
File对象代表什么?
:文件 和 目录路径名 的抽象表示形式。
例:
C:\Drivers 这是一个File对象
C:\Drivers\Lan\Realtek\Readme.txt 也是File对象。
一个File对象有可能对应的是目录,也可能是文件。
File只是一个 路径名 的抽象表示形式。
IO流
I/O是input/output的缩写,用于处理设备之间的数据传输 如读/写文件
java程序中,对于数据的输入和输出操作以"流"的方式进行.
java.io包下提供了各种"流"类和接口.用于获取不同种类的数据,
并通过标准的方法输入或输出数据.
流的分类
1.根据数据传输的方向进行划分:以程序为参照物
输入流inputStream 文件 -> 程序 读取
输出流OutputStream 程序 -> 文件 写出
2.根据读写单位
字节流 Reader -- byte 这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件 等
字符流 Writer -- char 这种流是为了方便读取 普通文本文件 而存在的,这种流不能读取:图片、声音、视频等文件。只能读取 纯文本文件,连word文件都无法读取。
注:纯文本文件不单单是指txt文件 还有.java ini py.只要是能用记事本打开的文件都是普通文本文件
在java中只要“类名”以 Stream 结尾的都是字节流。
以“ Reader/Writer ”结尾的都是字符流。
3.根据功能划分
基础流(节点流)
包装流
流的使用
1.实例化File类的对象,指明要操作的文件
2.提供具体的流
3.数据读入
4.流的关闭
注:使用自带缓冲区的流必须关流,如果不关流则需要刷新或者缓冲区满了 否则数据存在缓冲区不会输出到文件中
字符流
以字符为单位读取数据
针对文本文件
Reader -- FileReader:字符输入流
Writer -- FileWriter:字符输出流
方法:
readLine():读取一行字符,BufferedReader独有的方法
newLine():写入换行,BufferedWriter独有的方法
例:
** //使用字符输入流读取数据**
@Test
public void method02() throws IOException {
FileReader fr = new FileReader("io1.txt");
//读取单个字符
int read = fr.read();
System.out.println((char)read);
fr.close();
}
//使用缓冲区读取多个字符
@Test
public void method03() throws IOException {
FileReader fr = new FileReader("io1.txt");
int len;
char[] c = new char[1024];
while((len = fr.read(c)) != -1){
System.out.println(new String(c,0,len));
}
fr.close();
}
** //使用字符输出流**
@Test
public void method01() throws IOException {
//实例对象创建的时候会清空文件中的内容
//new FileWriter("io2.txt");
FileWriter fw = new FileWriter("io2.txt");
fw.write("贪财好色");
fw.close();
}
//使用字符输出流 -- 末尾追加
@Test
public void method02() throws IOException {
FileWriter fw = new FileWriter("io2.txt",true);
fw.write(",做个俗人吧");
fw.close();
}
//拷贝 -- 文本文档
@Test
public void method03() throws IOException {
FileReader fr = new FileReader("io2.txt");
FileWriter fw = new FileWriter("io3.txt");
int len;
char[] c = new char[1024];
while((len = fr.read(c)) != -1){
fw.write(c,0,len);
}
fr.close();
fw.close();
}
//拷贝 -- 图片 -- 不能读写二进制文件
@Test
public void method04() throws IOException {
FileReader fr = new FileReader("lxj.jpg");
FileWriter fw = new FileWriter("lxj2.jpg");
int len;
char[] c = new char[1024];
while((len = fr.read(c)) != -1){
fw.write(c,0,len);
}
fr.close();
fw.close();
}
对象流
ObjectInputStream :对象输入流
ObjectOutputStream:对象输出流
对象流的使用
使用对象流进行对象的读写操作,需要对象类实现 Serializable 接口
使用对象流进行对象的读写操作,本质上是在进行序列化和反序列化
把对象写入文件中就是序列化
把文件中的对象读取出来就是反序列化
序列化和反序列化需要使用同一个序列号
读写的对象类添加了其他属性会改变序列号
要么添加不会被序列化属性或者固定序列号
transient 修饰的私有属性和私有的静态属性不会被序列化
转换流
本质上是字符流,字节通向字符桥梁,能够读写指定的编码格式数据
InputStreamReader:把文件中的字节转换成程序中的字符
OutputStreamWrit//转换输入流
@Test
public void method01() throws IOException {
//FileInputStream fis = new FileInputStream("io1.txt");
//通过转换流把字节流转换成字符流
//InputStreamReader isr = new InputStreamReader(fis);
//BufferedReader br = new BufferedReader(isr);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("io1.txt")));
String str;
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
}
//转换输出流
@Test
public void method02() throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("io9.txt"));
osw.write("有道无术");
osw.close();
}
//使用带缓冲区的字符流读取不同编码格式的数据 -- 乱码
@Test
public void method03() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("io10.txt"));
String str = br.readLine();
System.out.println(str);
br.close();
}
//使用转换流读取指定编码格式的数据
@Test
public void method04() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("io10.txt"),"GBK"));
String str = br.readLine();
System.out.println(str);
}
//使用转换流写出 GBK 格式的数据
@Test
public void method05() throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io11.txt"), "GBK"));
bw.write("术尚可求");
bw.close();
}