IO流进阶

news2024/11/23 11:21:34

🏡个人主页 :@ 守夜人st
🚀系列专栏:Java
…持续更新中敬请关注…
🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点

目录

  • IO流进阶
    • 缓冲流
      • 缓冲流概述
      • 字节缓冲流(BufferedInputStream字节缓冲输入流、BufferedOutputStream字节缓冲输出流)
      • 字符缓冲流(BufferedReader字符缓冲输入流、BufferedWriter字符缓冲输出流)
    • 转换流
    • 序列化对象
      • 对象序列化:
      • 对象反序列化
    • 打印流
      • PrintStream
      • PrintWriter
      • PrintStream 与 PrintWriter的区别
    • Properties
    • IO框架
    • 总结

IO流进阶

缓冲流

缓冲流概述

  • 缓冲流也称为高效流、或者高级流。在上一篇博客里我们学习的字节流可以称为原始流。
  • 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能。

字节缓冲流(BufferedInputStream字节缓冲输入流、BufferedOutputStream字节缓冲输出流)

  • 字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。
  • 字节缓冲输出流同样自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能提高了。
构造器说明
public BufferedInputStream(InputStream is)可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道
public BufferedOutputStream(OutputStream os)可以把低级的字节输出流包装成一个高级的缓冲字节输入流管道
package com.shouyeren.oop.api.byte_stream;

import java.io.*;

/**
 * 目标:实现文件的拷贝(支持一切文件类型)
 */
