由浅到深认识Java语言(37):I/O流

该文章Github地址:https://github.com/AntonyCheng/java-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(36):I/O流

44.I/O流(操作文件中的数据)

字符流

只能操作文本文件;

字符流 = 字节流 + 编码表

Writer类

是所有字符输出流的超类(写入文本文件);

  • write(int c) 写入单个字符;
  • write(char[] ch) 写入字符数组;
  • write(char[] ch,int off,int len) 写入字符数组一部分,开始索引以及写入的个数;
  • write(String str) 写入字符串;
  • flush() 刷新该流的缓冲(该类写入数据时先写入内存,只能刷新了数据才会抵达目的路径),而在 close() 方法完成后也会自动调用一次 flush() 方法,但是建议手动刷新,防止内存积压过多;
OutputStreamWriter 实现类

OutputStreamWriter 实现类继承 Writer 类,是字符的输出流,同时也被称作转换流,这个类也是“装饰者”,装饰输出流(OutputStream);

转换流:把字符流转换成字节流;

构造方法:

  • OutputStreamWriter(OutputStream out) 传递任意字节输出流;
  • OutputStreamWriter(OutputStream out,String 编码表名) 传递任意字节输出流,编码表名,不同的 IDE 有不同的默认编码表,IDEA 是 UTF-8 ,eclipse 是 GBK;

使用类示例如下:

package top.sharehome.Demo;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;public class Demo {public static void main(String[] args) {FileOutputStream fos = null;OutputStreamWriter osw = null;try {fos = new FileOutputStream("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");osw = new OutputStreamWriter(fos, "utf8");osw.write("啦啦啦啦啦啦");osw.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (osw != null) {osw.close();}} catch (IOException e) {e.printStackTrace();}}}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Reader类

是所有字符输入流的超类(读取文本文件);

  • int read() 读取单个字符;
  • int read(char[] ch) 读取字符数组;
InputStreamReader 实现类

InputStreamWriter 实现类继承 Reader 类,是字符的输入流,同时也被称作转换流,这个类也是“装饰者”,装饰输入流(InputStream);

转换流:字节流转成字符流;

构造方法:

  • InputStreamReader(InputStream in) 传递任意字节输入流;
  • InputStreamReader(InputStream in,String 编码表名) 传递任意字节输入流,编码表名,不同的 IDE 有不同的默认编码表,IDEA 是 UTF-8 ,eclipse 是 GBK;

使用类示例如下:(test2.txt 文件如下)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

