IO集合框架和File类的使用

I/O 框架

流的概念

定义:内存与存储设备之间传输数据的通道

流的分类

1、按方向【重点】

  • 输入流:将<存储设备>中的内容读到<内存>中
  • 输出流:将<内存>中的内容写到<存储设备>中

2、按单位

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

3、按功能

  • 节点流:具有实际传输数据的读写功能
  • 过滤流:在节点流的基础之上增强功能

字节流的父类(抽象类)

//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 len){}

文件字节流

FlieInputStream

public class Demo01 {
    public static void main(String[] args) throws Exception{

        //创建文件字节输入流 FileInputStream(文件的路径)
        FileInputStream fis = new FileInputStream("/Users/duandonghua/Desktop/IO.rtf");
        //读取文件
        int date =0;
        while ((date=fis.read())!=-1){
            System.out.print((char) date);
        }
        System.out.println("");
        System.out.println("==============");

        byte[] buf = new byte[1024];
        int counts = 0;
        while ((counts=fis.read(buf))!=-1){
            System.out.println(new String(buf,0,counts));
        }
        //关闭io
        fis.close();
    }
}

FlieOutputStream

import java.io.FileOutputStream;

public class Demo02 {
    public static void main(String[] args) throws Exception{
        //FlieOutputStream 文件字节输出流
        //创建文件字节输出流
        FileOutputStream fos = new FileOutputStream("/Users/duandonghua/Desktop/IO.rtf");
        //写入文件
        fos.write(97);
        fos.write('a');
        fos.write('b');
        //关闭io
        fos.close();
    }
}

习题

使用文件字节流复制文件

public class Demo04 {
    //使用字节缓冲流写入文件
    public static void main(String[] args) throws Exception{
        //创建字节输出缓冲流
        FileOutputStream fos = new FileOutputStream("/Users/duandonghua/Desktop/fos.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //写入文件
        for (int i = 0; i < 10; i++) {
            bos.write("hello word\r\n".getBytes());
            bos.flush();
        }
        //关闭
        bos.close();

    }
}

字节缓冲流

缓冲流:BufferedInputStream/ BufferedOutputStream

  • 提高IO效率,减少访问磁盘次数
  • 数据存储在缓冲区中,flush是将缓冲区的内容写入文件中,也可以直接close
public class Demo05 {
    public static void main(String[] args) throws Exception{
        //使用字节缓冲流复制文件
        //创建文件字节流和字节缓冲流
        FileInputStream fis = new FileInputStream("/Users/duandonghua/Desktop/jxj.pdf");
        BufferedInputStream bis = new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("/Users/duandonghua/Desktop/jxj2.pdf");
        BufferedOutputStream bos = new BufferedOutputStream(fos) ;
        //实现复制
        int count =0;
        while ((count=bis.read())!=-1){
            bos.write(count);
            bos.flush();
        }
        //关闭io
        bis.close();
        bos.close();
    }

}

对象流

ObjectOutputStream / ObjectInputStream

  • 增强了缓冲区功能

  • 增强了读写8种基本数据类型和字符串的功能

  • 增强了读写对象的功能

    • readObject() 从流中读取一个对象
    • writeObject(Object obj) 向流中写入一个对象
    public class Demo06 {
        public static void main(String[] args) throws Exception{
            //使用obiectoutputStream 实现学生类的序列化
            //创建对象流
            FileOutputStream fos =new FileOutputStream("/Users/duandonghua/Desktop/stu.bin");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
    
            //实现序列化
            Student zhanghua =new Student("张三",18);
            Student lisi =new Student("李四",22);
            ArrayList<Student> list =new ArrayList<>();
            list.add(zhanghua);
            list.add(lisi);
            oos.writeObject(list);
    
    
            //关闭
            oos.close();
            System.out.println("序列化完毕");
        }
    }
    
    //使用ObjectInputStream实现反序列化 读取重构对象
    public class Demo07 {
        public static void main(String[] args) throws Exception{
            //创建对象流
            FileInputStream fis = new FileInputStream("/Users/duandonghua/Desktop/stu.bin");
            ObjectInputStream ois = new ObjectInputStream(fis);
    
            //读取文件
            //Student a=(Student) ois.readObject();
            //Student b=(Student) ois.readObject();
            ArrayList<Student> list =(ArrayList<Student>) ois.readObject();
    
            //关闭
            ois.close();
            System.out.println("反序列化完毕");
            //System.out.println(a.toString());
            //System.out.println(b.toString());
            System.out.println(list.toString());
        }
    }
    

序列化

使用流传输对象的过程称为序列化、反序列化

注意点:

  1. 某个类要想序列化必须实现Serializable接口
  2. 序列化类中对象属性要求实现Serializable接口
  3. 序列化版本号ID,保证序列化的类和反序列化的类是同一个类
  4. 使用transient修饰属性,这个属性就不能序列化
  5. 静态属性不能序列化
  6. 序列化多个对象,可以借助集合来实现
//使用ObjectInputStream实现反序列化 读取重构对象
public class Demo07 {
    public static void main(String[] args) throws Exception{
        //创建对象流
        FileInputStream fis = new FileInputStream("/Users/duandonghua/Desktop/stu.bin");
        ObjectInputStream ois = new ObjectInputStream(fis);

        //读取文件
        //Student a=(Student) ois.readObject();
        //Student b=(Student) ois.readObject();
        ArrayList<Student> list =(ArrayList<Student>) ois.readObject();

        //关闭
        ois.close();
        System.out.println("反序列化完毕");
        //System.out.println(a.toString());
        //System.out.println(b.toString());
        System.out.println(list.toString());
    }
}

编码方式

UTF-8:针对Unicode的编码的可变长字符编码

GBK:简体中文,扩充

字符流

字符流的父类(抽象类)

reader 字符输入流

  • public int read(){}
  • public int read(char[] c){}
  • public int read(char[] b, int off, int len){}

Writer 字符输出流

  • public void write(int n){}
  • public void write(String str){}
  • public void write(char[] c){}

文件字符流

FileRead/FileWrite

//使用文件字符流复制文件,只能复制文本文件,其他的都不可以
public class Demo09 {
    public static void main(String[] args) throws Exception {
        //利用文件字符流FlieReader读取文件内容
        //创建文件字符流
        FileReader fr = new FileReader("/Users/duandonghua/Desktop/fos.txt");
        //读取方法1
        //int date = 0;
        //while ((date=fr.read())!=-1){
            //System.out.print((char) date);
        //}
        //读取方法2
        char[] buf =new char[1024];
        int count = 0;
        while ((count=fr.read(buf))!=-1){
            System.out.println(new String(buf,0,count));
        }

        System.out.println("读取完毕开始写入");
        //利用文件字符流FlieWrite写入文件内容
        //创建文件字符流
        FileWriter fw =new FileWriter("/Users/duandonghua/Desktop/fzfos.txt");
        //写入数据
        int counts = 0;
        while ((counts=fr.read())!=-1){
            fw.write(counts);
            fw.flush();
        }
        //关闭
        fw.close();
        fr.close();
        System.out.println("写入完毕");
    }
}

字符流进行文本文件复制

不能复制图片或二进制文件,使用字节流可以复制任意文件

//利用文件字符流复制文件,只能复制文本文件,其他文件复制不了
public class Demo10 {
    public static void main(String[] args) throws Exception{
        FileReader fr = new FileReader("/Users/duandonghua/Desktop/fos.txt");
        FileWriter fw =new FileWriter("/Users/duandonghua/Desktop/fzfos.txt");
        int counts = 0;
        while ((counts=fr.read())!=-1){
            fw.write(counts);
            fw.flush();
        }
        fr.close();
        fw.close();
    }
}

字符缓冲流

BufferedReader / BufferedWriter

高效读写、支持输入换行符、可一次写一行读一行

/*
使用字符缓冲流高效的复制文件
 */
public class Demo11 {
    public static void main(String[] args) throws Exception {
        //创建文件字符流
        FileReader fr=new FileReader("/Users/duandonghua/Desktop/fos.txt");
        FileWriter fw=new FileWriter("/Users/duandonghua/Desktop/fos2.txt");

        //创建字符缓冲流
        BufferedReader br = new BufferedReader(fr);
        BufferedWriter bw = new BufferedWriter(fw);

        //实现复制功能
        int date = 0;
        while ((date=fr.read())!=-1){
            fw.write(date);
            fw.flush();
        }

        //关闭
        br.close();
        fw.close();
    }
}

打印流

PrintWriter封装了print() / println() 方法

支持写入后换行

支持数据原样打印

public class Demo14 {
    public static void main(String[] args) throws Exception{
        //创建打印流
        PrintWriter pw = new PrintWriter("/Users/duandonghua/Desktop/print.txt");
        //打印
        pw.println(97);
        pw.println(true);
        pw.println(3.14);
        pw.println('a');
        //关闭
        pw.close();
        System.out.println("打印完成");
    }
}

转换流

桥转换流 InputStreamReader / OutputStreamWriter

可将字节流转换为字符流

可设置字符的编码方式

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//使用OutputStreamWriter写入文件,并且指定编码
public class Demo15 {
    public static void main(String[] args) throws Exception{
        //创建OutputStreamWriter
        FileOutputStream fis =new FileOutputStream("/Users/duandonghua/Desktop/osw.txt");
        OutputStreamWriter isr = new OutputStreamWriter(fis,"gbk");
        //写入
        for (int i = 0; i < 10; i++) {
            isr.write("我是中弱的\n");
            isr.flush();
        }
        //关闭
        isr.close();
        System.out.println("写入完成");
    }
}

File类

概念:代表物理盘符中的一个文件或者文件夹

import java.io.File;
import java.util.Date;

public class Demo01 {
    public static void main(String[] args) throws Exception{
        separator();
        fileope();
    }
    //分隔符
    public static void separator(){
        System.out.println("路径分隔符"+ File.pathSeparator);
        System.out.println("名称分隔符"+File.separator);
    }

