Java I/O


在这里插入图片描述

File类

  • 概念:代表物理盘符中的一个或文件夹
  • 方法:
    • createNewFile()//创建一个新文件
    • mkdir()//创建一个新目录
    • delete()//删除文件或空目录
    • exists()//判断File对象所代表的的对象是否存在
    • getAbsolutePath()//获取文件的绝对路劲
    • getName()//取得名字
    • getParent()//获取文件/目录所在的目录
    • isDirectory()//是否是目录
    • isFile()//是否是文件
    • length()//获得文件的长度。
    • listFiles()//列出目录中的所有内容.
    • renameTo()//修改文件名为
      在这里插入图片描述
文件
文件操作
  • 1.创建文件

    File file = new File("d:\\desktop\\aa.txt");
    if (!file.exists()) {
        boolean newFile = file.createNewFile();
        System.out.println("创建结果" + newFile);
    } else {
        System.out.println("文件已经存在.");
    }
    
  • 2.删除文件

    //2.1直接删除
    boolean b1 = file.delete();
    System.out.println("删除结果" + b1);
    //2.2Jvm删除
    Thread.sleep(5000);
    file.deleteOnExit();
    
  • 3.获取文件信息

    System.out.println("文件长度:" + file.length());
    System.out.println("文件名称" + file.getName());
    System.out.println("文件绝对路径:" + file.getAbsolutePath());
    System.out.println("规范路径路径" + file.getCanonicalPath());
    System.out.println("文件路径:" + file.getPath());
    System.out.println("文件父目录:" + file.getParent());
    System.out.println("文件最后一次修改时间:" + new Date(file.lastModified()).toLocaleString());
    
    
  • 4.判断

    System.out.println("是否存在" + file.exists());
    System.out.println("是否只读:" + file.canWrite());
    System.out.println("是否隐藏:" + file.isHidden());
    System.out.println("是不是文件:" + file.isFile());
    
  • 5.修改名称(具有剪切的功能)

    file.renameTo(new File("d:\\desktop\\sb"));
    
目录(文件夹)
  • 1.创建文件夹

    File dir = new File("d:\\aaa\\b\\c");
    if (!dir.exists()) {
        //dir.mkdir()//创建单级目录
        boolean b = dir.mkdirs();//创建多级目录
        System.out.println("创建结果:" + b);
    } else {
        System.out.println("创建失败");
    }
    
  • 2.删除文件夹

    //2.1直接删除:只删除最里层目录,必须是空的
     boolean b2 = dir.delete();
    //        dir.deleteOnExit();
    System.out.println("删除结果"+b2);
    
    
  • 3.获取信息

    System.out.println("获取路劲" + dir.getPath());
    System.out.println("获取绝对路劲" + dir.getAbsolutePath());
    System.out.println("获取名称" + dir.getName());
    System.out.println("规范名称" + dir.getCanonicalPath());
    
    
  • 4.判断

    System.out.println("是否存在" + dir.exists());
    System.out.println("是否隐藏" + dir.isHidden());
    System.out.println("是不是文件夹:" + dir.isDirectory());
    
    
  • 5.重命名

    //        boolean b = dir.renameTo(new File("d:\\desktop\\aaa\\b\\d"));
    //        System.out.println(b);
    
  • 6.获取目录的子目录和文件

    File dir2 = new File("D:\\desktop");
    String[] list = dir2.list();
    for (String s : list) {
        System.out.println(s);
    }
    File[] files = dir.listFiles();
    for (File file : files) {
        System.out.println(file.toString());
    }
    
    System.out.println("===================");
    //获取目录下的.pptx
    String[] list1 = dir2.list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            if (name.endsWith(".pptx")) {
                return true;
            }
            return false;
        }
    });
    for (String s : list1) {
        System.out.println(s);
    }
    
    File[] files1 = dir2.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            if (pathname.toString().endsWith(".pptx")) {
                return true;
            }
            return false;
        }
    });
    for (File file : files1) {
        System.out.println(file.getName());
    }
    
    //获取根目录
    File[] files2 = dir2.listRoots();
    for (File file : files2) {
        System.out.println(file.toString());
    }
    
    

