当前位置: 首页 > news >正文

Java的I/O框架

目录

一、流的概念

二、流的分类

1.按方向

2.按单位:

3.按功能:

三、字节流

1、文件字节流

(1) FileInputStream:

(2)FileOutputStream:

(3)完成复制文件

 2、字节缓冲流

(1)BufferedInputStream:

(2)BufferedOutputStream:

3、对象流

(1)序列化:

(2)反序列化:

四、字符编码

五、字符流

 1. 文件字符流

(1)FileReader

(2)FileWriter

 (3)完成复制文件

2.字符缓冲流

(1)BufferedReader

(2)BufferedWriter

3.打印流 ——PrintWriter

六、转换流

1. InputStreamReader

2.OutputStreamWriter

七、File类

1.分隔符

2.文件操作

3.文件夹操作

4. FileFilter 接口

 

5.递归遍历和递归删除

附加:Properties(属性集合)

1.特点:

2.使用


一、流的概念

概念:内存与存储设备之间传输数据的通道。

数据借助流传输。

二、流的分类

1.按方向

输入流(Input):将<存储设备>中的内容读入到<内存>中。

输出流(Output):将<内存>中的内容写入到<存储设备>中。

 

2.按单位:

字节流:以字节为单位,可以读写所有的数据。

字符流:以字符为单位,可以读写文本数据。

3.按功能:

节点流:具有实际传输数据的读写功能。

过滤流:在节点流的基础之上增强功能。

三、字节流

字节流的父类(抽象类)

InputStream:字节输入流

OutputStream:字节输出流

1、文件字节流

(1) FileInputStream:

public int read(byte[] b)

从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数,如果达到文件的尾部,则返回-1。

 

(2)FileOutputStream:

public void write(byte[] b)

一次写多个字节,将b数组中所有字节,写入输出流。

 

(3)完成复制文件

使用文件字节流实现文件的复制,先读取(FileInoutStream)再写入(FileOutputStream)。

 2、字节缓冲流

缓冲流:BufferedInputStream / BufferedOutputStream

(1)提高IO效率,减少访问磁盘的次数;

(2)数据存储在缓冲区中,flush是将缓冲区的内容写入文件中。

(1)BufferedInputStream:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
/**
 * 使用字节缓冲流读取
 * BufferedInputStream
 */
public class Demo04 {
    public static void main(String[] args)throws Exception {
        //1.创建BufferedInputStream
        FileInputStream file = new FileInputStream("d:\\aaa.txt");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(file);
        //2.读取
        //方法一:
//        int data = 0;
//        while((data=bufferedInputStream.read())!=-1){
//            System.out.println((char) data);
//        }
        //方法二:
        byte[] buf = new byte[1024];
        int count = 0;
        while((count=bufferedInputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,count));
        }
        //3.关闭
        bufferedInputStream.close();
    }
}

(2)BufferedOutputStream

 

3、对象流

对象流:ObjectOutputStream / ObjectInputStream

(1)增强了缓冲区功能

(2)增强了读写8种基本数据类型和字符串功能

(3)增强了读写对象的功能:

readObject()    从流中读取一个对象

writeObiect(Object obj)    向流中写入一个对象

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

(1)序列化:

(2)反序列化:

 

注意事项:

1. 序列化类必须实现Serializable接口;

2. 序列化类中的对象属性也要实现Serializable接口;

3. 写序列化版本号ID,可以保证序列化和反序列化的类是同一个类;

 4. 使用 transient(瞬间的) 修饰属性,这个属性不能序列化;

5. 静态属性也不能序列化;

6. 序列化多个对象,放在同个集合里,一次序列化 / 反序列化。

 

四、字符编码

ISO-8859-1    收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。

UTF-8        针对Unicode码表的可变长度字符编码。

GB2312     简体中文

GBK           简体中文、扩充

BIG5          台湾,繁体中文

当编码方式和解码方式不一致时,就会出现乱码。

五、字符流

字符流的父类(抽象类)

