File类和IO流

1.File类:

        file类的对象可以用来表示文件或者文件夹。

        File类的构造方法:

/**
 * 使用File类的构造方法创建对象。( 仅仅只是封装路径,并没有创建文件,该路径可以存在也可以不存在。)
 *
 * 关于路径分隔符的写法:
 *      java语言规定:\\表示\
 *      因为\有转义字符的含义,比如\t制表符 \r回车 \n换行
 *      在linux和Mac系统中路径分隔符/
 */
public class File1 {
    public static void main(String[] args) {
        //构造方法1:File(pathname):根据文件路径创建文件对象。
        File file1=new File("C:/itheima\\a.txt");
        System.out.println("创建方法1:"+file1);
        System.out.println();

        //构造方法2:File(parent,child):从父路径名字字符串和子路径名字字符串创建文件对象。
        File file2=new File("C:\\itheima", "a.txt");
        System.out.println("创建方法2:"+file2);
        System.out.println();

        //构造方法3:File(File parent,child):根据父路径对应文件对象和子路径名字字符串创建文件对象。
        File file3=new File(new File("C:\\itheima"), "a.txt");
        System.out.println("创建方法3:"+file3);
        System.out.println();
    }
}

        路径的分类:

                绝对路径:从盘符开始的路径。

                相对路径:从项目的根目录开始的路径。

                 这个就是idea的根目录。

        File类的常用API

1.判断文件的类型,获取文件信息。

/**
 * File类的获取和判断方法。
 */
public class File2 {
    public static void main(String[] args) {
        File file1=new File("steam\\a.txt");

        //1.isDirectory():判断该路径名表示的File是否为文件夹。
        System.out.println("该路径是表示文件夹吗:"+file1.isDirectory());

        //2.isFile():判断此路径名表示的File是否为文件。
        System.out.println("该路径是表示文件吗:"+file1.isFile());

        //3.exists():判断此路径名表示的File是否存在。
        System.out.println("该路径存在吗:"+file1.exists());

        //4.getAbsolutePath():返回该路径名的绝对路径字符串。
        System.out.println("该绝对路径是:"+file1.getAbsolutePath());
        System.out.println("该绝对路径是:"+file1.getAbsoluteFile());

        //5.getPath():返回路径名字符串。
        System.out.println("该对象封装的路径"+file1.getPath());

        //6.getName():返回该路径名表示的文件或文件夹的名字。
        System.out.println("获取文件名:"+file1.getName());

        //7.lastModified():返回文件最后修改的毫秒值。
        long time=file1.lastModified();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        String str=sdf.format(new Date(time));
        System.out.println("最后一次修改的时间:"+str);
    }
}

2.创建文件,删除文件功能。

/**
 * 创建和删除文件
 */
public class File3 {
    public static void main(String[] args) throws IOException {
        File file1=new File("steam\\a.txt");

        //1.createNewFile():创建一个新的空的文件。
        System.out.println("创建成功了吗?"+file1.createNewFile());
        File file2=new File("steam\\b.txt");
        System.out.println("创建成功了吗?"+file2.createNewFile());

        //2.mkdirs():可以创建多级文件夹。
        File file3=new File("steam\\com\\itheima\\aaa");
        System.out.println("创建多级文件夹:"+file3.mkdirs());

        //3.mkdir():只能创建一级文件夹。
        File file4=new File("steam\\com\\itheima\\aaa\\bbb");
        System.out.println("创建单级文件夹:"+file4.mkdir());

        File file5=new File("steam\\com\\itheima\\aaa\\bbb\\a.txt");
        System.out.println("创建文件:"+file5.createNewFile());

        //4.delete():删除由此路径表示的文件或空的文件夹。
        File file6=new File("steam\\com\\itheima\\aaa\\bbb\\a.txt");
        System.out.println("删除文件或空的文件夹:"+file6.delete());
    }

3.遍历文件夹。

public class File4 {
    public static void main(String[] args) {
        File f=new File("D:\\training\\资料\\素材");

        //1.list():获取当前目录下所有的“一级文件名称”到一个字符串数组中返回。
        String[] strings=f.list();
        System.out.println(Arrays.toString(strings));

        //2.listFiles():获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回
        File[] files=f.listFiles();

        Arrays.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return Long.compare(o2.lastModified(),o1.lastModified());
            }
        });

        for (File file : files) {
            long time =file.lastModified();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str=sdf.format(new Date(time));
            System.out.println(file+"最后一次修改的时间:"+str);
        }
    }
}

                 文件搜索:

public class Demo2 {
    public static void main(String[] args) {
        fileSearch(new File("D:\\training\\资料\\素材"),"美女");
    }

    public static void fileSearch(File dir,String filename){
        File[] files=dir.listFiles();
        for (File file : files) {
            if (file.isFile()){
                if (file.getName().contains("美女")){
                    System.out.println(file);
                }
            }else {
                fileSearch(file,filename);
            }
        }
    }
}

                 文件删除:

public class Demo3 {
    public static void main(String[] args) {
        deleteDirectory(new File("D:\\resources"));
    }

    private static void deleteDirectory(File dir){
        File[] files=dir.listFiles();
        if (files!=null){
            if (files.length==0){
                System.out.println("该路径是空文件夹,直接删除。");
                dir.delete();
            }else {
                System.out.println("该路径不是空的文件夹,不可以直接删除。");
                System.out.println("开始遍历文件夹里的内容递归删除。");
                deleteFiles(dir);
            }
        }else {
            System.out.println("没有该文件夹");
        }
    }

