File类
- File类及后续的各种流都声明在java.io 包下
- File类的对象代表一个文件(.java,.mp3,.doc ,.txt,.avi )或文件目录
- File通常都是作为IO流的端点出现的。从代码上看,将File类的对象作为参数传递到IO流的构造器中。
- File类中涉及到文件或文件目录的新建、路径名、大小、删除等操作。具体读取文件内容的行为,File是无能为力的,必须使用流来操作。
File类的实例化:
1.public File(String pathname)
2.public File(String parent,String child)
以parent为父路径,child为子路径创建File对象。
3.public File(File parent,String child)
根据一个父File对象和子文件路径创建File对象
文件(或文件目录)的路径:
绝对路径:包含盘符在内的文件或文件目录的完整路径。比如:C:\Program Files (x86)\Bonjour\abc.txt
相对路径:通常都是相较于当前工程或当前module
File类的获取功能
public String getAbsolutePath():获取绝对路径
public File getAbsoluteFile():获取绝对路径表示的文件
public String getPath() :获取路径
public String getName() :获取名称
public String getParent():获取上层文件目录路径。若无,返回null
public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified() :获取最后一次的修改时间,毫秒值
//练习:创建一个与hello.txt文件在相同文件目录下的另一个名为abc.txt文件
@Test
public void test3(){
File file1 = new File("hello.txt");
//File(String parent,String child)
File dest = new File(file1.getAbsoluteFile().getParent(),"abc.txt");
}
public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
public boolean isDirectory():判断是否是文件目录
public boolean isFile() :判断是否是文件
public boolean exists() :判断是否存在
public boolean canRead() :判断是否可读
public boolean canWrite() :判断是否可写
public boolean isHidden() :判断是否隐藏
思考:如何遍历一个文件目录下的所有的文件
@Test
public void test6(){
File file = new File("D:\\code210301");
printFileName(file);
}
public void printFileName(File file){
if(file.isFile()){
System.out.println(file.getAbsolutePath());
}else{
File[] files = file.listFiles();
for(File f : files){
printFileName(f);
}
}
}
public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
public boolean delete():删除文件或者文件夹
IO流
流的分类:
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流
4个流的抽象基类
具体的子类 (深色的为重点)
public class FileReaderWriterTest {
/*
使用单元测试方法的话,相对路径指的是当前module
使用main的话,相对路径指的是当前工程
*/
@Test
public void test1() throws IOException {
//1. 创建流(包含了创建文件)
FileReader fr = new FileReader(new File(“hello.txt”));
//2. 具体的读取操作
//read():读取下一个字符,并返回。如果到达文件末尾,返回-1.
int data = fr.read();
while(data != -1){ //判断是否达到文件末尾
System.out.print((char)data);
data = fr.read();
}
//3. 关闭资源。一旦缺少关闭操作,就会出现内存泄漏
fr.close();
}
//升级操作:本章中凡是出现流资源的关闭操作,都需要使用try-catch-finally来处理。不能使用throws.
@Test
public void test2(){
FileReader fr = null;
try{
//1. 创建流(包含了创建文件)
fr = new FileReader(new File("hello.txt"));
//2. 具体的读取操作
int data = fr.read();
while(data != -1){ //判断是否达到文件末尾
System.out.print((char)data);
data = fr.read();
}
}catch(IOException e){
e.printStackTrace();
}finally{
//3. 关闭资源。一旦缺少关闭操作,就会出现内存泄漏
try {
if(fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//继续升级操作:每次读取数据使用一个数组。效率更高!
@Test
public void test3(){
FileReader fr = null;
try{
//1. 创建流(包含了创建文件)
fr = new FileReader(new File("hello.txt"));
//2. 具体的读取操作
char[] cbuffer = new char[5];
int len;//记录每次读入到cbuffer数组中的字符的个数
//read(char[] cbuf): 将数据读入到cbuf数组中,并返回读入到此数组中的个数。
while((len = fr.read(cbuffer)) != -1){ //判断是否达到文件末尾
//遍历cbuffer数组
//错误的
// for(int i = 0;i < cbuffer.length;i++){
// System.out.print(cbuffer[i]);
// }
//正确的:
// for(int i = 0;i < len;i++){
// System.out.print(cbuffer[i]);
// }
//正确的:
String str = new String(cbuffer,0,len);
System.out.print(str);
// Thread.sleep(3000);
}
}catch(IOException e){
e.printStackTrace();
}finally{
//3. 关闭资源。一旦缺少关闭操作,就会出现内存泄漏
try {
if(fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void test4() {
FileWriter fw = null;
try {
//1. 创建流(包含输出的文件的创建)
// fw = new FileWriter(new File(“abc.txt”));
fw = new FileWriter(new File(“abc.txt”),true);
//2. 写出数据
fw.write("I love you!\n");
fw.write("you love him!".toCharArray());
fw.write("\n我很痛苦!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//3. 关闭资源
try {
if(fw != null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 小结:
*
* 1. FileReader \FileWriter因为涉及资源的关闭操作,所以有异常的话,必须使用try-catch-finally处理
* 2. 输入流在读取文件中的数据时,要求此文件必须存在。否则会报FileNotFoundException
* 3. 输出流在写出数据到指定文件时,写出的文件可以不存在。
* 3.1 如果写出的文件确实不存在,在执行的过程中,会自动的创建此文件。
* 3.2 如果写出的文件存在,使用FileWriter(File) 或 FileWriter(File,false)构造器时,在执行的过程中,会覆盖原有文件
* 使用FileWriter(File,true)构造器时,在执行的过程中,在原有文件的末尾添加新的数据