io

一、 java.io.File

1.1 定义

public class File
extends Object
implements Serializable, Comparable<File>

1.2 构造方法

在这里插入图片描述
在这里插入图片描述

1.3 常用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4 字段

在这里插入图片描述
在这里插入图片描述

二、文件遍历案例

public class 文件遍历 {
    public static void main(String[] args) {
        File file = new File("e:\\");
        File[] files = file.listFiles();
        listFile(files);

    }
    public static void listFile(File[] files){
        if (files != null && files.length>0){
            for (File file:files) {
                if (file.isFile()){
                    //先判断是不是文件
                    if (file.getName().endsWith(".avi")){
                        //找到avi文件
                        if (file.length()>100*1024*1024){
                            //判断文件是否大于100兆
                            file.delete();//删除
                            System.out.println(file.getAbsolutePath()+"已删除");
                        }
                        /*System.out.println("找到一个avi文件:"+file.getAbsolutePath());//获取路径*/
                    }
                }else {
                    //文件夹
                    File[] file1 = file.listFiles();
                    listFile(file1);
                }
            }
        }
    }
}

三、文件过滤器

public class 文件过滤器 {
    public static void main(String[] args) {
        File e = new File("e:\\");
       
        listFiles(e);

    }

    public static void listFiles(File file) {
        // 创建一个过滤器 并 描述规则

        //通过文件获取子文件夹
        File[] files = file.listFiles(new FileFilter() {        //匿名内部类
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().endsWith(".avi") || pathname.isDirectory()){
                    //如果是avi或者是文件夹则保留
                    return true;
                }else {
                    return false;
                }

            }
        });
        if (files != null && files.length>0){
            for (File f:files) {
                if (f.isDirectory()){
                    listFiles(f);
                }else {
                    System.out.println("找到avi文件:"+f.getAbsolutePath());
                }
            }
        }
    }
    /*public static class AVIFileFilter implements FileFilter{

        @Override
        public boolean accept(File pathname) {
            if (pathname.getName().endsWith(".avi") || pathname.isDirectory()){
                //如果是avi或者是文件夹则保留
                return true;
            }else {
                return false;
            }

        }
    }*/
}

在这里插入图片描述

四、相对与绝对路径

绝对路径:以盘符开始,是一个完整的路径,例如c://a.txt
相对路径:java中是相对于项目目录路径,这是一个不完整的路径,在Java开发中很常用 例如 a.txt
在这里插入图片描述

五、流概述

public class Demo {
    /**
     * IO流概述
     *  可以将这种数据传输操作,看做一种数据的流动 , 按照流动的方向分为输入Input和输出Output
     *  Java中的IO操作主要指的是 java.io包下的一些常用类的使用. 通过这些常用类对数据进行读取(输入Input) 和 写出(输出Output)
     *
     * IO流的分类:
     *  按照流的方向来分,可以分为:输入流和输出流.
     *  按照流动的数据类型来分,可以分为:字节流和字符流
     *
     *     字节流:
     *          -   输入流 :   InputStream
     *          -   输出流 :   OutputStream
     *     字符流:
     *          -   输入流 :   Reader
     *          -   输出流 :   Writer
     *
     *
     * 一切皆字节:
     *      计算机中的任何数据(文本,图片,视频,音乐等等)都是以二进制的形式存储的.
     *      在数据传输时 也都是以二进制的形式存储的.
     *      后续学习的任何流 , 在传输时底层都是二进制.
     * @param args
     */
    public static void main(String[] args) throws FileNotFoundException {


    }

}

六、java.io.OutputStream

//一切皆字节:
//计算机中的任何数据(文本,图片,视频,音乐等等)都是以二进制的形式存储的.
//在数据传输时 也都是以二进制的形式存储的.
//后续学习的任何流 , 在传输时底层都是二进制.

OutputStream是抽象类在这里插入图片描述
在这里插入图片描述
注意:

写完一定要关闭close;

七、java.io.FileOutputStream

