Java之IO流

本文详细介绍了Java中的IO流,包括File类的使用,IO流的概述,节点流(文件流),缓冲流,转换流,标准输入、输出流,打印流,数据流,对象流,任意存取文件流,流的基本应用总结以及NIO的基础概念。内容涵盖了File类的各种方法,如创建、删除、重命名,以及流的分类和操作,如字节流、字符流、缓冲区的使用,转换流在字节流和字符流之间的转换,以及对象的序列化和反序列化等。
摘要由CSDN通过智能技术生成

一、File类的使用

1. File类的理解
1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。
2.File类声明在java.io包下:文件和文件路径的抽象表示形式,与平台无关。
3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
4.想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
5.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点"。

2. File的实例化
2.1 常用构造器

1.File(String filePath)
2.File(String parentPath,String childPath)
3.File(File parentFile,String childPath)

代码示例:

@Test
public void test1() {
   
    //构造器1
    File file1 = new File("hello.txt");
    File file2 = new File("E:\\workspace_idea\\JavaSenic\\IO\\hello.txt");
    System.out.println(file1);
    System.out.println(file2);

    //构造器2
    File file3 = new File("E:\\workspace_idea\\JavaSenior", "hello.txt");
    System.out.println(file3);

    //构造器3
    File file4 = new File(file3, "hi.txt");
    System.out.println(file4);
}

2.2 路径分类
1.相对路径:相较于某个路径下,指明的路径。
2.绝对路径:包含盘符在内的文件或文件目录的路径。
说明:

1.IDEA中:
如果使用JUnit中的单元测试方法测试,相对路径即为当前Module下。
如果使用main()测试,相对路径即为当前的Project下。
2.Eclipse中:
不管使用单元测试方法还是使用main()测试,相对路径都是当前的Project下。

2.3 路径分隔符
1.windows和DOS系统默认使用“\”来表示

2.UNIX和URL使用“/”来表示

3.Java程序支持跨平台运行,因此路径分隔符要慎用。

4.为了解决这个隐患,File类提供了一个常量: public static final String separator。根据操作系统,动态的提供分隔符。

举例:

//windows和DOS系统
File file1 = new File("E:\\io\\test.txt");
//UNIX和URL
File file = new File("E:/io/test.txt");
//java提供的常量
File file = new File("E:"+File.separator+"io"+File.separator+"test.txt");

3. File类的常用方法

3.1 File类的获取功能
1.public String getAbsolutePath():获取绝对路径

2.public String getPath() :获取路径

3.public String getName() :获取名称

4.public String getParent():获取上层文件目录路径。若无,返回null

5.public long length() :获取文件长度(即:字节数)。不能获取目录的长度。

6.public long lastModified() :获取最后一次的修改时间,毫秒值

7.如下的两个方法适用于文件目录:

8.public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组

9.public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组

代码示例:

@Test
public void test2(){
   
    File file1 = new File("hello.txt");
    File file2 = new File("d:\\io\\hi.txt");

    System.out.println(file1.getAbsolutePath());
    System.out.println(file1.getPath());
    System.out.println(file1.getName());
    System.out.println(file1.getParent());
    System.out.println(file1.length());
    System.out.println(new Date(file1.lastModified()));

    System.out.println();

    System.out.println(file2.getAbsolutePath());
    System.out.println(file2.getPath());
    System.out.println(file2.getName());
    System.out.println(file2.getParent());
    System.out.println(file2.length());
    System.out.println(file2.lastModified());
}
@Test
public void test3(){
   
    File file = new File("D:\\workspace_idea1\\JavaSenior");

    String[] list = file.list();
    for(String s : list){
   
        System.out.println(s);
    }

    System.out.println();

    File[] files = file.listFiles();
    for(File f : files){
   
        System.out.println(f);
    }

}

3.2 File类的重命名功能
1.public boolean renameTo(File dest):把文件重命名为指定的文件路径
2.注意:file1.renameTo(file2)为例:要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在。
代码示例:

@Test
public void test4(){
   
    File file1 = new File("hello.txt");
    File file2 = new File("D:\\io\\hi.txt");

    boolean renameTo = file2.renameTo(file1);
    System.out.println(renameTo);

}

3.3 File类的判断功能
1.public boolean isDirectory():判断是否是文件目录
2.public boolean isFile() :判断是否是文件
3.public boolean exists() :判断是否存在
4.public boolean canRead() :判断是否可读
5.public boolean canWrite() :判断是否可写
6.public boolean isHidden() :判断是否隐藏
代码示例:

@Test
public void test5(){
   
    File file1 = new File("hello.txt");
    file1 = new File("hello1.txt");

    System.out.println(file1.isDirectory());
    System.out.println(file1.isFile());
    System.out.println(file1.exists());
    System.out.println(file1.canRead());
    System.out.println(file1.canWrite());
    System.out.println(file1.isHidden());

    System.out.println();

    File file2 = new File("d:\\io");
    file2 = new File("d:\\io1");
    System.out.println(file2.isDirectory());
    System.out.println(file2.isFile());
    System.out.println(file2.exists());
    System.out.println(file2.canRead());
    System.out.println(file2.canWrite());
    System.out.println(file2.isHidden());

}

