08 IO-字符流其它流

IO-字符流&其它流

**字节流:**适合复制文件等,不适合读写文本文件

**字符流:**适合读写文本文件内容

IO流体系

image-20240412211312807

字符流

FileReader(文件字符输入流)

作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中来。

构造器说明
public FileReader(File file)创建字符输入流管道与源文件接通
public FileReader(String pathname)创建字符输入流管道与源文件接通
方法名称说明
public int read()每次读取一个字符返回,如果发现没有数据可读会返回-1.
public int read(char[] buffer)每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1.
  • 文件字符输入流,每次读取一个字符的api是哪个?
方法名称说明
public int read()每次读取一个字符返回,如果字节已经没有可读的返回-1
  • 字符流的好处。每次读取一个字符存在什么问题?

    • 读取中文字符不会出现乱码(如果代码文件编码一致)
    • 性能较慢
  • 文件字符输入流,每次读取一个字符数组的api是哪个?

方法名称说明
public int read(char[] buffer)每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1
  • 每次读取一个字符数组的优势?
    • 读取的性能得到了提升
    • 读取中文字符输出不会乱码。

FileWriter(文件字符输出流)

**作用:**以内存为基准,把内存中的数据以字符的形式写出到文件中去。

构造器说明
public FileWriter(File file)创建字节输出流管道与源文件对象接通
public FileWriter(String filepath)创建字节输出流管道与源文件路径接通
public FileWriter(File file,boolean append)创建字节输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath,boolean append)创建字节输出流管道与源文件路径接通,可追加数据
方法名称说明
void write(int c)写一个字符
void write(char[] cbuf)写入一个字符数组
void write(char[] cbuf, int off, int len)写入字符数组的一部分
void write(String str)写一个字符串
void write(String str, int off, int len)写一个字符串的一部分

注意:

  • 字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效
方法名称说明
public void flush() throws IOException刷新流,就是将内存中缓存的数据立即写到文件中去生效!
public void close() throws IOException关闭流的操作,包含了刷新!
  1. 字符输出流如何实现写出去的数据能换行

    • fw.write(“\r\n”)
  2. 字符输出流如何实现写出去的数据能换行

  • flush()刷新数据
  • close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了。
  1. 字节流、字符流的使用场景总结?
  • 字节流适合做一切文件数据的拷贝(音视频,文本)
  • 字节流不适合读取中文内容输出
  • 字符流适合做文本文件的操作(读,写)

缓冲流

IO流体系

image-20240412212701418

对原始流进行包装,以提高原始流读写数据的性能

字节缓冲流

  • 作用
    • 提高字节流读写数据的性能
    • 字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池。
构造器说明
public BufferedInputStream(InputStream is)把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读数据的性能
public BufferedOutputStream(OutputStream os)把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能
总结
  • 字节缓冲流有几种?

    • 字节缓冲输入流:BufferedInputStream
    • 字节缓冲输出流:BufferedOutputStream
  • 字节缓冲流为什么提高了字节流读写数据的性能?

    • 字节缓冲流自带8KB缓冲区
    • 可以提高原始字节流、字符流读写数据的性能
  • 功能上并无很大变化,性能提升了。

字符缓冲流

自带8K的字符缓冲池,可以提高字符输入流读取字符数据的性能

BufferedReader(字符缓冲输入流)

方法说明
public BufferedReader(Reader r)把低级的字符输入流包装成字符缓冲输入流管道,从而提高字符输入流读字符数据的性能
public String readLine()读取一行数据返回,如果没有数据可读了,会返回null

BufferedWriter(字符缓冲输出流)

方法说明
public BufferedWriter(Writer r)把低级的字符输出流包装成一个高级的缓冲字符输出流,从而提高字符输出流写数据的性能
public void newLine()换行
总结
  • 字符缓冲流有几种,好处是什么?

    • public BufferedReader(Reader r)
    • public BufferedWriter(Writer w)
    • 字符缓冲流自带8K缓冲区,可以提高原始字符流读写数据的性能
  • 两种字符缓冲流新增了哪些方法?

    • BufferedReader,多了readLine()按照行读取的功能
    • BufferedWriter,多了newLine()换行的功能
  • 推荐使用哪种方式提高字节流读写数据的性能?
    • 建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。

转换流

字符流直接读取文本内容

  • 必须文件和代码编码一致才不会乱码
  • 如果文件和代码编码不一致,读取将出现乱码。

字符输入转换流