1.练习,递归遍历文件夹
2.递归删除文件夹

 public static void listDir(File dir, int level) {
        File[] files = dir.listFiles();
        if (files != null && files.length > 0) {
            for (File file : files) {
                if (file.isDirectory()) {
                    System.out.println(getSeprator(level)+file.getName());
                    listDir(file, ++level);
                } else {

                    System.out.println(getSeprator(level) + file.getName());
                }
            }
        }
    }

    public static String getSeprator(int level) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < level; i++) {
            stringBuilder.append("    ");
        }
        return stringBuilder.toString();
    }
public static void deleteList(File dir){
        File[] files = dir.listFiles();
        if(files!=null&&files.length>0){
            for (File file : files) {
                if(file.isDirectory()){
                    deleteList(file);
                }else {
                    System.out.println(file.getName()+"删除结果"+file.delete());
                }
            }
            System.out.println(dir.getName()+"删除结果"+dir.delete());
        }
    }
FileFilter接口
  • public interface FileFilter
    • boolean accept(File pathname)
  • 当调用File类中的listFiles()方法时,支持传入fileFilter接口接口实现类,当获取文件进行过滤,只有f符合条件的文件的才可出现在listFiles()的返回值中。
什么是流
  • 概念:内存与存储设备之间的传输数据的通道。
流的分类
  • 按方向

    • 输入流(读取):将<存储设备>中的内容读到<内存>中 .(外设–》内存)
    • 输出流(写入):将<内存>中的内容写入的<存储设备>中。
  • 按单位:

    • 字节流:以字节为单位,可以读写所有数据。
    • 字符流:以字符为单位,只能读写文本数据
  • 按功能:

    • 节点流:具有实际传输数据的读写功能。
    • 过滤流:在节点流的基础之上增强功能。
  • 输入输出是以内存为基点。

字节流
  • 字节流的父类(抽象类)

    • InputStream:字节输入流
      • public int read()
      • public int read(byte[]b){}
      • public int read(byte[]b,int off,int len);
    • OutputStream:字节输出流
      • public void write(int n){}
      • public void write(byte[]b){}
      • public void write(byte[]b,int off,int length)
  • write方法
    在这里插入图片描述

文件字节流
  • FileOutputStream:
    • public void write(byte[]b)//一次写多个字节,将b数组中所有的字节,写入输入流。
  • FileInputStream:
    • public int read(byte[]b)//从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1;

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

  • 字节读取
  • 1.1单个字节读取

//        //1.创建文件字节输入流
        InputStream inputStream = new FileInputStream(new File("d:\\desktop\\demo.txt"));
        //2.读文件
        //2.1单个字节读取
        int data = 0;
        while ((data = inputStream.read()) != -1) {
            System.out.println((char) data);
        }System.out.println(data);
//        3.关闭流
        inputStream.close();

1.2读取多个字节

//        //1.创建文件字节输入流
        InputStream inputStream = new FileInputStream(new File("d:\\desktop\\demo.txt"));
        //2.2读取多个字节
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, len));
        }
        inputStream.close();

2.1写入

 		//1.创建流
        File file = new File("d:\\desktop\\test.txt");
        OutputStream outputStream = new FileOutputStream(file, true);//append
        //2.写入
        String word = "Hello wordl\r\n";
        for (int i = 0; i < word.length(); i++) {
            outputStream.write(word.getBytes());//直接写入文件
        }
        //3.关闭
        outputStream.close();
字节缓冲流
  • 缓冲流:BufferedOutputStream/BufferedInputStream
    • 提高IO效率,减少访问磁盘的次数;
    • 数据存储在缓冲区中,flush是将缓冲区的内容写入文件中,也可以直接close;