public class ByteBufferDemo01 {
    public static void main(String[] args) {
        try {
            //1.创建一个字节输入流管道与源文件接通
            InputStream is = new FileInputStream("C:\\Users\\shouyeren\\Desktop\\20221227_114837.m4a");
            //包装
            InputStream bis = new BufferedInputStream(is);

            //2.创建一个字节输出流管道与源文件接通
            OutputStream os = new FileOutputStream("src/new.m4a");
            //包装
            OutputStream bos = new BufferedOutputStream(os);

            //3.定义一个字节数组转移数据
            byte[] buffer = new byte[1024];
            int len; //记录每次读取的字节数
            while ((len = bis.read(buffer)) != -1){
                bos.write(buffer,0,len);
            }
            System.out.println("文件拷贝完成!");

            //4.关闭流
            os.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

字节缓冲流与原始字节流的不同点就在于她自带了一个8KB的缓冲池,可以提高数据的读写速度,至于功能方面没有太多变化

字符缓冲流(BufferedReader字符缓冲输入流、BufferedWriter字符缓冲输出流)

字符缓冲输入流:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能

构造器说明
public BufferedReader(Reader r)可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道

字符缓冲输入流新增功能

方法说明
public String readLine()读取一行数据返回,如果读取没有完毕,无行可读返回null
package com.shouyeren.oop.api.byte_stream;

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

public class BufferedReaderDemo01 {
    public static void main(String[] args) {
        try(
                Reader fr =new FileReader("src/data.txt");
                BufferedReader br = new BufferedReader(fr);
        ) {
                String line;
                while ((line = br.readLine()) != null){
                    System.out.println(line);
                }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

字符缓冲输出流:提高字符输出流写数据的性能,除此之外多了换行功能

构造器说明
public BufferedWriter(Writer w)可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道

字符缓冲输出流新增功能

方法说明
public void newLine()换行操作

转换流

引出:如果代码编码和文件编码不一致会出现中文乱码,而转换流可以把原始的字节流按照指定编码转换成字符输入流,就可以避免因为编码不同而引起的乱码问题

字符输入转换流(InputStreamReader)

字符输出转换流(OutputStreamWriter)

构造器说明
public InputStreamReader(InputStream is)可以把原始的字节流按照代码默认编码转换成字符输入流,几乎不用,与默认的FileReader一样
public InputStreamReader(InputStream is,Sting charset)可以把原始的字节流按照指定编码转换成字符输入流,完美的避免了乱码问题
package com.shouyeren.oop.api.byte_stream;

import java.io.*;

public class InputStreamReaderDemo01 {
    public static void main(String[] args) {
        //代码UTF-8 文件GBK  src/outputTest.txt
        try(
                //1.提取GBK文件的原始字节流
                InputStream is = new FileInputStream("src/outputTest.txt");
                //2.把原始字节流转换成字符输入流
                //Reader isr = new InputStreamReader(is);//默认以UTF-8转换,还是无法避免乱码问题,与FileReader是一样的
                Reader isr = new InputStreamReader(is,"GBK");//指定以GBK编码转换,避免了因编码方式不同引起的乱码问题
                BufferedReader br = new BufferedReader(isr)
                ){
                    String line;
                    while ((line = br.readLine()) != null){
                        System.out.println(line);
                    }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

OutputStreamWriter与InputStreamReader对应,也具有指定编码的功能,这里不作过多赘述。

序列化对象

对象序列化:

作用:以内存为基础,把内存中的对象存储到磁盘文件中去,称为对象序列化

使用到的流是对象字节输出流:ObjectOutputStream

构造器说明
public objectOutputStream(OutputStream out)把低级字节输出流包装成高级的对象字节输出流
方法名称说明
public final void writeObject(Object obj)把对象写出去到对象序列化流的文件中去

注意

要实现对象序列化的对象必须实现序列化接口(Serializable)

transient修饰的成员变量不参与序列化

Student类

package com.shouyeren.oop.api.byte_stream;

import java.io.Serializable;

//对象要序列化必须实现 Serializable 接口
public class Student implements Serializable {
    private String name;
    private String loginName;
    //transient修饰的成员变量不参与序列化
    private transient String passWord;
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", loginName='" + loginName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", age=" + age +
                '}';
    }

    public Student() {
    }

    public Student(String name, String loginName, String passWord, int age) {
        this.name = name;
        this.loginName = loginName;
        this.passWord = passWord;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

测试类

package com.shouyeren.oop.api.byte_stream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

//
public class ObjectOutputStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //1.创建学生对象
        Student student = new Student("张三","zs666","123456",21);

        //2.对象序列化:使用对象字节输出流包装字节输出流管道
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src/data.txt"));

        //3.直接调用序列化方法
        oos.writeObject(student);

        //4.释放资源
        oos.close();
    }
}

对象反序列化

使用到的流是对象字节输入流:ObjectInputStream

作用:以内存为基础,把存储到磁盘文件中的对象数据恢复成内存中的对象,称为对象反序列化

构造器说明
public ObjectInputStream(InputStream in)把低级字节输入流包装成高级的对象字节输入流
方法名称说明
public Object readObject()把储存到磁盘文件中去的对象数据恢复成内存中的对象返回
package com.shouyeren.oop.api.byte_stream;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * 学会对象反序列化,使用对象字节输入流把文件中的对象数据恢复为内存中的Java对象
 */
public class ObjectInputStreamDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建对象字节输入流管道包装低级的字节输入流管道
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("src/data.txt"));

        //2.调用对象字节输入流的反序列化方法
        Student student = (Student) inputStream.readObject();
        System.out.println(student);

        //3.释放资源
        inputStream.close();
    }
}

打印流

PrintStream

  • 作用:打印流可以实现方便、高效的打印数据到文件中去。
  • 打印流一般是指:PrintStream、PrintWriter两个类
  • 可以实现打印什么数据就是什么数据,例如打印整数97,写出去就是97,而不是a,打印boolean的true打印出去就是true。
  • 打印流的使用十分方便,还可以指定编码输出
构造器说明
public PrintStream(OutputStream os)打印流直接通向字节输出流管道
public PrintStream(File f)打印流直接通向文件对象
public PrintStram(String filepath)打印流直接通向文件路径
package com.shouyeren.oop.api.byte_stream;

import java.io.PrintStream;

/**
 * 学会使用打印流方便、高效的打印数据到文件中
 */
public class PrintDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建一个打印流对象
        PrintStream printStream = new PrintStream("src/data1.txt");
        //2.打印数据
        printStream.println(97);
        printStream.println(true);
        printStream.println(33.3);
        printStream.println("打印流输出完毕...");
        
        //3.关闭资源
        printStream.close();

    }
}

97
true
33.3
打印流输出完毕...

PrintWriter

构造器说明
public PrintWriter(OutputStream os)打印流直接通向字节输出流管道
public PrintWriter(Writer w)打印流直接通向字符输出流管道
public PrintWriter(File f)打印流直接通向文件对象
public PrintWriter(String filepath)打印流直接通向文件路径

PrintStream 与 PrintWriter的区别

  • 打印数据的功能上是一模一样的,都是使用方便,性能高效
  • PrintStream 继承自字节输出流 OutputStream,支持写字节数据的方法
  • PrintWriter 继承自字符输出流 Writer ,支持写字符数据

Properties

Properties 属性集对象

  • 其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用
  • Properties 核心作用:
    • Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去
    • 属性文件:后缀是.properties结尾的文件,里面的内容都是 key = value,做系统配置信息的文件
public class PropertiesDemo01{
    public static void main(String[] args)throws Exception{
        //需求:使用Properties把键值对信息存入到属性文件中去
        Properties properties = new Properties();
        properties.setProperty("admin","123456");
        properties.setProperty("zhangsan","123456");
        properties.setProperty("lisi","123456");
        /**
        	参数一:保存管道 字符输出流管道
        	参数二:注释信息
        */
        //加载方法 ——load(FileReader对象)
        //存储方法
        properties.store(new FileWriter("文件路径")"注释信息");
        
    }
}

IO框架

commons-io概述

  • commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率
  • commons-io工具包提供了很多有关IO操作的类。有两个主要的类FileUtils,IOUtils

FileUtils主要有如下方法:

方法名说明
String readFileToString(File file,String encoding)读取文件中的数据,返回字符串
void copyFile(File srcFile,File destFile)复制文件
void copyDirectoryToDirectory(File secDir ,File destDir)复制文件夹

从JDK1.7开始Java也实现新的IO升级(NIO),以前繁琐的IO操作大多都能一行代码实现了。

总结

文件专属:                                                                     数据流专属:          

FileInputStream                                                              DateInputStream

FileOutputStream                                                           DateOutputStream

FileReader                                                                      标准输出流:       

FileWriter                                                                         PrintWriter

缓冲专属:                                                                         PrintStream

BufferedReader                                                               转换流(将字节流转换成字符流):

BufferedWriter                                                                 InputStreamReader

BufferedInputStream                                                       OutputStreamWriter

BufferedOutputStream 

                        对象专属流:ObjectInputStream        ObjectOutputStream  

在这里插入图片描述

感觉不错的话,动手点个赞吧!

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

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

相关文章

【LeetCode】剑指 Offer(1)

目录 写在前面: 题目1:剑指 Offer 03. 数组中重复的数字 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目2:剑指 Offer 06. 从…

JavaEE初阶---TCP/IP协议

一:概述 本文是网络编程的理论基础,也是网络部分的重点和难点,在笔试,面试中,这部分内容也多有考察.二:详解 TCP/IP五层协议 应用层传输层网络层数据链路层物理层 2.1应用层 我们自己编写的代码,就是在应用层,这也是在实际开发中接触最多的层.应用层里有许多现成的协议 , 而在…

springboot(5)静态资源访问前缀+欢迎页+REST风格的传递参数

Springboot的访问规则是 先访问controller的请求,如果没有的话,我们在访问静态资源。 但是静态资源过多的情况下这样不好处理,所以我们可以加一个前缀,这样可以拦截掉非静态资源的请求,每次都可以准确快速无风险的访…

镀镍废水处理,企业污水处理,离子交换树脂在镀镍废水中的应用

传统沉淀法不能满足日益提的环保要求(如电镀表三镍含量要求0.1mg/l以下)。针对特定重金属离子的特点,利用螯合树脂的特种功能基团与重金属离子形成络合物的特性,实现重金属离子的回收利用及深度去除。 CH-90Na对除铜镍铅锌钴锰等具有特定的选择性&#x…

API的应用

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节 应用程序接口 想…

安卓|aar和jar打包引入流程演示

安卓|aar和jar打包引入流程演示aar和jar存在相关意义打包环境工具aar和jar|Module项目目录aar打包|引入总览步骤|aar配置打包创建java or kotlin类文件及资源|截图展示步骤|aar包引入jar打包|引入总览步骤|jar配置打包任务创建java类文件|截图展示步骤|jar包引入aar和jar运行在…

OpenTracing协议规范链接

一、官网链接 OpenTracing specificationhttps://opentracing.io/specification/不过目前OpenTracing项目已归档,不再维护。需要参考OpenTelemetry官网链接 Migrating from OpenTracing | OpenTelemetryBackward compatibility with OpenTracing has been a prior…

Promise 的理解

promise 是什么?promise 是JS 中进行异步编程的最新的解决方案从语法上来说:Promise 是一个构造函数从功能上来说:promise 对象时用来封装一个异步操作并可以获取其结果其三种状态,reasolve 、pendding、 rejectedPromise 的基本运…

计算机网络-ip数据报

在图中,网络层包含了四种协议:ARP、IP、ICMP、IGMP,由上下关系表明,ARP为IP协议服务,IP为ICMP和IGMP服务。 IP数据报格式 此处不区分数据报和分组的概念:当数据部分过长时,将数据部分拆分&…

2022年全国职业院校技能大赛A(1)

目录 模块A 基础设施设置与安全加固 一、项目和任务描述: 二、服务器环境说明 三、具体任务(每个任务得分以电子答题卡为准) A-1任务一 登录安全加固 1.密码策略(Windows,Linux) a.设置最短密码长度为…

Python 之 NumPy 随机函数和常用函数

文章目录一、随机函数1. numpy.random.rand(d0,d1,…,dn)2. numpy.random.randn(d0,d1,…,dn)3. numpy.random.normal()4. numpy.random.randint()5. numpy.random.sample6. 随机种子np.random.seed()7. 正态分布 numpy.random.normal二、数组的其他函数1. numpy.resize()2. nu…

芯片是怎样“炼”成的?

在芯片设计完成,交由芯片制造厂(Fab)进行试产(Tape out)之后,就可以进行量产了。但Tape out是个漫长的过程,在此过程中,Fab里的工艺及设备工程师们需要不断调试,使得芯片…

Python优化算法—遗传算法

Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言 优化算法,尤其是启发式的仿生智能算法在最近很火,它适用于解决管理学,运筹…

全球认可的PMI认证体系

全球认可的PMI认证体系我们生活在一个“项目化”的世界里,而且这一趋势在不断加强。PMI的专业认证将使您做好准备,满足全球范围内各种项目、不同企业的需求。PMI的认证源于项目管理从业者,并服务于项目管理从业者。所有认证基于严格的标准和持…

HTML5之CSS基础学习笔记

基础认知 CSS初始 CSS的介绍 CSS:层叠样式表(Cascading style sheets) CSS作用是什么?? 给页面中的HTML标签设置样式 CSS就是用来做美化的,我之前写的网页就是黑白,要不带点彩色的图片&#x…

MYSQL-主从复制

文章目录1 概述2 原理3 搭建3.1 主库配置3.2 从库配置1 概述 主从复制是指将主数据库的DDL和 DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进…

从事架构师岗位快2年了,聊一聊我对架构的一些感受和看法

从事架构师岗位快2年了,聊一聊我和ChatGPT对架构的一些感受和看法 职位不分高低,但求每天都能有新的进步,永远向着更高的目标前进。 文章目录踏上新的征程架构是什么?架构师到底是干什么的?你的终极目标又是什么&#…

腾讯实践:面向在线游戏的智能推荐系统设计实践

‍省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2023年1月份热门报告合集ChatGPT的发展历程、原理、技术架构及未来方向《ChatGPT:真格基金分享.pdf》2023年AIGC发展趋势报告:人工智能的下一时代推荐…

【经验】CiteSpace|Wiley Online Library或除知网以外的其他网站的文献怎么导入CiteSpace 6.1.6?

如果没安装,请看这篇博客安装,现在新版(6.1.6)的不需要额外下载java了,就很妙~:   最新版citespace软件的安装与配置 结论:导出成RIS然后用它自带的转换成WoS。 Wiley Online Library导出RIS…

(考研湖科大教书匠计算机网络)第四章网络层-第三节2:分类编址的IPv4地址

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:分类IP地址概述二:各类地址详解(1)A类地址(2)B类地址(3)C类地址…