字符输入转换流InputStreamReader作用:

  • 可以解决字符流读取不同编码乱码的问题
  • public InputStreamReader(InputStream is,String charset):可以指定编码把原始字节流转换成字符流,如此字符流中的字符不乱码。

字符输出转换流

字符输出转换流OutputStreamWriter的作用?

  • public OutputStreamWriter(OutputStream os,String charset) 可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码!

打印流

IO流体系

image-20240412214156732

PrintStream/PrintWriter(打印流)

作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。

构造器说明
public PrintStream(OutputStream/File/String)打印流直接通向字节输出流/文件/文件路径
public PrintWriter(OutputStream/Writer/File/String)打印流直接通向字符输出流/文件/文件路径
方法说明
public void println(Xxx xx)打印任意类型的数据出去
public void write(int/byte[]/byte[]一部分)可以支持写字节数据出去(PrintStream)
public void write(int/String/char[]/…)可以支持写字符数据出去(PrintWriter)

打印流 数量 特点 重定向

打印流有几种?各有什么特点?

  • 打印流一般是指:PrintStream,PrintWriter两个类。
  • 打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
  • PrintStream继承自字节输出流OutputStream,支持写字节
  • PrintWrite继承自字符输出流Writer,支持写字符

输出语句重定向

  • 属于打印流的一种应用,可以把输出语句的打印位置改到文件。
PrintStream ps = new PrintStream("文件地址")System.setOut(ps);

数据流

IO流体系

image-20240412214600432

DataOutputStream(数据输出流)

允许把数据和其类型一并写出去。

构造器说明
public DataOutputStream(OutputStream out)创建新数据输出流包装基础的字节输出流
方法说明
public final void writeByte(int v) throws IOException将byte类型的数据写入基础的字节输出流
public final void writeInt(int v) throws IOException将int类型的数据写入基础的字节输出流
public final void writeDouble(Double v) throws IOException将double类型的数据写入基础的字节输出流
public final void writeUTF(String str) throws IOException将字符串数据以UTF-8编码成字节写入基础的字节输出流
public void write(int/byte[]/byte[]一部分)支持写字节数据出去

DataInputStream(数据输入流)

用于读取数据输出流写出去的数据。

构造器说明
public DataInputStream(InputStream is)创建新数据输入流包装基础的字节输入流
方法说明
Public final byte readByte() throws IOException读取字节数据返回
public final int readInt() throws IOException读取int类型的数据返回
public final double readDouble() throws IOException读取double类型的数据返回
public final String readUTF() throws IOException读取字符串数(UTF-8)据返回
public int readInt()/read(byte[])支持读字节数据进来

序列化对象

对象序列化:把Java对象写入到文件中去

对象反序列化:把文件里的Java对象读出来

IO流体系

image-20240412215240728

ObjectOutputStream(对象字节输出流)

可以把Java对象进行序列化:把Java对象存入到文件中去。

方法说明
public ObjectOutputStream(OutputStream out)创建对象字节输出流,包装基础的字节输出流
public final void writeObject(Object o) throws IOException把对象写出去

ObjectInputStream(对象字节输入流)

可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来。

方法说明
public ObjectInputStream(InputStream is)创建对象字节输入流,包装基础的字节输入流
public final Object readObject()把存储在文件中的Java对象读出来

注意:

  • 对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)

提问:

  • 如果要一次序列化多个对象,怎么办?
    • 用一个ArrayList集合存储多个对象,然后直接对集合进行序列化即可(注意:ArrayList集合已经实现了序列化接口!)

总结

  • 对象序列化的含义

    • 把对象数据存入到文件中去。
    • 对象字节输出流ObjectOutputStram
    • public void writeObject(Object obj)
    • 对象必须实现序列化接口
  • 对象反序列化含义

  • 把磁盘中的对象数据恢复到内存的Java对象中。

    • 把对象数据存入到文件中去
    • 对象字节输入流ObjectInputStram
    • public Object readObject()

资源释放的方式

try-catch-finally

try {
    ...
    ... 	
} catch (IOException e) {
    e.printStackTrace();
}finally{ }
finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)。

try-with-resource

try-with-resource(JDK7开始提供)
    
try(定义资源1;定义资源2;…){
    可能出现异常的代码;
}catch(异常类名 变量名){
    异常的处理代码;
} 
该方式声明的资源使用完毕后,会自动调用其close()方法,完成释放!
自动释放资源、代码简洁自动释放资源、代码简洁
() 中只能放置资源,否则报错
什么是资源呢?
资源一般指的是最终实现了AutoCloseable接口。
public abstract class InputStream implements Closeable{ }

