Java基础知识IO流(File)

File概述

File类用来将文件或者文件夹封装成对象。方便对文件和文件夹的属性信息进行操作。
构造方法:
1.File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
2.File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
3.File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
4.File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

    File f1=new File("a.txt");
    File f2=new File("F:\\Study\\javatest\\myday20","b.txt");

    File d=new File("F:\\Study\\javatest\\myday20");
    File f3=new File(d,"c.txt");
    File f4=new      File("F:"+File.separator+"Study"+File.separator+"javatest"+File.separator+"myday20"+File.separator+"d.txt");

File类的separator属性: 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
File类常见方法:创建、删除、判断、

File对象功能-创建、删除、判断

创建:
1.boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false,若不存在则创建,返回true.创建文件的操作为调用系统底层资源,所以会抛出IOException异常。
和输出流不一样,输出流对象一建立就会创建文件,而且文件若已经存在,会覆盖。
2.mkdir():创建指定的目录,即创建单极目录。
3.mkdirs():创建此指定的目录,包括所有必须但不存在的父目录。即创建多级文件夹。
删除:
delete():成功删除返回真,删除失败返回假。
deleteOnExit():在程序退出时自动删除指定文件,即告诉虚拟机退出时删除此文件。
判断:
canExecute():判断文件是否可执行。
canRead():判断文件是否可以读取。
canWrite():判断文件是否可以修改。
compareTo(File pathname):按字母顺序比较两个文件名
exists():判断文件或目录是否存在。
isDirectory(),isFile():判断是目录还是文件。判断之前必须先判断该文件对象封装的内容是否存在,即exits()
isHidden():是否是隐藏文件
isAbsolute():判断是否是绝对路径,即使文件还未创建也可以判断

获取
getName():获取文件名称。
getParent():返回封装时文件名之前的路径。如果封装时只有文件名,那么返回空。
getPath():将此抽象路径名转换为一个路径名字符串。封装什么路径,返回什么路径。
getAbsolutePath():返回此抽象路径名的绝对路径名字符串。
getAbsoluteFile():返回此抽象路径名的绝对路径名形式。
lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。
length():返回由此抽象路径名表示的文件的长度。
reNameTo():当且仅当重命名成功时,返回 true;否则返回 false 。如果路径不同,相当于剪切。

listFiles():返回当前机器有效的盘符,C:,D:等
list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。不然返回null。
list(FilenameFilter filter):FilenameFilter是一个接口,实现此接口的类实例用于过滤文件名。list()方法依据filter的accept()方法的返回值true或者false来判断是否是需要的文件。 通过创建匿名内部类,并重写accept()方法来设置过滤条件。

import java.io.*;

class  TestFile
{
    public static void main(String[] args) 
    {
        method_1();
    }

    public static void method_1()
    {
        File file=new File("F:\\Study\\javatest\\myday19");
        String[] files=file.list(new FilenameFilter()
            {

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

        });

        for(String f:files)
        {
            System.out.println(f);
        }

    }
}

这里写图片描述

如何列出指定目录下文件或者文件夹,包含子目录中的内容,也就是列出指定目录下所有内容
采用递归的方式:函数自己调用自己。
递归要注意:1、限定递归结束条件,2、注意递归的次数,尽量避免内存溢出。

import java.io.*;

class  TestFile
{
    public static void main(String[] args) 
    {
        File file=new File("F:\\Study\\javatest");
        method_1(file);
    }

    public static void method_1(File file)
    {       
        File[] files=file.listFiles();
        for(int x=0;x<files.length;x++)
        {

            if(files[x].isDirectory())
            {
                System.out.println("文件夹----"+files[x]);
                method_1(files[x]);
            }   
            else
                System.out.println("文件"+files[x]);
        }

    }
}

这里写图片描述

在使用递归时,注意递归的次数,尽量避免内存溢出
这里写图片描述
不断调用本身,递归次数过多,会造成内存溢出。

如何列出指定目录下文件或者文件夹,包含子目录中的内容,也就是列出指定目录下所有内容,同时要求带层次

import java.io.*;

class  TestFile
{
    public static void main(String[] args) 
    {
        File file=new File("F:\\Study\\javatest");
        method_1(file,0);
    }

    public static String getLevel(int level)
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<level;i++)
        {
            sb.append("|--");

        }
        return sb.toString();
    }
    public static void method_1(File file,int level)
    {       
        System.out.println(getLevel(level)+file.getName());
        level++;
        File[] files=file.listFiles();
        for(int x=0;x<files.length;x++)
        {

            if(files[x].isDirectory())
            {           
                method_1(files[x],level);
            }   
            else
                System.out.println(getLevel(level)+files[x]);
        }

    }
}

这里写图片描述

删除一个带内容的目录
Windows系统中删除目录的原理是从里面往外删除。

public static void deleteFiles(File file)
    {       

        File[] files=file.listFiles();
        for(int x=0;x<files.length;x++)
        {

            if(files[x].isDirectory())
            {           
                deleteFiles(files[x]);
            }   
            else
                System.out.println(files[x]+"file"+files[x].delete());
        }
        System.out.println(file+"Director"+file.delete());

    }

练习:
要求:将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。
思路:
1,对指定的目录进行递归。
2,获取递归过程所以的java文件的路径。
3,将这些路径存储到集合中。
4,将集合中的数据写入到一个文件中。

import java.io.*;
import java.util.*;
class  JavaFileList
{
    public static void main(String[] args) throws IOException
    {

        File dir = new File("d:\\java1223");

        List<File> list = new ArrayList<File>();

        fileToList(dir,list);

        //System.out.println(list.size());


        File file = new File(dir,"javalist.txt");
        writeToFile(list,file.toString());




    }
    public static void fileToList(File dir,List<File> list)
    {
        File[] files = dir.listFiles();

        for(File file : files)
        {
            if(file.isDirectory())
                fileToList(file,list);
            else
            {
                if(file.getName().endsWith(".java"))
                    list.add(file);
            }
        }
    }

    public static void writeToFile(List<File> list,String javaListFile)throws IOException
    {
        BufferedWriter bufw =  null;
        try
        {
            bufw = new BufferedWriter(new FileWriter(javaListFile));

            for(File f : list)
            {
                String path = f.getAbsolutePath();
                bufw.write(path);
                bufw.newLine();
                bufw.flush();
            }

        }
        catch (IOException e)
        {
            throw e;
        }
        finally
        {
            try
            {
                if(bufw!=null)
                    bufw.close();
            }
            catch (IOException e)
            {
                throw e;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值