package top.sharehome.Demo;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class Demo {public static void main(String[] args) {FileInputStream fis = null;InputStreamReader isr = null;try {fis = new FileInputStream("d:\\大学课程学习文档\\java\\Practice\\IO\\test2.txt");isr = new InputStreamReader(fis);char[] ch = new char[1024];int flag = 0;while ((flag=isr.read(ch)) != -1) {System.out.println(new String(ch, 0, flag));}} catch (IOException e) {e.printStackTrace();} finally {try {if (isr != null) {isr.close();}} catch (IOException e) {e.printStackTrace();}}}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

便捷类

  • FileWriter 继承自 OutputStreamWriter;

    • 字符的输出流,写入文本文件;
    • 直接采用默认的编码表(utf-8);
    • FileWriter 构造方法直接传递字符串的文件名即可,该文件若在项目根路径不存在,则在根路径创建后再写入;

    示例如下:

    package top.sharehome.Demo;import java.io.FileWriter;
    import java.io.IOException;public class Demo {public static void main(String[] args) {FileWriter fw = null;try {fw = new FileWriter("d:\\大学课程学习文档\\java\\Practice\\IO\\test2.txt");fw.write("你好 IO流");fw.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (fw != null) {fw.close();}} catch (IOException e) {e.printStackTrace();}}}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • FileReader 继承自 InputStreamReader;

    • 字符的输入流,读取文本文件;
    • 直接采用默认的编码表;
    • FileReader 构造方法直接传递字符串的文件名即可,必须要有数据源文件;

    示例如下:

    package top.sharehome.Demo;import java.io.FileReader;
    import java.io.IOException;public class Demo {public static void main(String[] args) {FileReader fr = null;try {fr = new FileReader("d:\\大学课程学习文档\\java\\Practice\\IO\\test2.txt");char[] ch = new char[1024];int flag = 0;while ((flag = fr.read(ch)) != -1) {System.out.print(new String(ch,0,flag));}} catch (IOException e) {e.printStackTrace();} finally {try {if (fr != null) {fr.close();}} catch (IOException e) {e.printStackTrace();}}}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符流的缓冲流

使用字符流的缓冲流,提高原有流对象的读写性能;

字符流的缓冲流是字符流中便捷类的**“装饰者”**;

  • BufferedWriter 继承自 Writer;

    • 字符输出流的缓冲流,写入文本文件;

    • 特殊方法:newLine() 写入文本换行符,由于每个操作系统的换行符不一样,这个方法就实现了代码的跨平台性;

      示例如下:

      package top.sharehome.Demo;import java.io.BufferedWriter;
      import java.io.FileWriter;
      import java.io.IOException;public class Demo {public static void main(String[] args) {FileWriter fr = null;BufferedWriter bf = null;try {fr = new FileWriter("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");bf = new BufferedWriter(fr);bf.write(97);bf.newLine();bf.write(98);bf.flush();}catch (IOException e){e.printStackTrace();}finally {try {if (fr!=null){fr.close();}}catch (IOException e){e.printStackTrace();}}}
      }
      

      打印效果如下:

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • BufferedReader 继承自 Reader;

    • 字符输入流的缓冲流,读取文本文件;
    • 特殊方法:readLine() 读取文本一行,由于每个操作系统的换行符不一样,这个方法就实现了代码的跨平台性,返回 String ,当读取完文件后反 null;

    示例如下:

    package top.sharehome.Demo;import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;public class Demo {public static void main(String[] args) {FileReader fr = null;BufferedReader br = null;try {fr = new FileReader("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");br = new BufferedReader(fr);String flag = null;while ((flag = br.readLine()) != null) {System.out.println("flag = " + flag);}} catch (IOException e) {e.printStackTrace();} finally {try {if (br != null) {br.close();}} catch (IOException e) {e.printStackTrace();}}}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符流的缓冲流和字节流的缓冲流使用方法大致相同;

在 Java11 之后可以使用一种更简单的方法来读取一个文件(类似于迭代器的遍历方式),此时要用Scanner类来获取一个文件:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.Scanner;/*** @author AntonyCheng* @date 2022/8/28 17:32*/public class Demo {public static void main(String[] args) {Scanner in = null;try {//Scanner(Path source, Charset charset)构造器需要Java10//Path接口中Path of(String first, String... more)需要Java11in = new Scanner(Path.of("d:\\desktop\\txt.png"), StandardCharsets.UTF_8);while (in.hasNextLine()) {System.out.println(in.nextLine());}} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());} finally {if (in != null) {in.close();}}}
}
BufferedWriter 构造方法

new BufferedWriter(Writer w) 传递字符输出流;

BufferedReader 构造方法

new BufferedReader(Reader r) 传递字符输入流;

禁止使用字符流复制文本文件

这是一个错误的应用,不能保证复制后和源文件是一致的;

打印流

  • PrintStream:字节输出流;

  • PrintWriter:字符输出流;

  • 打印流特性:

    • 打印流负责输出打印,不关心数据源;

    • 方便地打印各种形式数据;

    • 打印流永远不会抛出 IO 异常

    • 具有自动刷新的功能;

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      即添加参数 true ,但是要注意自动刷新必须需要 println 或者 printf 或者 format 进行打印

    • 这些依然是**“装饰者”**,需要再构造方法中引入字节流或者字符流;

打印流示例如下:

  • PrintStream 示例:

    package top.sharehome.Demo;import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintStream;public class Demo {public static void main(String[] args) {FileOutputStream fos = null;PrintStream ps = null;try {fos = new FileOutputStream("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");ps = new PrintStream(fos);ps.print("这里写什么就会在文件里写什么!");} catch (IOException e) {e.printStackTrace();} finally {if (ps != null) {ps.close();}}}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • PrintWriter 示例:

    package top.sharehome.Demo;import java.io.*;public class Demo {public static void main(String[] args) {FileWriter fw = null;PrintWriter pw = null;try {fw = new FileWriter("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");pw = new PrintWriter(fw);pw.println("这里写什么就会在文件里写什么!");} catch (IOException e) {e.printStackTrace();} finally {if (pw != null) {pw.close();}}}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本数据流

  • DataInputStream

    • 基本数据类型读取流;
    • 构造方法传递一个字节输入流;
  • DataOutputStream

    • 基本数据类型写入流;
    • 构造方法传递一个字节输出流;
  • 基本数据流依然是一个**“装饰者”**;

基本数据流示例如下:

package top.sharehome.Demo;import java.io.*;public class Demo {public static void main(String[] args) {FileOutputStream fos = null;DataOutputStream dos = null;FileInputStream fis = null;DataInputStream dis = null;try {fos = new FileOutputStream("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");dos = new DataOutputStream(fos);fis = new FileInputStream("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");dis = new DataInputStream(fis);dos.writeInt(6);int i = dis.readInt(); //这里不能使用普通的 read() 方法,需要和写入格式相统一System.out.println("i = " + i);} catch (IOException e) {e.printStackTrace();} finally {try {if (dos != null) {dos.close();}} catch (IOException e) {e.printStackTrace();}try {if (dis != null) {dis.close();}} catch (IOException e) {e.printStackTrace();}}}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们要连续写入读取多个值呢?首先想到的是循环,但是循环条件成了一个问题,因为这里传输的是基本数据类型,返回 -1 是有可能的,所以这里只能通过抓取异常来来确定循环结束点;

示例如下:

package top.sharehome.Demo;import java.io.*;public class Demo {public static void main(String[] args) {FileInputStream fis = null;DataInputStream dis = null;try {fis = new FileInputStream("d:\\大学课程学习文档\\java\\Practice\\IO\\test1.txt");dis = new DataInputStream(fis);while (true){try {int readInt = dis.readInt();System.out.println("readInt = " + readInt);}catch (IOException e){break;}}} catch (IOException e) {e.printStackTrace();} finally {try {if (dis != null) {dis.close();}} catch (IOException e) {e.printStackTrace();}}}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识Java语言(38):I/O流

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

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

相关文章

win10配置CLion2022+ubuntu20.04远程部署

背景 在博文ubunut搭建aarch64 cuda交叉编译环境记录中,使用的ubuntu20.04虚拟机安装eclipse来交叉编译aarch64的程序,然后发送到jetson板子上执行。开发一段时间后发现eclipse IDE使用起来不太便捷,因此,考虑使用CLion IDE&…

【数字孪生平台】使用 Three.js 以 3D 形式可视化日本新宿站地图

在本文中,我们将使用日本新宿站的室内地图数据,并使用 Three.js 将其进行 3D 可视化。更多精彩内容尽在数字孪生平台。 使用的数据 这次,我们将使用日本空间信息中心发布的“新宿站室内地图开放数据”的集成版本(ShapeFile&#…

网络安全新视角:数据可视化的力量

在当今数字化时代,网络安全已成为各大企业乃至国家安全的重要组成部分。随着网络攻击的日益复杂和隐蔽,传统的网络安全防护措施已难以满足需求,急需新型的解决方案以增强网络防护能力。数据可视化技术,作为一种将复杂数据转换为图…

Weblogic10.3.6补丁升级

由oracle官方发布的漏洞公告,对weblogic进行补丁升级。本文介绍的是weblogic安装的版本为10.3.6.0,如果你使用的是其他版本的请根据实际版本来选择下载 对于weblogic补丁升级,具体步骤如下: 1、首先需要下载weblogic补丁程序 2…

简单了解原型模式

什么是原型模式 区别于单例模式,原型模式的一个类可以有多个实例化的对象。 原型模式通过拷贝来产生新的对象,而不是new,并且可以根据自己的需求修改对象的属性。 实现Cloneable接口实现拷贝 而拷贝又分为浅拷贝和深拷贝,两者在…

AI赋能微服务:Spring Boot与机器学习驱动的未来应用开发

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

HarmonyOS入门--页面和自定义组件生命周期

文章目录 页面和自定义组件生命周期页面生命周期组件生命周期生命周期的调用时机 页面和自定义组件生命周期 生命周期流程如下图所示,下图展示的是被Entry装饰的组件(首页)生命周期。 自定义组件和页面的关系: 自定义组件&…

[flask]http请求//获取请求体数据

import jsonfrom flask import Flask, requestapp Flask(__name__)app.route("/form1", methods["post"]) def form1():"""获取客户端请求的请求体[表单]:return:""""""获取表单数据请求url:&qu…

网络安全卷么?

官方宣传的是对的网络安全现在是朝阳行业,缺口是很大 不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全,初级也会慢慢的卷起来,但是岗位多不用怕,以后各大去也都会要网…

Git Fork后的仓库内容和原仓库保持一致

Git Fork后的仓库内容和原仓库保持一致 ①Fork原仓库内容到自己仓库 ②将项目内容下载到本地 ③使用git命令获取原仓库内容,将原仓库的最新内容合并到自己的分支上并推送 下面从第三步开始演示~ 这里以码云上的若依项目为演示项目 ③使用git命令获取原仓库内容 …

基于龙芯2k1000 mips架构ddr调试心得(二)

1、内存控制器概述 龙芯处理器内部集成的内存控制器的设计遵守 DDR2/3 SDRAM 的行业标准(JESD79-2 和 JESD79-3)。在龙芯处理器中,所实现的所有内存读/写操作都遵守 JESD79-2B 及 JESD79-3 的规定。龙芯处理器支持最大 4 个 CS(由…

Spring Transaction 指定事务管理器问题

一,单个数据源,单个事务管理器与Transactional默认事务管理器名称不一致问题 在平时代码中使用声明性事务时,直接在方法上面加注解即可,如下 Transactional(rollbackFor Exception.class) 并没有指定事务管理器,为…

探索直播美颜技术:计算机视觉在美颜SDK开发中的应用

下文,小编将深入探讨美颜技术在计算机视觉领域中的应用,特别是美颜SDK的开发过程,并剖析其技术原理和实现方法。 一、美颜技术的发展 这些算法往往难以满足用户对高质量美颜效果的需求,因此需要更加先进的技术手段来实现。 二、…

map与set容器常见操作详解(含示例代码及注意事项)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

LeetCode-热题100:73. 矩阵置零

题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入: matrix [[1,1,1],[1,0,1],[1,1,1]] 输出: [[1,0,1],[0,0,0],[1,0,1]] 示例 2&…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通,而客户的个人信息基本都存储在内部CRM系统中,对于销售来说需要一边看企微,一边去内部CRM系统查询,比较麻烦,希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

常见手撕项目C++

常见手撕项目C 设计模式单例模式饿汉模式懒汉模式 设计模式 单例模式 单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 优点: 资源控制:单例模式能够确保一个类只有一个实…

淘宝订单中的涉及红包检测、优惠券检测方案|工具|API

首先,检测订单红包的核心价值是什么? “红包的本质就是薅平台羊毛:不用怀疑,平台对于这种损害平台利益的行为肯定是最高等级的稽查”。那么,在日常运营中,需要尽可能过滤这类订单。 其次,如何使…

【数据结构 | 图论】如何用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构,特别适合于存储稀疏图,它可以有效地存储图的边和节点信息,以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起,通过数组的方式连接(类似静态数组实现链表…

慧天【HTWATER】:水文水动力模型的革命性工具,城市内涝的精准解决方案

城市内涝水文水动力模型介绍 在城市排水防涝规划过程中,水文水动力耦合模型已经成为一种不可或缺的分析工具。在模型建立、城市内涝风险评估、排水系统性能诊断以及海绵城市规划等方面,内涝耦合模型提供了相应的模拟及分析工具: 1.1丰富的数…