public abstract class OutputStream implements Closeable, Flushable { }

public interface Closeable extends AutoCloseable { }

IO框架

什么是(IO)框架

框架

  • 解决某类问题,编写的一套类、接口等,可以理解成一个半成品。
  • 好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率
  • 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去。
image-20240412223620648

IO框架

  • 封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等
  • 使用commons-io简化io流读写

Commons-io

Commons-io是apache开源基金组织提供的一组有关IO操作的小框架,目的是提高IO流的开发效率。

FileUtils类提供的部分方法展示说明
public static void copyFile(File srcFile, File destFile)复制文件
public static void copyDirectory(File srcDir, File destDir)复制文件夹
public static void deleteDirectory(File directory)删除文件夹
public static String readFileToString(File file, String encoding)读数据
public static void writeStringToFile(File file, String data, String charname, boolean append)写数据
IOUtils类提供的部分方法展示说明
public static int copy(InputStream inputStream, OutputStream outputStream)复制文件
public static int copy(Reader reader, Writer writer)复制文件
public static void write(String data, OutputStream output, String charsetName)写数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盛水最多的容器 ---- 双指针

题目链接 题目: 分析: 最大容积 即使就是最大面积, 长为下标之差, 宽为两下标对应值的最小值解法一: 暴力枚举: 将每两个数之间的面积都求出来, 找最大值, 时间复杂度较高解法二: 假设我们的数组是[6, 2, 5, 4], 我们先假设最左边和最右边, 即6 和 4 之间是最大面积长a*宽b此…

Android --- 常见UI组件

TextView 文本视图 设置字体大小:android:textSize"20sp" 用sp 设置颜色:android:textColor"#00ffff" 设置倍距(行距):android:lineSpacingMultiplier"2" 设置具体行距:android:lineSpacingExtra&q…

Day06-Java进阶-Arrays数组工具类冒泡排序选择排序二分查找正则表达式正则爬取