在这里插入图片描述

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

  • 1.1缓冲流输入单个读取
        //1.创建缓冲字节输入流
        FileInputStream fileInputStream = new FileInputStream("d:\\desktop\\test02.txt");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        //2.读取
        //2.1单个字节读取
        int data = 0;
        while ((data = bufferedInputStream.read()) != -1) {
            System.out.println((char) data);
        }
        //3.关闭,关闭缓冲流,自动关闭节点流
        bufferedInputStream.close();
  • 1.2多个字节读取
        //1.创建缓冲字节输入流
        FileInputStream fileInputStream = new FileInputStream("d:\\desktop\\test02.txt");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
 
       //2.2读取多个字节
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = bufferedInputStream.read()) != -1) {
            System.out.println(new String(buffer, 0, len));
        }
        bufferedInputStream.close()
  • 2.缓冲输出流
//1.创建缓冲输出流
        FileOutputStream fileOutputStream = new FileOutputStream("d:\\desktop\\test02.txt");
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        //2.写入
        String word = "nice meet to you\r\n";
        for (int i = 0; i < 5; i++) {
            bufferedOutputStream.write(word.getBytes());
            bufferedOutputStream.flush();
        }
        //3.关闭:默认刷新,关闭底层节点流。
        bufferedOutputStream.close();
  • 实例,实现赋值文件
		//1.创建缓冲字节流输入,输出流
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("d:\\desktop\\girl.jpg"));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("d:desktop\\girl_copy.jpg"));

        //2.边读边写
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = bufferedInputStream.read(buffer)) != -1) {
            bufferedOutputStream.write(buffer, 0, len);
            bufferedOutputStream.flush();
        }
        bufferedInputStream.close();
        bufferedOutputStream.close();
  • 实现2
FileOutputStream fileOutputStream = new FileOutputStream("d:\\desktop\\girl_copy01.jpg");
        FileInputStream fileInputStream = new FileInputStream("d:\\desktop\\girl.jpg");
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fileInputStream.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, len);
        }
        fileInputStream.close();
        fileOutputStream.close();

对象流
  • 对象流:ObjectOutputStream/ObjectInputStream
    • 增强了缓冲区功能
    • 增强了读写8种基本数据类型和字符串功能
    • 增强了读写对象的功能:
      • readObject()从流中读取一个对象
      • writeObject(Object obj)向流中写入一个对象
  • 使用流传输对象的过程称为序列化,反序列化。
对象序列化
  • 对象序列化的细节
    • 必须实现Serializable接口
    • 必须保证其所有属性均可序列化
    • transient修饰为临时 属性,不参加序列化
    • 读取到文件尾部的标志:java.io.EOFException.
    • serialVersionUID

注意:
1.序列化的类必须实现Serializable(自动序列化几口)或Externalizable(收到序列化接口).
2.序列化的类要添加一个私有的long类型j静态常量:serverVersionUID,保证序列化的类反序列化的类是同一个类。
实现:1)使用transient修饰的属性,不可以序列化
2)静态属性不能序列化

使用transient修饰的属性实例化吗?
可以,同时实现Externalizable,手动序列化

  • 序列化和反序列化
//序列化   Person 必须继承Serializable接口
    public static void testSerializable() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("d:\\desktop\\demo.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        Person person1 = new com.demodong.practice.demo04.Person("demodong1", 12);
      Person person2 = new com.demodong.practice.demo04.Person("demodong2", 12);
       Person person3 = new com.demodong.practice.demo04.Person("demodong3", 12);
       Person person4 = new com.demodong.practice.demo04.Person("demodong4", 12);
        ArrayList<com.demodong.practice.demo04.Person> persons = new ArrayList<>();
        persons.add(person1);
        persons.add(person2);
        persons.add(person3);
        persons.add(person4);
        objectOutputStream.writeObject(persons);
        objectOutputStream.close();
    }
    public static void testSerializable2() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("d:\\desktop\\demo.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        ArrayList<Person> persons = (ArrayList<com.demodong.practice.demo04.Person>) objectInputStream.readObject();
        for (Person person : persons) {
            System.out.println(person.toString());
        }
    }