在这里插入图片描述
构造方法:
在这里插入图片描述
其中append为true则表示,在文件末尾添加数据,否则表示重新写入数据

 public static void main(String[] args) throws IOException {
        //FileOutputStream
        FileOutputStream fos = new FileOutputStream("e://a.txt");// 没有添加append参数,表示默认false 即覆盖原数据
        byte[] bytes = {65,66,67,68,69};
        fos.write(bytes);
        fos.close();
        System.out.println("已经写出");
        
    }

在这里插入图片描述
通过字符串+getBytes函数,获得字节数组:

public static void main(String[] args) throws IOException {
        //FileOutputStream
        FileOutputStream fos = new FileOutputStream("e://a.txt");// 没有添加append参数,表示默认false 即覆盖原数据

        byte[] bytes = "ABCDEFG".getBytes();
        fos.write(bytes);
        fos.close();
        System.out.println("已经写出");
        
    }

八、java.io.FileInputStream

在这里插入图片描述

构造方法

在这里插入图片描述

常用方法

在这里插入图片描述
当read方法读到-1的时候,说明已经读到末尾
在这里插入图片描述
一般方法:

public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("e://a.txt");
        while (true) {
            byte b = (byte) fis.read();
            if (b == -1) {
                break;
            }
            System.out.println((char)b);
        }
        fis.close();
    }    

推荐方法:

 byte[] bytes = new byte[10];
        int len = fis.read(bytes);
        System.out.println(new String(bytes,0,len));
        len = fis.read(bytes);
        System.out.println(new String(bytes,0,len));
        len = fis.read(bytes);
        System.out.println(new String(bytes,0,len));
        fis.close();

九、文件加密和解密工具

//九、文件加密和解密工具
    public static void main(String[] args) throws IOException {
        System.out.println("请输入文件储存的全路径");
        Scanner input = new Scanner(System.in);
        String fileName = input.nextLine();
        //原文件                   例:a.png
        File oldFile = new File(fileName);
        //加密存储的新文件   加前缀mi-   mi-a.png
        File newFile = new File(oldFile.getParentFile(),"mi-"+oldFile.getName());

        FileInputStream fis = new FileInputStream(oldFile);
        FileOutputStream fos = new FileOutputStream(newFile);
        while (true) {
            int b = fis.read();
            if (b == -1) {
                break;
            }
            //任何数据^相同的数字两次,结果就是其本身
            //异或运算
            fos.write(b^10);
        }
        System.out.println("加密或者解密成功");
    }

十、字节流读取文字

public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("e:\\a.txt");
        byte[] b = new byte[10];
        int len = fis.read(b);
        System.out.println(new String(b,0,len));
        len = fis.read(b);
        System.out.println(new String(b,0,len));
    }

由于提前限定了一次读取的字节数为10,所以出现了读取不到一个完整汉字的情况,因而出现乱码。但是UTF-8使用动态编码表,由于提前不知道每个字符需要多少字节,所以此方法不行。

所以下面引入了字符流,用来解决读取半字的问题

十一、字符输出

字符流用来操作文字,而字节流可以操作任何文件,所以字节流更加常用。
在这里插入图片描述

方法

在这里插入图片描述
注意:

决定是否在原文件基础上追加的,是声明字符流对象是的append属性(为true则是追加模式);

append与write在实际实现上,没有区别,但是append会返回Writer对象;

十二、字符读取

基本使用方法同字节流。

char默认值是 空白字符,对应的int数值是0

十三、flush刷新管道

字符输出时,以字符为单位,但计算机中都是以字节为单位。当一个字符占用多个字节时,字符输入流未读取单个字符全部字节之前,会将已读取字节放入缓存;

字符输出流fw.flush()会将缓存中字符强制写入到文件中,fw.close()也会有此效果;

如果不执行的话,就不会将字符写入文件中

十四、字节转换字符流

转换流。将字节流装饰为字符流:使用了装饰者模式;