    private static void deleteFiles(File dir) {
        File[] files=dir.listFiles();
        for (File file : files) {
            if (file.isFile()){
                System.out.println("删除文件:"+file.getName());
                file.delete();
            }else {
                System.out.println("遍历到了不为空的文件夹,先遍历删除里面的内容"+file.getName());
                deleteFiles(file);
            }
        }

        System.out.println("删除已经空了的文件夹");
        dir.delete();
    }
}

2.IO

IO是用来处理数据的输入,输出的。

 

        字节流的使用

1.文件字节输入流,读取文件中的数据。

                FileInputStream读取文件中的数据:

  •   字节流可以读取任意格式的文件(文本,图片,视频),因为任何文件底层都是字节数据。
  • 注意:它只能保证能读出文件的字节数据,但并不保证能被你看懂。
FileInputStream读取文件中数据的步骤
        第一步:创建FileInputStream流对象
        第二步:调用read()方法读取字节数据
        第三部:调用close()方法关闭流

/**
* 一次读取一个字节    
**/

public class Demo1 {
    public static void main(String[] args) throws IOException {
        //第一步:创建字节输入流对象
        FileInputStream fis=new FileInputStream("steam\\b.txt");
//        FileInputStream fis=new FileInputStream(new File("steam\\b.txt"));

        int b;

        //2. read():每次读取一个字节返回,如果字节已经没有可读的返回-1;
        while ((b=fis.read())!=-1){
            System.out.println((char) b);
        }

        //3.close():关闭流
        fis.close();
    }
}

 

/**
 * 一次读取一个字节数组
 */
public class Demo2 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis=new FileInputStream("steam\\a.txt");


        byte[] bytes=new byte[1024];
        int len;

//        int read(byte[] buffer):每次读取一个字节数组返回,如果字节已经没有可读的返回-1
        while ((len=fis.read(bytes))!=-1){
            String str=new String(bytes,0,len);//len:有效字节数。
            System.out.println(str);
        }
        fis.close();
    }
}
/**
 * 一次读取全部字节
 *      直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
 *      注意:如果文件较大,不建议使用。
 */
public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("steam\\a.txt");

        //第二步:一次读取全部字节
        byte[] bytes=fis.readAllBytes();
        System.out.println(new String(bytes));

        //第三步:关闭流
        fis.close();
    }
}

 

2.文件字节输出流,写字节数据到文件。

public class Demo4 {
    public static void main(String[] args) throws IOException {
        //第一步:创建FileOutputStream流对象。
        //注意1:如果文件不存在,会创建新的文件:如果文件已经存在,会用新的文件将老文件覆盖掉。
        //注意2:要保证父路径是存在的,否则会出现异常。
        FileOutputStream fos=new FileOutputStream("steam\\c.txt");

        //第二步:写字节数据
        //一次写一个字节
        fos.write(97);
        fos.write(98);

//        一次写多个字节
        byte[] bytes={99,100,101};
        fos.write(bytes);

//        一次写字节数组的一部分
        fos.write(bytes,0,2);

        String s = "你好,世界";
        byte[] bytes1 = s.getBytes();
        fos.write(bytes1);


        //第三步:关闭流
        fos.close();
    }
}

3.文件拷贝。

public class Demo5 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("steam\\美女.jpg");
        FileOutputStream fos=new FileOutputStream("steam\\复制.jpg");

        byte[] bytes=new byte[1024];
        int len;
        while((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }

        fis.close();
        fos.close();
    }
}

         字符流:

 

 

                 字符流读取字符:

public class Demo6 {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("steam\\a.txt");

//        int s;
//        while ((s=fr.read())!=-1){
//            System.out.println((char) s);
//        }

        char[] chars=new char[1024];
        int len;
        while((len=fr.read(chars))!=-1){
            String str=new String(chars,0,len);
            System.out.println(str);
        }
        fr.close();
    }
}

                字符流写入字符:

public class Demo7 {
    public static void main(String[] args) throws IOException {
        FileWriter fw=new FileWriter("steam\\e.txt");

        fw.write(97);
        fw.write('a');

        fw.write("hello");
        fw.write("你好世界");

        char[] cha={'a','b','c','d'};
        fw.write(cha);

        fw.write(cha,0,1);

        fw.close();
    }
}

                字符流复制文件:

/**
 * 调用close(),在关闭流之前,会有一个刷新的动作(把内存中的数据,写到硬盘中去。)
 * 字符流无法复制图片。
 */
public class Demo8 {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("steam\\a.txt");
        FileWriter fw=new FileWriter("steam\\g.txt");

        char[] chars=new char[1024];
        int len;
        while ((len=fr.read(chars))!=-1){
            fw.write(chars,0,len);
        }

//        fr.close();
//        fw.close();
    }
}

3.IO流代码的异常处理:

public class Test4 {
    public static void main(String[] args) {
        FileInputStream fis=null;
        FileOutputStream fos=null;

        try {
             fis=new FileInputStream("steam\\src\\com\\itheima\\美女.jpg");
             fos=new FileOutputStream("steam\\src\\com\\itheima\\美女4.jpg");

            byte[] bytes=new byte[1024];
            int len;
            while ((len=fis.read(bytes))!=-1){
                fos.write(bytes,0,len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Java规定只要实现了Closeable接口的类都是资源类,实现该接口的类都有自动关流的特性。

public class MyClose implements Closeable {

    @Override
    public void close() throws IOException {
        System.out.println("我被关闭了");
    }
}
public class Demo9 {
    public static void main(String[] args) {
        try (FileReader fr=new FileReader("steam\\a.txt");
             FileWriter fw=new FileWriter("steam\\g.txt");
             MyClose myClose=new MyClose()){

            char[] chars=new char[1024];
            int len;
            while ((len=fr.read(chars))!=-1){
                fw.write(chars,0,len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值