//继承Externalizable,需要重写方法
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        int object = (int) in.readObject();
    }
字符编码
  • ISO-8859-1 收录除ASCII外,还包括修,希腊语。。
  • UTF-8 针对Unicode的可变长度字符编码
  • GB2312 简体中文
  • GBK 简体中文,扩充
  • BIG5 台湾,繁体中文
  • 当编码方式和解码方式不一致时,会出现乱码
字符流
  • 字符流的父类(抽象):
    • Reader:字符输入流
      • public int read(){}
      • public int read(char[]c)
      • public int read(char[],int off,int len){}
    • Write:字符输出流
      • public void write(int n){}
      • public void write(String str){}
      • public void write(char[]c){}
文件字符流
  • FileWriter:

    • public void write(String str)//一次写多个字符,将b数组中所有的字符,写入输入流。
  • FileReader:

    • public int read(char[]c)//从流中读取多个字符,将读到的内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1;
  • 1.1字符输出流

  		//1.创建字符文件输出流
        FileWriter fileWriter = new FileWriter("d:\\desktop\\demo.txt", true);
        //2.写入
        for (int i = 0; i < 10; i++) {
            fileWriter.write("jiava真香");
            fileWriter.flush();
        }
        fileWriter.close();
  • 2.1字符输入流
        FileReader fr=new FileReader("d:\\desktop\\demo.txt");
        int len=0;
        char []buffers=new char[1024];
        while((len=fr.read(buffers))!=-1){
            System.out.println(new String(buffers,0,len));
        }
        fr.close();
