Java的I/O框架

news2025/2/1 15:35:55

目录

一、流的概念

二、流的分类

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());
    }
}

 



重在理解!

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++基础(自用)

C基础入门 1 C初识 1.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1.1.1 创建项目 ​ Visual Studio是我们用来编写C程序的主要工具&#xff0c;我们先将它打开 1.1.2 创建文件 右键源文件&#xff0c;选择添加->新建项 给C文件起…

Windows8系统下DOSBox编译、链接、执行汇编语言步骤

下载安装好DOSBox后&#xff0c;同时下载debug、link、masm程序。 &#xff08;1&#xff09;建立工作目录&#xff0c;编写汇编语言源文件&#xff0c;并将debug、link、masm程序放在同一目录下。&#xff08;下图中ass.asm是汇编语言源文件&#xff09; &#xff08;2&#x…

2022年第四届大数据与计算国际研讨会(WBDC 2022)

2022年第四届大数据与计算国际研讨会&#xff08;WBDC 2022&#xff09; 重要信息 会议网址&#xff1a;www.iwbdc.org 会议时间&#xff1a;2022年12月16-18日 召开地点&#xff1a;中国北京 截稿时间&#xff1a;2022年10月31日 录用通知&#xff1a;投稿后2周内 收录检…

MPI 快速入门

浅学 MPI。 MPI 分布式内存多处理器&#xff1a; 处理器 辅助组件 > 节点一堆节点 > 高性能计算系统 节点 > 进程 节点之间&#xff1a;消息传递 MPI&#xff1a;消息传递接口 安装 还是用 Docker 方便。 宿主机&#xff1a; sudo docker run -idt --name op…

移动WEB开发之流式布局--移动WEB开发之flex布局--携程网首页案例制作

案例&#xff1a;携程网移动端首页 访问地址&#xff1a;携程旅行-酒店预订,机票预订查询,旅游度假,商旅管理-携程无线官网 (ctrip.com) 1. 技术选型 方案&#xff1a;我们采取单独制作移动页面方案 技术&#xff1a;布局采取flex布局 2. 搭建相关文件夹结构 3. 设置视口标…

三、【react-redux】数据共享

文章目录1、优化项目结构2、添加一个新容器组件2.1、新项目结构2.2、CODE2.2.1、reduc/constant.js2.2.2、redux/actions/person.js2.2.3、redux/reducers/person.js2.2.4、redux/store.js2.2.5、Count.jsx2.2.6、Person.jsx2.3、Result3、总结本示例修改自 上一章 求和Demo 1、…

SVN版本控制软件

尚硅谷SVN版本控制软件教程&#xff08;一套掌握svn操作&#xff09; 学习网址&#xff1a;https://www.bilibili.com/video/BV1mW411M7yR/?spm_id_from333.999.0.0&vd_source461545ff50a35eaeaa8218ecdc5f7152 学习时长&#xff1a;1小时46分钟 未学习 5.启动服务器 6.…

维视智造明星产品推荐(一) 环外侧工业镜头

维视智造明星产品推荐&#xff08;一&#xff09;环外侧工业镜头 市场洞察 产品外观质量检测及标签检测&#xff0c;是工业制造中常见的两个质检场景。根据产品特点及产线环境&#xff0c;往往可以做多种检测方案的选择。在圆柱状产品如药瓶、瓶盖、齿轮、螺母等的生产检测中&a…

11.30排序

目录 一.排序 1.概念 1.1排序 1.2稳定性 2.七大基于比较的排序 二.插入排序 3.1 直接插入排序-原理 2.折半插入排序 3.分析 二.每日一题订正 1.选择题 2.不要二 三.希尔排序 1 原理 2.代码实现 3.分析 四.选择排序 1.原理 2.代码 3.优化版 4.分析 五.测量…

使用Cpolar内网穿透开启群晖WebDAV