    //文件操作
    public static void fileope() throws Exception{
        //创建文件
        File file = new File("/Users/duandonghua/Desktop/file.txt");
        if (!file.exists()){
            boolean b=file.createNewFile();
            System.out.println("文件创建结果"+b);
        }

        //删除文件
        //1.1直接删除
        //System.out.println("删除结果"+file.delete());
        //1.2使用JVM退出时删除
        //file.deleteOnExit();
        //Thread.sleep(5000);

        //获取文件信息
        System.out.println("文件绝对路径:"+file.getAbsoluteFile());
        System.out.println("获取路径:"+file.getPath());
        System.out.println("文件名称:"+file.getName());
        System.out.println("父目录:"+file.getParent());
        System.out.println("文件长度:"+file.length());
        System.out.println("文件创建时间:"+new Date(file.lastModified()).toLocaleString());

        //判断
        System.out.println("是否可写"+file.canWrite());
        System.out.println("是否是文件"+file.isFile());
        System.out.println("是否隐藏"+file.isHidden());
    }
}
/**
 * 案例:
 * 1、递归遍历文件夹
 * 2、递归删除文件夹
 */
public class FileCase {
    public static void main(String[] args) throws Exception {
            listDir(new File("F:\\idea\\temp"));
            deleteDir(new File("F:\\idea\\temp\\file"));
        }

        public static void listDir(File dir) {
            File[] files = dir.listFiles();  //把文件夹或者文件存入数组
            System.out.println(dir.getAbsolutePath());
            if (files != null && files.length > 0) {
                for (File file : files) {
                    if (file.isDirectory()) { //如果是文件夹
                        listDir(file); // 递归
                    } else {
                        System.out.println(file.getAbsolutePath());
                    }
                }
            }
        }
    public static void deleteDir(File dir){
        File[] files = dir.listFiles();
        if(files != null && files.length > 0){
            for(File file : files){
                if(file.isDirectory()){
                    deleteDir(file); // 递归
                }else{
                    // 删除文件
                    System.out.println(file.getAbsolutePath() + "删除结果为:" + file.delete());
                }
            }
        }
        System.out.println(dir.getAbsolutePath() + "删除结果为:" + dir.delete());
    }
}
import java.io.File;
import java.io.FileFilter;
import java.util.Date;

public class Demo02 {
    public static void main(String[] args) {

    }

    public static void separator() {
        System.out.println("路径分隔符" + File.pathSeparator);
        System.out.println("名称分隔符" + File.separator);
    }

    //文件操作
    public static void fileope() throws Exception {
        //创建文件夹
        File dir = new File("/Users/duandonghua/Desktop/file");
        if (!dir.exists()) {
            //boolean b=dir.mkdir();  //创建单级目录
            boolean b = dir.mkdirs();    //创建多级目录
            System.out.println("文件夹创建结果" + b);
        }

        //删除文件夹
        //1.1直接删除
        //System.out.println("删除结果"+dir.delete());  //删除必须是空目录
        //1.2使用JVM退出时删除
        //dir.deleteOnExit();
        //Thread.sleep(5000);

        //获取文件夹信息
        System.out.println("文件夹绝对路径:" + dir.getAbsoluteFile());
        System.out.println("获取路径:" + dir.getPath());
        System.out.println("文件夹名称:" + dir.getName());
        System.out.println("父目录:" + dir.getParent());
        System.out.println("文件夹创建时间:" + new Date(dir.lastModified()).toLocaleString());

        //判断
        System.out.println("是否可写" + dir.canWrite());
        System.out.println("是否是文件" + dir.isFile());
        System.out.println("是否隐藏" + dir.isHidden());

        //遍历文件夹
        String[] a=dir.list();
        for (String string:a) {
            System.out.println(string);
        }
        //FileFilter接口的使用
       // dir.listFiles(new FileFilter() {
            //@Override
          //  public boolean accept(File pathname) {
          //      if (pathname.getName().endsWith(".jpg")){
           //     return true;
          //  }
         //       return false;
       // });

    }
}

Properties

1、Properties特点

  1. 属性集合
  2. 存储属性名和属性值
  3. 没有泛型
  4. 和流有关
public class Properties01 {
    public static void main(String[] args) throws Exception{
        //1、创建集合
        Properties properties = new Properties();
        //2、添加数据
        properties.setProperty("username","zhangsan");
        properties.setProperty("age","20");
        System.out.println(properties.toString());
        //3、遍历
        /*
        1、keySet
        2、entrySet
        3、stringpropertyNames
         */
        Set<String> pname = properties.stringPropertyNames();
        for (String s : pname) {
            System.out.println(s+"==="+ properties.getProperty(s));
        }
        //4、和流相关的用法
        // 1、list方法
//        PrintWriter pw = new PrintWriter("F:\\idea\\temp\\aaa.txt");
//        properties.list(pw);
//        pw.close();
        //2、store保存
//        FileOutputStream fos = new FileOutputStream("F:\\idea\\temp\\aaa.properties");
//        properties.store(fos,"注释");
//        fos.close();
        //3、load加载方法
        Properties properties1 = new Properties();
        FileInputStream fis = new FileInputStream("F:\\idea\\temp\\aaa.properties");
        properties1.load(fis);
        fis.close();
        System.out.println(properties1.toString());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值