java day14 IO流 & File

目录

1.File:

File类的创建方法:

获取Flie对象基本信息:

File创建或删除 文件或文件夹:

File类对象的遍历方法:

2.字符集:

对字符的编码和解码:

3.IO流:

文件字节输入流:

文件字节输出流:

资源释放的方案:

字符输入流:

字符输出流:

缓冲流:

IO框架:


1.File:

 

File类的创建方法:

public static void main(String[] args) {
        //File对象的创建
        //File(String pathname)
        // 在java中, \ 代表转义字符
        File f1 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb\\cc.txt");
        System.out.println(f1);
        File f2 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb");
        System.out.println(f2);

        //File(String parent,String child)
        File f3 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb","cc.txt");
        System.out.println(f3);

        //File(File parent,String child)
        File f4 = new File(f2,"cc.txt");
        System.out.println(f4);


        File f5 = new File("C:\\Users\\Administrator\\Desktop\\aa\\xx");
        System.out.println(f5);

    }

绝对路径: 以磁盘符开头

相对路径:不以磁盘符开头,相对于当前工程

获取Flie对象基本信息:

public static void main(String[] args) {
        File f1 = new File("C:\\Users\\Administrator\\Desktop\\aa\\bb");

        //exists():判断是否存在
        System.out.println(f1.exists());

        //isFile(): 判断是否是文件
        System.out.println(f1.isFile());

        //isDirectory(): 判断是不是文件夹
        System.out.println(f1.isDirectory());

        //getName(): 获取文件的名称或者文件夹的名称
        System.out.println(f1.getName());

        //length(): 获取文件的大小, 1.获取字节个数 2.只能获取文件的大小,不能获取文件夹的大小
        System.out.println(f1.length());

        //lastModified(): 获取最后一次修改时间
        //时间: 1970年1月1日0时0分0秒(UTC时间)
        System.out.println(f1.lastModified());//1731548215290,相对于时间原点的毫秒数

        //getPath(): 获取创建对象时,在构造方法中传递的路径
        System.out.println(f1.getPath());

        //getAbslutePath(): 获取绝对路径, 以磁盘符开始
        System.out.println(f1.getAbsolutePath());

        //相对路径和绝对路径
        /*
            绝对路径: 以磁盘符 为开头的路径
            相对路径: 不以磁盘符 为开头的路径, 在IDEA中, 如果一个路径不以磁盘付开始,那么相对于 当前的工程(Project)路径
         */

        File f2 = new File("aa");
        System.out.println(f2.getPath());
        System.out.println(f2.getAbsolutePath());

    }

File创建或删除 文件或文件夹:

注意:delete只能删除 文件或者空文件夹

File类对象的遍历方法:

listFiles()返回值为 数据类型为File类的数组

2.字符集:

 

UTF-8编码方式:

 汉字在 utf-8 编码方式中占3个字节 在GBK编码方式中占2个字节

对字符的编码和解码:

 

 汉字在 utf-8 编码方式中占3个字节 在GBK编码方式中占两个字节

public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "a中b";
        //编码 getBytes(): 使用平台(IDEA)默认编码方式(UTF-8),  getBytes(String charsetName): 使用指定编码方式
        byte[] bys1 = str.getBytes();
        System.out.println(Arrays.toString(bys1));//[97, -28, -72, -83, 98]

        byte[] bys2 = str.getBytes("GBK");
        System.out.println(Arrays.toString(bys2));//[97, -42, -48, 98]

        //解码 String(byte[] bys): 使用平台(IDEA)默认编码方式(UTF-8), String(byte[] bys,String charsetName):  使用指定编码方式
        byte[] bys3 = {97, -28, -72, -83, 98};
        //String result1 = new String(bys3);
        //String result1 = new String(bys3,"UTF-8");
        String result1 = new String(bys3,"GBK");//a涓璪 乱码
        System.out.println(result1);
    }

构造方法的参数为 指定的编码格式

构造器参数也为用指定的格式解码

字符串的构造方法中只能传两个数组 一个是字符数组返回值为 把字符都链接在一起的字符串

另一个是byte类型数组 会返回一个解码之后字符串

3.IO流:

作用: 读写文件(网络)数据

 

 IO流的分类:

文件字节输入流:

  

 

FileInputStream类的构造器 可以传文件对象 和 路径名 注意只能操作文件

注意: read()空参 返回读取字节 没有发现数据返回-1

           read(数组)返回读取了多少个字节 数组中没有读取任何到数据返回-1

 offest 为读取数组的起始位置 len为读取数组中元素的个数

文件字节输出流:

