笔记(课12)

一阶段:第12天:文件和流(8.7)

一.File类

1.1File类文件属性

        //分号
        System.out.println(File.pathSeparator);//";"结果为String类型
        System.out.println(File.pathSeparatorChar);//';'结果为char类型
        // 反斜杠
        System.out.println(File.separator);//"\"结果为String类型
        System.out.println(File.separatorChar);//'\'结果为char类型

1.2File类方法

1.2.1File类基本方法的使用

    //构造方法的使用
    public static void fileContructor() {
        File file = new File("d:\\gp4.txt");
        System.out.println(file.toString());
        String parent="d:\\mywork";
        File file1=new File("d:\\mywork","haha.txt");
        File file2=new File(parent, "heihei.txt");
    }
    //文件
    public static void fileOpe() throws Exception{
        //创建对象
        File file=new File("d:\\gp4.tet");
        //(1)创建
        if (!file.exists()){
            boolean b=file.createNewFile();
            System.out.println("创建结果:"+b);
        }else {
            System.out.println("文件已存在");
        }
        //(2)删除
        /*//直接删除
        boolean b2=file.delete();
        System.out.println("删除结果:"+b2);*/
        /*//退出JVM时删除
        Thread.sleep(5000);
        file.deleteOnExit();*/
        //(3)判断
        System.out.println("是否可执行"+file.canExecute());
        System.out.println("是否可读取"+file.canRead());
        System.out.println("是否可写入"+file.canWrite());
        System.out.println("判断是否是文件:"+file.isFile());
        System.out.println("判断是否隐藏:"+file.isHidden());
        System.out.println("判断是否是绝对路径:"+file.isAbsolute());
        //(4)获取
        System.out.println("获取绝对路径"+file.getAbsolutePath());
        System.out.println("获取规范路径"+file.getCanonicalPath());
        System.out.println("获取名称"+file.getName());
        System.out.println("获取路径"+file.getPath());
        System.out.println("获取长度"+file.length());
        System.out.println("最后一次修改时间"+new Date(file.lastModified()).toLocaleString());
    }
    //目录
    public static void directoryOpe()throws Exception{
        File dir=new File("d:\\aaa\\bbb\\ccc");
        //(1)创建
        if (!dir.exists()){
            //mkdir()创建单级目录
            //mkdirs()创建多级目录
            boolean b=dir.mkdirs();
            System.out.println("创建结果:"+b);
        }else {
            System.out.println("已存在");
        }
        /*//(2)删除
        //直接删除(只能删除最里层目录)(只能删除空目录)
        boolean b=dir.delete();
        System.out.println("删除结果:"+b);
        //jvm删除
        dir.deleteOnExit();*/
        //(3)判断
        System.out.println("是否是文件夹"+dir.isDirectory());
        //(4)获取目录中文件和子目录
        System.out.println("----list------");
        File mydir=new File("e:\\音乐");
        String[] list=mydir.list();
        //File[] list=mydir.listFiles();
        //mydir.list
        for (String s : list) {//必须保证有该目录,否则会报异常
            System.out.println(s.toString());
        }
        /*for (File f : list) {
            System.out.println(f.toString());
        }*/
        System.out.println("-----过滤list-----");
        String[] list2=mydir.list(new FilenameFilter(){
            @Override
            public boolean accept(File dir, String name) {
                if(name.endsWith(".zip")) {
                    return true;
                }
                return false;
            }
        });
        for (String s : list2) {
            System.out.println(s.toString());
        }
        System.out.println("----------系统根目录-----------");
        File[] files = File.listRoots();
        for (File file : files) {
            System.out.println(file.toString());
        }
    }
    public static void renameTo()throws Exception{
        File file=new File("d:\\haha");
        boolean b=file.mkdirs();
        System.out.println("创建结果"+b);
        //重命名(具有剪切的功能)(若文件里有内容就不能剪切了)
        boolean b2=file.renameTo(new File("d:\\heihei"));
        System.out.println("重命名"+b2);
    }

1.2.2案例


public class Shili1 {
    public static void main(String[] args) {
        //listDir(new File("e:\\小说"),0);
        deleteFile(new File("e:\\aaa"));
    }
    //练习1:递归访问文件夹,列出文件夹内所有内容(包括子文件)
    public static void listDir(File dir,int Level){
        System.out.println(getSeparator(Level)+dir.toString());//输出指定目录
        File[] files=dir.listFiles();
        Level++;
        if (files!=null&&files.length>0){
            for (File file : files) {
                if (file.isDirectory()){
                    listDir(file,Level);
                }
                else {
                    System.out.println(getSeparator(Level)+file.toString());
                }
            }
        }
    }
    //以指定格式输出
    public static String getSeparator(int level){
        StringBuilder sb=new StringBuilder();
        sb.append("|");
        for (int i = 0; i < level; i++) {
            sb.append("__");
        }
        return sb.toString();
    }
    //练习二:递归删除文件夹
    public static void deleteFile(File dir){
        File[] files=dir.listFiles();
        if (files!=null&&files.length>0){
            for (File file : files) {
                if (file.isDirectory()){
                    deleteFile(file);
                }else {//删除文件
                    System.out.println(file.toString()+":"+file.delete());
                }
            }
        }
        //把文件夹删除
        System.out.println(dir.toString()+":"+dir.delete());
    }
}

1.2.3复制文件