字符缓冲流
  • 缓冲流:BufferedWriter/BufferedReader
    • 支持输入换行符。
    • 可一次写一行,读一行。
  public static void write() throws IOException {
        //1.创建字符缓冲流
        FileWriter fileWriter = new FileWriter("d:\\desktop\\demo.txt", true);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        for (int i = 0; i < 10; i++) {
            bufferedWriter.write("我爱phtyon");
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
        bufferedWriter.close();
    }
public static void read() throws IOException {
        //1.创建字符缓冲流输出流
        FileReader fileReader = new FileReader("d:\\desktop\\demo.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String data = null;

        while ((data = bufferedReader.readLine()) != null){
            System.out.println(data);

        }
        bufferedReader.close();
    }
  • PrintWriter:
    • 封装了print()/println()方法,支持写入后换行。
    • 支持数据原样打印
        //1.创建打印流
        PrintStream printStream = new PrintStream("d:desktop\\demo.txt");
        //2.打印
        printStream.println(97);
        //3.关闭
        printStream.close();
转换流
  • 桥转换流:InputStreamReader/OutputStreamWriter
    • 可将字节流转化为字符流
    • 可设置字符的编码方式。
    • InputStreamReadr:字节流通向字符流的桥梁
    • OutputStreamWriter:字符流通向字节流的桥梁
  • 步骤
    • 创建节点流
    • [创建过滤流 设置字符编码集]
    • 封装过滤流
    • 读写数据
    • 关闭流
InputStreamReader.contructor()

在这里插入图片描述

InputStreamReader.read()

在这里插入图片描述

OutputStreamWriter.constructor()

在这里插入图片描述

OutputStreamWriter.write()

在这里插入图片描述

OutputStreamWriter.getEncoding()

在这里插入图片描述

    public static void write() throws IOException {
        //创建转换流
        FileOutputStream fileOutputStream = new FileOutputStream("d:desktop\\demo.txt", true);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF8");
        //写入
        for (int i = 0; i < 10; i++) {
            outputStreamWriter.write("你好呀\r\n");
            outputStreamWriter.flush();
        }
        //关闭
        outputStreamWriter.close();
    }
    public static void read() throws IOException {
        //1.创建缓冲农六
        FileInputStream fileInputStream = new FileInputStream("d:\\desktop\\demo.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "gbk");
        //2.读取
        char[] buf = new char[1024];
        int len = 0;
        while ((len = inputStreamReader.read(buf)) != -1) {
            System.out.println(String.valueOf(buf));
        }
        inputStreamReader.close();

    }
重定向标砖输出流
System.setOut()

在这里插入图片描述

        System.setOut(new PrintStream("d:\\desktop\\demo.txt"));
        System.out.println("Nihao");
        int data = System.in.read();
        System.out.println((char) data);
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);

        BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
        String data=bufferedReader.readLine();
        System.out.println(data);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String data = bufferedReader.readLine();
        System.out.println(data);
RandomAccessFile
  • RandomAccessFile即可以读取文件内容,也可以像文件中写入内容。
  • 但是和其他输入输出流不同的是,程序可以直接跳到文件的任意位置来读写数据。
  • 读写模式
    • r:只读
    • rw:读写
  • 作用
    • 快速定位数据,支持并发读写
    • 方便的获取二进制文件。
Constructor

在这里插入图片描述

read()

在这里插入图片描述

  • 同时支持readInt…
write()

在这里插入图片描述

readUTF()

在这里插入图片描述

seek()

在这里插入图片描述

    public static void write() throws IOException {
        //1.创建随机读写文件类
        RandomAccessFile raf = new RandomAccessFile("d:\\desktop\\demo.txt", "rw");
        //2.写
        raf.writeUTF("你好");
        raf.writeInt(102);
        raf.writeBoolean(true);
        raf.writeDouble(120);

        raf.writeUTF("buhao");
        raf.writeInt(102);
        raf.writeBoolean(true);
        raf.writeDouble(120);

        raf.close();
    }

    public static void read() throws IOException {
        //1.创建随机读写文件类
        RandomAccessFile raf = new RandomAccessFile("d:\\desktop\\demo.txt", "r");
        //2.读写
        //跳过
        //seek()从开头位置0,设置文件指针的偏移量
//        raf.seek(24);
//        raf.skipBytes();
        System.out.println(raf.readUTF());
        System.out.println(raf.readInt());
        System.out.println(raf.readBoolean());
        System.out.println(raf.readDouble());
        raf.close();
    }
Properties集合
  • Properties:属性集合。
  • 特点:
    • 存储属性名和属性值。
    • 属性名和属性值都是字符串类型。
    • 没有泛型。
    • 和流有关。
setProperty()

在这里插入图片描述

getProperty

在这里插入图片描述

list()

在这里插入图片描述

store()

在这里插入图片描述

load()

在这里插入图片描述

        //Properties和流相关的方法
        //创建集合
        Properties prop = new Properties();
        //添加元素
        prop.setProperty("username", "password");
        prop.setProperty("zhangsan", "password");
        prop.setProperty("lisi", "password");
        //3.1list 遍历
//        prop.list(System.out);
        PrintWriter writer = new PrintWriter("d:\\desktop\\demo.properties");
        prop.list(writer);
        writer.close();
        //3.2store
//        FileWriter f =new FileWriter("d:\\desktop\\demo.txt");
//        FileOutputStream f =new FileOutputStream("d:\\desktop\\demo.txt");
//        prop.store(f, "用户信息");
//
        //4.读取  load加载文件
        Properties prop2 = new Properties();
//        FileReader fileReader = new FileReader("d:\\desktop\\demo.txt");
        FileInputStream fileReader = new FileInputStream("d:\\desktop\\demo.txt");
        prop2.load(fileReader);
        fileReader.close();
        prop2.list(System.out);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值