构造器中如果文件不存在会创建一个新的文件

 注意 append 为true是追加文件数据 默认为false 替换当前文件的所有数据

write空参构造为写入一个字节a

public static void main(String[] args) {
        //文件赋值案例
        //需求: 把 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly.jpg 复制到 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly2.jpg
        InputStream is = null;
        OutputStream os = null;
        try{
            //1.创建字节输入流, 关联C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly.jpg 文件
             is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly.jpg");
            //2.创建字节输出流, 关联C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly2.jpg 文件
             os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly2.jpg");
            //3.使用字节输入流读取数据
            byte[] bys = new byte[1024];//1024及其整数倍,<=8192
            int len = -1;//记录有效字节个数
            while ((len = is.read(bys))!=-1){
                //4.把读取到的数据写入到目标文件中
                os.write(bys,0,len);
            }
        }catch (Exception e){
            System.out.println("出错辣~~~~");
        }finally {
            //释放资源
            //做非空判断,确保关联资源了,才释放
            if (is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

此为文件复制的完整流程 如果指针为空不应该让其执行close语句

如果执行到try中报错语句则不继续执行try之后的语句

不用throws而用try-catch处理编译器异常的原因为 不能让程序停止执行 如果throws给jvm会停止程序运行并打印错误信息

资源释放的方案:

jdk7以前的方案 在finally中 .close

jdk7 以后:用try—with—resource

以下为改进之后的代码:

public static void main(String[] args) {
        //文件赋值案例
        //需求: 把 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly.jpg 复制到 C:\Users\Administrator\Desktop\JavaSE进阶\day04\资料\ly2.jpg

        //不管报不报错, jvm会自动的帮你释放资源
        //AutoClosable: 接口,用于标识某个对象是 可自动关闭的对象
        try (
                //String s1 = "abc"; 会报错
                InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly.jpg");
                OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day04\\资料\\ly2.jpg");
        ) {
            //int i = 1/0;

            //3.使用字节输入流读取数据
            byte[] bys = new byte[1024];//1024及其整数倍,<=8192

            int len = -1;//记录有效字节个数
            while ((len = is.read(bys)) != -1) {
                //4.把读取到的数据写入到目标文件中
                os.write(bys, 0, len);
            }

        } catch (Exception e) {
            System.out.println("出错辣~~~~");
        }

    }

字符输入流:

使用字节流操作字符不方便

字符流 = 字节流+编码方式

public static void main(String[] args) throws IOException {
        //需求: 需要把出师表复制一份到出师表2

        //1.构建一个字符输入流用于读取数据
        InputStream in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day05\\资料\\出师表.txt");
        String charsetName = "UTF-8";

        Reader r = new InputStreamReader(in, charsetName);

        //2.构建一个字符输出流用于写数据
        OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\JavaSE进阶\\day05\\资料\\出师表2.txt");
        Writer w = new OutputStreamWriter(os, charsetName);

        //3.循环读写
        char[] chs = new char[1024];
        int len = -1;
        while ((len = r.read(chs)) != -1) {
            //把字符数组中的有效字符转化成字符串
            String str = new String(chs, 0, len);
            //把字符串写出去
            w.write(str);
            w.flush();//把数据刷入到文件中
        }
        //4.释放资源
        r.close();
        w.close();
    }

字符输出流:

在文件字符输出流的构造方法中加上ture可以做到在 文件中 用字符输出流中续写文件

public static void main(String[] args) throws IOException {
        //构建字节输出流对象和编码方式
        OutputStream os = new FileOutputStream("aa\\d.txt");

        //使用平台默认的编码方式
        Writer w = new OutputStreamWriter(os);

        //调用方法,写出数据 写出一首诗
        w.write("床秦明月光");
        //需要往文件中写一个换行符号: windows: \r\n, mac: \r, linux: \n
        w.write("\r\n");

        w.write("疑是地上霜");
        w.write("\r\n");

        w.write("举头望明月\r\n");
        //w.write("\r\n");

        w.write("低头思故乡");

        //释放资源
        w.close();
    }

flush 和 close 的区别(重要):

共同点: 把内存的数据刷入到 文件/硬盘中

不同点:  flush 调用后流可以继续使用          close调用后不能再使用

         

缓冲流:

缓冲字节输入流:

读写的方法和 字符输入/输出流都一样

缓冲字符输入流:

注意:readLine()和 newLine()为 缓冲字符输入输出流中新增的功能

缓冲字符输出流:

newLine的作用仅为换行

 剩下的方法和 字符输出流一样:

IO框架:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值