1.2.3.1使用字节流复制文件
// 使用字节流复制文件
public class CopyDemo1 {
    public static void main(String[] args) throws Exception{
        //创建字节输入流、输出流
        FileInputStream fis=new FileInputStream("copy.jpg");
        FileOutputStream fos=new FileOutputStream("copy2.jpg");
        //读取和写入
        byte[] buf=new byte[1024*4];
        int len=1;
        while ((len=fis.read(buf))!=-1){
            fos.write(buf,0,len);
        }
        //关闭
        fis.close();
        fos.close();
        System.out.println("复制完毕");
    }
}
1.2.3.2使用字符流复制文件
// 使用字符流实现复制
public class CopyDemo2 {
    public static void main(String[] args) throws Exception{
        //创建字符输入流输出流
        FileReader fr=new FileReader("copy.jpg");
        FileWriter fw=new FileWriter("copy3.jpg");
        //读取和写入
        char[] buf=new char[1024];
        int len=0;
        while ((len=fr.read(buf))!=-1){
            fw.write(buf,0,len);
        }
        //关闭
        fr.close();
        fw.close();
        System.out.println("复制完成");
    }
}
1.2.3.3使用缓冲流复制文件
// 使用缓冲流实现文件的复制
public class CopyDemo {
    public static void main(String[] args) throws Exception{
        //创建缓冲流
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("out.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("out2.txt"));
        //读写
        byte[] buf=new byte[1024*4];
        int len=-1;
        while((len=bis.read(buf))!=-1){
            bos.write(buf,0,len);
            bos.flush();
        }
        //关闭
        bos.close();
        bis.close();
        System.out.println("复制完毕");
    }
}

二.IO流(Input、Output)

2.1概述

reader/write—>字符流
input/output—>字节流
input/output+stream+reader/writer—>字节到字符的转换流

如果复制的文件是文本文件 ,用字节流和字符流都可以(如果有中文,需要用到转换流)
如果复制的文件是图片、音乐、电影, 使用字节流

输入:从外部存储设备到内存叫输入|读取。 输入流:表示将数据读取到java程序(内存)中使用的流。
输出: 从内存到外部存储设备叫输出|写入。输出流:表示从java程序(内存)向外传输使用的流。
当操作完成后,一定要关闭输入输出流
字节流:一次性传输一个字节数据,将数据以字节的形式传输。
字符流:一次性传输一个字符(1、2或3个字节)数据,将数据以字符的形式传输。

2.2输入流

2.2.1字节输入流

InputStream是一个抽象类,不能实例化对象。
文件输入流FileInputStream
 close() 关闭此输入流并释放与该流关联的所有系统资源。
 read() 从输入流中读取数据的下一个字节。
 read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
 read(byte[] b,int off, int len) 将输入流中最多len个数据字节读入 byte 数组。
/**
 * 使用FileInputStream读取文件
 * ANSI:在中文系统下,指的是GBK
 * 简体中文:GB2312--->GBK--->GB18030
 */
public class Demo1 {
    public static void main(String[] args) throws Exception{
        //1.创建流
        FileInputStream fi=new FileInputStream("e:\\bb.txt");
        //2.读取文件
        /*//2.1一次读取一个字节
        int data=-1;
        while ((data=fi.read())!=-1) {
            System.out.print((char) data);
        }*/
        //2.2一次读取多个
        //byte[] buf=new byte[10];
        byte[] buf=new byte[1024];
        /*int len1=fi.read(buf);//len读取数据长度
        int len2=fi.read(buf);//len读取数据长度
        int len3=fi.read(buf);//len读取数据长度
        System.out.println("第一次读取长度"+len1);
        System.out.println("第二次读取长度"+len2);
        System.out.println("第三次读取长度"len3);*/
        int len=-1;
        while ((len=fi.read(buf))!=-1){
            /*for (byte b : buf) {
                System.out.print((char) b);
            }*/
            //当缓冲区设置值太大时
            for (int i = 0; i < len; i++) {
                System.out.print((char) buf[i]);
            }
        }
        //关闭
        fi.close();
    }
}

2.2.2字符输入流

Reader:是所有字符输入流的父类,为一个抽象类,不能实例化对象,使用它的子类FileReader类
// Reader--->InputStreamReader--->FileReader
// FileReader字符输入流
public class Demo3 {
    public static void main(String[] args) throws Exception{
        //1.创建流
        FileReader reader=new FileReader("e:\\bb.txt");
        //2.读取
        //2.1一次读取一个字符
        /*int data=reader.read();
        System.out.println((char) data);*/
        int data=-1;
        while ((data=reader.read())!=-1){
            System.out.print((char) data);
        }
        //3.关闭
        reader.close();
    }
}

2.3输出流

2.3.1字节输出流

OutputStream是抽象类,不能实例化对象。
文件输出流FileOutputStream
flush() 刷新此输出流并强制写出所有缓冲的输出字节。
write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
write(byte[] b,int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
write(int b) 将指定的字节写入此输出流。
public class Demo2 {
    public static void main(String[] args) throws Exception{
        //1.创建输出流
        FileOutputStream fos=new FileOutputStream("e:\\bb.txt",true);
        //2.写入
        /*//2.1写入一个
        fos.write(97);*/
        //String content="helloworld";
        String content="helloworld\r\n";//换行
        fos.write(content.getBytes());
        //3.关闭
        fos.close();
        System.out.println("写入完毕");
    }
}

2.3.2字符输出流

Writer:是所有字符输出流的父类,为一个抽象类,不能实例化对象,使用它的子类FileWriter类
// 字符输出流
public class Demo4 {
    public static void main(String[] args) throws Exception{
        //创建字符输出流
        FileWriter fw=new FileWriter("e:\\cc.txt");
        //写入
        for (int i = 0; i < 10; i++) {
            fw.write("好好学习,天天向上\r\n");
            fw.flush();//防止断电,存在缓冲区---断电就没了,及时刷新---将内容放入内存中
        }
        //关闭
        fw.close();
        System.out.println("执行完毕");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值