由于平常使用时,可能获取的是字节流,所以才有这种转换方式

 public static void main(String[] args) throws IOException {
        //转换流
        //字节流装饰为 字符流    :使用了装饰者的设计模式
        FileInputStream fis = new FileInputStream("e://a.txt");
        //将字节输入流,转换为字符输入流
        //参数1,要转换的字节流
        //参数2,制定编码名称
        InputStreamReader isr = new InputStreamReader(fis,"gbk");
        while (true){
            int c = isr.read();
            if (c == -1) {
                break;
            }
            System.out.println((char)c);
        }
        isr.close();
        fis.close();
    }
public static void main2(String[] args) throws IOException{
        //转换流
        //字节流装饰为 字符流    :使用了装饰者的设计模式
        FileOutputStream fos = new FileOutputStream("e://a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        osw.write("床前明月光");
        osw.flush();
        osw.close();
    }

十五、Print与BufferedReader

15.1 打印流

1)打印字节流与打印字符流
在这里插入图片描述
打印字符流(记得flush或close)
在这里插入图片描述

打印字节流和打印字符流在使用上差别不大,但字符流需要调用flush,否则不会写入到文件中;

2)字节流转换为打印流

FileOutputStream fos = new FileOutputStream("e://a.txt");
        PrintWriter pw = new PrintWriter(fos);

15.2 缓存读取流

//缓存读取流, 将字符输入流 转换为带有缓存 可以一次读取的缓存字符读取流
        FileReader fr = new FileReader("e:/a.txt");
        BufferedReader br = new BufferedReader(fr);
        String text = br.readLine();
        System.out.println(text);

十六、收集异常日志

普通的异常控制台显示

可以将异常信息保存在txt文档中,并加上日期,便于后期核查

 public static void main(String[] args) throws FileNotFoundException {
        //收集异常日志
        try{
            String s = null;
            s.toString();
        }catch (Exception e){
            PrintWriter pw = new PrintWriter("e://bug.txt");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            pw.println(sdf.format(new Date()));
            e.printStackTrace(pw);
            pw.close();
        }
    }

在这里插入图片描述

十七、properties

17.1 概述

在这里插入图片描述
properties继承HashTable属于Map集合(键值对),但其扩展部分含有IO相关用法(配置文件)

17.2 常用方法

1)store方法:将properties对象内容写入字节流/字符流所指的文件中

十八、序列化技术

18.1 概述

由于垃圾回收机制的存在,一些属性或对象,在程序关闭之后,便消失,无法重复利用,所以有人在想能不能将把对象完整的存储在文件中,使用时再取出来,即对象在内存中存储的字符序列(看上去像是乱码);

将文件中的对象读取到程序中来,就是反序列化;

虽然序列化很方便,但是却十分容易产生Bug(占Bug总数将近三分之一),所以Java官方提出近几年将要进行整改,建议大家不要使用此方法;(了解下也是有必要的)

18.2 序列化

Java官方规定,所有对象均不能序列化,想要序列化,需添加标记
在这里插入图片描述
添加标记:实现接口Serializable。添加代码后没有任何飘红,即说明不需要实现任何方法,因此这个接口被称为标记接口。
在这里插入图片描述

18.3 反序列化

在这里插入图片描述

十九、try-with-resources

public static void main(String[] args) throws FileNotFoundException {
        // try-with-resources
        //1.7之前
        /*try(FileReader fr = new FileReader("e://book.txt")){
           // FileReader fr = new FileReader("e://book.txt");
            int c = fr.read();
            System.out.println((char) c);
        }catch (IOException e){
            e.printStackTrace();
        }*/
        //1.9进行了优化
        /*FileReader fr = new FileReader("e://book.txt");
        PrintWriter pw = new PrintWriter("e://book.txt");
        try(fr;pw){
            int c = fr.read();
            System.out.println((char) c);
        }catch (IOException e){
            e.printStackTrace();
        }*/

        CloseDemo d = new CloseDemo();
        try(d){

        }catch (Exception e ){

        }

    }
    static class CloseDemo implements Closeable {

        @Override
        public void close() throws IOException {
            System.out.println("closeable方法被调用了");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值