文章目录1.前言2.群晖组件安装2.1.软件安装&#xff08;1&#xff09;WebDav server套件下载安装&#xff08;2&#xff09;cpolar套件下载安装&#xff08;3&#xff09;RaiDrive的下载安装2.2.群晖NAS端软件的设置2.3.Cpolar云端设置2.4.Cpolar本地设置3.访问端软件设置4.公网…

Pytorch的入门操作(三)

2.7 使用Pytorch实现手写数字识别 2.7.1 目标 知道如何使用Pytorch完成神经网络的构建知道Pytorch中激活函数的使用方法知道Pytorch中torchvision.transforms 中常见图形处理函数的使用知道如何训练模型和如何评估模型 2.7.2 思路和流程分析 流程: 准备数据&#xff0c;这…

推荐系统-召回-概述(五):一切为了业务

在前面几篇文章里&#xff0c;我们介绍了主流的召回模型和算法。但算法更多地是从个性化推荐的角度来解决问题。许多业务上的问题&#xff0c;如安全问题、商业价值、用户体验、流量扶持等种种业务需求&#xff0c;仅仅基于模型&#xff0c;是无法得到完美解决的&#xff0c;它…

成长的旅途,未知的邂逅

成长的旅途&#xff0c;未知的邂逅兰舟千帆纷繁复杂&#xff0c;斑驳陆离的岁月邂逅&#xff1f;出发&#xff01;兰舟千帆 我是兰舟千帆&#xff0c;从2020年加入csdn写博客到现在差不多就是两年了。马上也就三年了。这样的时间段&#xff0c;也同样记录着我的成长。哎嘿。我现…

构建基于 Ingress 的全链路灰度能力

作者&#xff1a;涂鸦 背景 随着云原生技术不断普及&#xff0c;越来越多的业务应用开始向云原生架构转变&#xff0c;借助容器管理平台 Kubernetes 的不可变基础设施、弹性扩缩容和高扩展性&#xff0c;助力业务迅速完成数字化转型。其中&#xff0c;集群入口流量管理方式在…

清朝盛衰的六个时间点!

清朝盛衰的整个过程经历了六个时间节点&#xff1a; 一六六一年﹙顺治十八年﹚是第一个时间节点。 正月初六夜半时分&#xff0c;顺治帝预感生命垂危&#xff0c;急命太监传呼麻勒吉与王熙两人赶赴养心殿。帝对王熙说&#xff1a;“朕出痘&#xff0c;势将不起&#xff0c;尔…

[附源码]Python计算机毕业设计Django高校流浪动物领养网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

PCB信号仿真之为什么DDR走线要同组同层?

作者&#xff1a;一博科技高速先生成员 刘春 随着信号速率的不断提高&#xff0c;对信号时序的要求也越来越严格。在PCB设计中&#xff0c;我们等长的最终目的都是为了等时&#xff0c;以满足信号的时序要求。因此&#xff0c;需要我们对信号在传输线上的时延有一定的了解&…

python之文件操作相关知识

python之文件操作相关知识 一、文件的打开与关闭 1、打开文件 在Python中&#xff0c;使用 open() 函数&#xff0c;可以打开一个已经存在的文件&#xff0c;或创建一个新文件 语法如下&#xff1a; open(文件名, 访问模式) 说明&#xff1a; 访问模式决定了打开文件的模式&…

【自然语言处理(NLP)】基于SQuAD的机器阅读理解

【自然语言处理&#xff08;NLP&#xff09;】基于SQuAD的机器阅读理解 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全国高等学…

vue3和vue2组件风格对比

Vue3 组合式 API&#xff08;Composition API&#xff09; 主要用于在大型组件中提高代码逻辑的可复用性。 传统的组件随着业务复杂度越来越高&#xff0c;代码量会不断的加大&#xff0c;整个代码逻辑都不易阅读和理解。 Vue3 使用组合式 API 的地方为 setup。 在 setup 中…