3.4 Flie类的创建功能
1.创建硬盘中对应的文件或文件目录
2.public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
3.public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
4.public boolean mkdirs() :创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,一并创建
代码示例:

@Test
public void test6() throws IOException {
   
    File file1 = new File("hi.txt");
    if(!file1.exists()){
   
        //文件的创建
        file1.createNewFile();
        System.out.println("创建成功");
    }else{
   //文件存在
        file1.delete();
        System.out.println("删除成功");
    }


}
@Test
public void test7(){
   
    //文件目录的创建
    File file1 = new File("d:\\io\\io1\\io3");

    boolean mkdir = file1.mkdir();
    if(mkdir){
   
        System.out.println("创建成功1");
    }

    File file2 = new File("d:\\io\\io1\\io4");

    boolean mkdir1 = file2.mkdirs();
    if(mkdir1){
   
        System.out.println("创建成功2");
    }
    //要想删除成功,io4文件目录下不能有子目录或文件
    File file3 = new File("D:\\io\\io1\\io4");
    file3 = new File("D:\\io\\io1");
    System.out.println(file3.delete());
}

3.5 File类的删除功能
1.删除磁盘中的文件或文件目录
2.public boolean delete():删除文件或者文件夹
3.删除注意事项:Java中的删除不走回收站。

4. 内存解析
在这里插入图片描述
5. 小练习
利用Fie构造器,new一个文件目录file 1)在其中创建多个文件和目录 2)编写方法,实现删除fle中指定文件的操作

@Test
public void test1() throws IOException {
   
    File file = new File("E:\\io\\io1\\hello.txt");
    //创建一个与file同目录下的另外一个文件,文件名为:haha.txt
    File destFile = new File(file.getParent(),"haha.txt");
    boolean newFile = destFile.createNewFile();
    if(newFile){
   
        System.out.println("创建成功!");
    }
}

判断指定目录下是否有后缀名为jpg的文件,如果有,就输出该文件名称

public class FindJPGFileTest {
   

    @Test
    public void test1(){
   
        File srcFile = new File("d:\\code");

        String[] fileNames = srcFile.list();
        for(String fileName : fileNames){
   
            if(fileName.endsWith(".jpg")){
   
                System.out.println(fileName);
            }
        }
    }
    @Test
    public void test2(){
   
        File srcFile = new File("d:\\code");

        File[] listFiles = srcFile.listFiles();
        for(File file : listFiles){
   
            if(file.getName().endsWith(".jpg")){
   
                System.out.println(file.getAbsolutePath());
            }
        }
    }
    /*
	 * File类提供了两个文件过滤器方法
	 * public String[] list(FilenameFilter filter)
	 * public File[] listFiles(FileFilter filter)

	 */
    @Test
    public void test3(){
   
        File srcFile = new File("d:\\code");

        File[] subFiles = srcFile.listFiles(new FilenameFilter() {
   

            @Override
            public boolean accept(File dir, String name) {
   
                return name.endsWith(".jpg");
            }
        });

        for(File file : subFiles){
   
            System.out.println(file.getAbsolutePath());
        }
    }

}

遍历指定目录所有文件名称,包括子文件目录中的文件。 拓展1:并计算指定目录占用空间的大小 拓展2:删除指定文件目录及其下的所有文件

public class ListFileTest {
   

    public static void main(String[] args) {
   
        // 递归:文件目录
        /** 打印出指定目录所有文件名称,包括子文件目录中的文件 */

        //1.创建目录对象
        File file = new File("E:\\test");

        //2.打印子目录
        printSubFile(file);

    }

    /**
     * 递归方法遍历所有目录下的文件
     *
     * @param dir
     */
    public static void printSubFile(File dir) {
   
        //打印子目录
        File[] files = dir.listFiles();
        for (File f : files) {
   
            if (f.isDirectory()) {
   //如果为文件目录,则递归调用自身
                printSubFile(f);
            } else {
   
                System.out.println(f.getAbsolutePath());//输出绝对路径
            }
        }
    }

    // 拓展1:求指定目录所在空间的大小
    // 求任意一个目录的总大小
    public long getDirectorySize(File file) {
   
        // file是文件,那么直接返回file.length()
        // file是目录,把它的下一级的所有大小加起来就是它的总大小
        long size = 0;
        if (file.isFile()) {
   
            size += file.length();
        } else {
   
            File[] allFiles = file.listFiles();// 获取file的下一级
            // 累加all[i]的大小
            for (File f : allFiles) {
   
                size += getDirectorySize(f);//f的大小
            }
        }
        return size;
    }

    /**
     * 拓展2:删除指定的目录
     */
    public void deleteDirectory(File file) {
   
   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值