Reader:字符输入流

 

Writer:字符输出流

 1. 文件字符流

(1)FileReader

从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数,如果达到文件的尾部,则返回-1。

pubic  int read (char[] c)

 

(2)FileWriter

一次写多个字符,将b数组中所有字符,写入输出流。

public void write(String str)

 (3)完成复制文件

2.字符缓冲流

 缓冲流:BufferedReader / BufferedWriter

高效书写

支持输入换行符

可一次写一行、读一行。

(1)BufferedReader

import java.io.BufferedReader;
import java.io.FileReader;

/**
 * 使用字符缓冲流读取文件
 */
public class Demo4 {
    public static void main(String[] args) throws Exception{
        //1.创建缓冲流
        FileReader fileReader = new FileReader("d:\\bbb.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        //2.读取
        //2.1方法一:整个读取
//        char[] buf = new char[1024];
//        int count = 0;
//        while((count=bufferedReader.read(buf))!=-1){
//            System.out.println(new String(buf,0,count));
//        }
        //2.2方法二:一行一行的读取
        String line= null;
        while((line=bufferedReader.readLine())!=null){
            System.out.println(line);
        }
        //3.关闭
        bufferedReader.close();
    }
}

(2)BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;

/**
 * BufferedWriter的使用
 */
public class Demo5 {
    public static void main(String[] args)throws Exception {
        //1.创建BufferedWriter对象
        FileWriter fileWriter = new FileWriter("d:\\bbb.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        //2.写入
        for (int i = 0; i < 10; i++) {
            bufferedWriter.write("好好学习java\n");
            bufferedWriter.newLine();  //写入一个换行符,相当于\n
            bufferedWriter.flush();
        }
        //3.关闭
        bufferedWriter.close();
        System.out.println("执行完毕");
    }
}

3.打印流 ——PrintWriter

封装了print() / println()方法,支持写入后换行。

支持数据原样打印。

import java.io.PrintWriter;
/**
 * PrintWriter的使用
 */
public class Demo6 {
    public static void main(String[] args) throws  Exception{
        //1.创建打印流
        PrintWriter printWriter = new PrintWriter("d:\\print.txt");
        //2.打印
        printWriter.println(97);
        printWriter.println(true);
        printWriter.println('2');
        printWriter.println('a');
        printWriter.println(3.13);
        //3.关闭
        printWriter.close();
        System.out.println("执行完");
    }
}

六、转换流

桥转换流:InputStreamReader / OutputStreamWriter

可将字节流转换为字符流。

可设置字符的编码方式。

1. InputStreamReader

2.OutputStreamWriter

 

七、File类

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

 

1.分隔符

 

2.文件操作

public class Demo10 {
    public static void main(String[] args) throws IOException, InterruptedException {
        fileOpe();
    }
    public static void fileOpe() throws IOException, InterruptedException {
        //1.创建文件
        File file = new File("d:\\file.txt");
        if (!file.exists()){
            boolean b = file.createNewFile();
            System.out.println("创建结果:"+b);
        }

        //2.删除文件
        //2.1直接删除
        System.out.println("删除结果:"+file.delete());

        //2.2使用jvm退出时删除
        file.deleteOnExit();
        Thread.sleep(5000);  //休眠结束,就删除

        //3.获取文件信息
        System.out.println("获取文件的绝对路径:"+ file.getAbsolutePath());
        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());

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

3.文件夹操作

public class Demo10 {
    public static void main(String[] args) throws IOException, InterruptedException {
        directoryOpe();
    }
    public static void directoryOpe() throws IOException, InterruptedException {
        //1.创建文件夹
        File dir = new File("d:\\aa\\bb\\cc");
        if (!dir.exists()){
            dir.mkdir();  //只能创建单级目录
            dir.mkdirs();  //创建多级目录
        }

        //2.删除文件夹
        //2.1直接删除   只能删除空目录
        System.out.println("删除结果:"+dir.delete());  //只删除最后一个,并且是空目录

        //2.2使用jvm退出时删除
        dir.deleteOnExit();
        Thread.sleep(5000);  //休眠结束,就删除

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

        //4.判断
        System.out.println("是否是文夹件:"+dir.isFile());
        System.out.println("是否隐藏:"+dir.isHidden());

        //5.遍历文件夹
        File file = new File("d:\\aa");
        String[] list = file.list();
        for (String string : list){
            System.out.println(string);
        }
    }
}

4. FileFilter 接口

public interface FileFilter
    boolean accept (File pathname)

当调用File类中的ListFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才能出现在listFiles()的返回值中。

 

5.递归遍历和递归删除

public class Demo11 {
    public static void main(String[] args) {
        listDir(new File("c:\\MyJavaStudy"));
        deleteDir(new File("c:\\MyJavaStudy"));
    }
    //递归遍历文件夹
    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();
        System.out.println(dir.getAbsolutePath());
        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());
    }
}

附加:Properties(属性集合)

1.特点:

1. 存储属性名和属性值

2.属性名和属性值都是字符串类型

3.没有泛型

4.和流有关

2.使用

public class Demo08 {
    public static void main(String[] args) throws IOException {
        //1.创建集合
        Properties properties = new Properties();
        //2.添加元素
        properties.setProperty("username","zhangsan");
        properties.setProperty("age","20");
        System.out.println(properties.toString());
        //3.遍历
        //3.1   keySet
        //3.2   entrySet
        //3.3   StringPropertyNames()方法
        Set<String> strings = properties.stringPropertyNames();
        for (String pro : strings){
            System.out.println(pro+"----"+properties.getProperty(pro));
        }
        //4.和流有关的方法
        // 4.1 list方法     打印列表
        PrintWriter pw = new PrintWriter("d:\\print.txt");
        properties.list(pw);
        pw.close();
        //4.2 store方法     保存
        FileOutputStream fileOutputStream = new FileOutputStream("d:\\store.properties");
        properties.store(fileOutputStream,"注释");
        fileOutputStream.close();
        //4.3  load方法     加载
        Properties properties1 = new Properties();
        FileInputStream fileInputStream = new FileInputStream("d:\\store.properties");
        properties1.load(fileInputStream);
        fileInputStream.close();
        System.out.println(properties1.toString());
    }
}

 



重在理解!

感谢ლ(°◕‵ƹ′◕ლ)!!!

 

相关文章:

  • 电力移动应用及终端安全溯源管控技术研究与实践
  • 【数据结构】二叉树详解(下篇)
  • Linux内存管理(二十五):slub 分配器之kmem_cache_destroy
  • vue - vue使用echarts实现中国地图和点击省份进行查看
  • 【每日一题Day43】最大频率栈 | 哈希表+大顶堆 哈希表+栈
  • 易基因|DNA甲基化揭示应激反应影响婴儿免疫相关基因的表观遗传调控机制 | 表观发育
  • 【实习之velocity】
  • 对话框被遮罩层挡住
  • POSIX线程(一)
  • 玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载
  • 几种常用XML文档解析方案的使用操作
  • C#里TcpListener的阻塞式服务器
  • 【英语语法】 yet
  • leecode#用Read4读取n个字符#相交链表
  • 《InnoDB引擎六》InnoDB 1.0.x版本之前的Master Thread
  • hiveSql冷门但好用函数 --持续更新
  • linux不显示当前路径的解决方法
  • 前端面试题记录
  • 打造一个投资组合管理的金融强化学习环境
  • 【Linux网络配置实战】服务器Network静态路由配置
  • Tensorflow的一个简单实例,线性回归
  • 尝试一晚上终于得到了enjoy-Ubuntu中安装VMware Tools
  • 树莓派安装scipy
  • 神经网络实现非线性回归
  • pip 引用国内源
  • MNIST数据集简单版本
  • C语言枚举类型
  • MNIST复杂版本
  • STM32GPIO的8种工作模式、以及芯片命名规则
  • Tensorboard网络结构