1. Arrays数组工具类 package arrays;import java.util.Arrays;public class ArraysDemo {/*Arrays类常用方法 :----------------------------------------------------------------------public static String toString (类型[] a) : 将数组元素拼接为带有格式的字符串public …

直接用表征还是润色改写?LLM用于文生图prompt语义增强的两种范式

直接用表征还是润色改写?LLM用于文生图prompt语义增强的两种范式 导语 目前的文生图模型大多数都是使用 CLIP text encoder 作为 prompt 文本编码器。众所周知,由于训练数据是从网络上爬取的简单图文对,CLIP 只能理解简单语义,而…

SpringBoot引入第三方jar包或本地jar包

idea2018创建spring boot项目 New Project窗口选择Spring Initializr Type选择Maven(Generate…),有两个Maven选择这一个。 勾选Spring Web。 pom.xml中version改成2.5.10。 在resources中新建jar目录,将第三方jar包fastjson2-2.0.47.jar放入其中。&#xff08…

星球大战绝地幸存者XGP微软商店免费领取教程(XGP注册+开通)

星球大战绝地幸存者XGP微软商店免费领取教程(XGP注册开通) 《星球大战绝地幸存者》这款游戏是由重生游戏工作室制作,EA发行的冒险类动作游戏,续写了《星球大战绝地:陨落的武士团》中的故事。在这款银河系第三人称动作…

数据仓库与数据挖掘(实验一2024.4.24)

实验准备: 1.下载conda 2.配置环境C:\ProgramData\miniconda3\Scripts 3.创建文件夹panda进入虚拟环境qq 激活虚拟环境:activate qq 启动jupyter lab(python语言环境编译):jupyter lab 4.panda下载 (…

C 语言实例 - 数值比较

比较两个数 以下实例中定义了两个整数变量&#xff0c;并使用 if 来比较两个数值&#xff0c;可以先看下逻辑图&#xff1a; #include <stdio.h>int main() {int a, b;a 11;b 99;// 也可以通过以下代码实现让用户在终端输入两个数// printf("输入第一个值:&quo…

VS2022配置和搭建QT

一、下载QT 可以去QT官网下载:https://www.qt.io/product/development-tools。 直接安装。 二、安装qt插件 直接在vs插件市场搜索就行。 安装的时候根据提示&#xff0c;关闭vs自动安装 再次进去vs提示你选择qt版本&#xff0c;psth里边找到安装版本的qmake.exe就行 配…

如何让一个大几千页的打开巨慢的 PDF 秒开

生成 PDF 的方法&#xff0c;无论软件还是纯命令的都有很多种&#xff0c;排除计算机性能的因素&#xff0c;并不是所有的方法生成几千页的 PDF 都能丝滑到秒开。 示例 PDF 文档 6 千多页 打开要等一会儿&#xff0c;再等一会儿…… 解决方法 方法一、拆分再合并&#xff08…

css盒子设置圆角边框的方法

前言 欢迎来到我的博客 个人主页&#xff1a;北岭敲键盘的荒漠猫-CSDN博客 本文为我整理的设置圆角边框的方法 需求描述 我们在设置盒子边框时&#xff0c;他总是方方正正的。 我们想让这个直直的边框委婉一点该怎么办呢。这个就提到了我们这篇文章讲的东西&#xff1a; bord…

接口测试|超详细面试题【附答案】

今天给姐妹们整理了一套超详细的附答案的接口测试面试题&#xff0c;姐妹们快学起来吧~ 接口测试的重要性&#xff0c;相信不用我多说了。接口测试是现在软件测试工程师一个加分项。因为很多朋友一开始做了几年的软件测试都是在做功能测试&#xff0c;做界面UI的测试&#xff…

ClickHouse用UDF解析XML字符串和XML文件

一.如果是读取xml文件的时候&#xff0c;文件入库需要使用文件读取UDF 创建了1个测试文件 wsdFileRead()&#xff1a; 直接读取文件内容 SELECT wsdFileRead(/home/temp/wsd_test.xml)Query id: 09b6e5fe-7169-43f7-b001-90e2eeabb8da┌─wsdFileRead(/home/temp/wsd_test.xm…

二维码存储图片如何实现?相册二维码的制作技巧

如何将照片生成二维码后存储展示&#xff1f;现在很多人会将图片生成二维码以后&#xff0c;用于分享或者储存的用途&#xff0c;减少个人内存的占用量&#xff0c;而且分享照片也会更加的方便&#xff0c;只需要扫描二维码就可以让其他人查看图片。 想要制作图片二维码的步骤…

掌握Linux Shell脚本函数:提高脚本效率与可维护性

目录标题 1、什么是Shell函数&#xff1f;2、如何定义Shell函数&#xff1f;3、Shell函数参数4、返回值5、实例&#xff1a;使用函数进行文件备份6、为什么使用函数&#xff1f;7、最佳实践 在编写Linux shell脚本时&#xff0c;函数是组织和重用代码的重要手段。本文将介绍如何…

ubuntu20 中设置桌面背景任务

1. 下载conky 使用 Conky 在 Ubuntu 中显示信息&#xff0c;例如你的阅读计划&#xff0c;可以分几个步骤来完成。Conky 是一款灵活的轻量级系统监视器&#xff0c;能够在桌面上显示各种信息。以下是基本的设置步骤&#xff1a; 安装 Conky 首先&#xff0c;你需要在 Ubuntu…

园区智慧化转型新篇章:解码智慧技术如何助力园区实现精细化管理,提升运营效率

目录 一、智慧技术概述及其在园区管理中的应用 &#xff08;一&#xff09;物联网技术的应用 &#xff08;二&#xff09;大数据技术的应用 &#xff08;三&#xff09;云计算技术的应用 二、智慧技术助力园区实现精细化管理 &#xff08;一&#xff09;实现资源优化配置…

百度智能云千帆 ModelBuilder 技术实践系列:通过 SDK 快速构建并发布垂域模型

​百度智能云千帆大模型平台&#xff08;百度智能云千帆大模型平台 ModelBuilder&#xff09;作为面向企业开发者的一站式大模型开发平台&#xff0c;自上线以来受到了广大开发者、企业的关注。至今已经上线收纳了超过 70 种预置模型服务&#xff0c;用户可以快速的调用&#x…

crossover和wine哪个好 wine和crossover有什么本质区别 苹果电脑运行Windows crossover24

CrossOver是Wine的延伸产品&#xff0c;CrossOver可以简单的理解为类虚拟机&#xff0c;那么wine是什么&#xff0c;许多小伙伴就可能有些一知半解。CrossOver和wine哪个好&#xff0c;wine和CrossOver有什么本质区别呢&#xff1f;下文将围绕着这两个问题展开。 一、CrossOve…

一文扫盲(7):房产管理系统界面设计

本次带来第7期&#xff1a;房产管理系统的界面设计&#xff0c;从系统定义、功能模块、界面构成和设计方向四个方面讲解&#xff0c;大千UI工场愿意持续和大家分享&#xff0c;欢迎关注、点赞、转发。 一、什么是房产管理系统 房产管理系统是一种用于管理和维护房地产资产的软…