学习笔记-java基础-File类和IO流

File类

  1. File类及后续的各种流都声明在java.io 包下
  2. File类的对象代表一个文件(.java,.mp3,.doc ,.txt,.avi )或文件目录
  3. File通常都是作为IO流的端点出现的。从代码上看,将File类的对象作为参数传递到IO流的构造器中。
  4. 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)构造器时,在执行的过程中,在原有文件的末尾添加新的数据
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值