JavaIO流(三)

news/2025/2/23 17:02:54/文章来源:https://www.cnblogs.com/zlyh/p/18715279

6.转换流

不同编码读取出现乱码的问题:

  • 如果代码编码和被读取的文本文件编码是一致的,使用字符流读取文本时不会出现乱码
  • 如果代码编码和被读取的文本文件编码是不一致的,使用字符流读取文本时就会出现乱码

InputStreamReader(字符输入转换流)

是Reader抽象类下的实现类

  • 解决不同编码时,字符流读取文本内容乱码的问题
  • 解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。
package com.IO.transform_stream;import java.io.*;public class InputStreamReaderTest02 {public static void main(String[] args) {try (//1.得到文件的原始字节流(GBK 的字节流形式)InputStream is = new FileInputStream("basic-grammar\\src\\yehuan09.txt");//2.把原始的字节输入流按照指定的字符集编码转换成字符输入流Reader isr = new InputStreamReader(is,"GBK");//3.把字符输入流包装成缓冲字符输入流BufferedReader br = new BufferedReader(isr);){String line;while((line = br.readLine()) != null) {System.out.println(line);}} catch (Exception e) {throw new RuntimeException(e);}}
}

OutputStreamWriter(字符输出转换流)(了解)

需要控制写出去的字符使用什么字符集编码,该咋整?

  • 调用String提供的getBytes方法解决
String data = "我爱你中国abc";
byte[] bytes = data.getBytes("GBK");
  • 使用字符输出转换流实现
    • 作用:可以控制写出去的字符使用什么字符集编码。
    • 解决思路:先获取文件字节输出流,再按照指定的字符集编码将其转成字符输出流,以后写出去的字符就会用该字符集编码了。
package com.IO.transform_stream;import java.io.*;public class OutputStreamWriterTest03 {public static void main(String[] args) {try (OutputStream os = new FileOutputStream("basic-grammar\\src\\yehuan09out.txt");Writer osw = new OutputStreamWriter(os,"GBK");BufferedWriter bw = new BufferedWriter(osw);){bw.write("我是中国人abc");bw.newLine();bw.write("我是中国人123");} catch (Exception e) {throw new RuntimeException(e);}}
}

7.打印流

PrintStream/PrintWriter(打印流)

PrintStream是字节输出流抽象类下的实现类

PrintWriter是字符输出流抽象类下的实现类

  • 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。
package com.IO.printstream;import java.io.*;
import java.nio.charset.Charset;public class PrintStreamTest01 {public static void main(String[] args) {try (//1.创建一个打印流管道//PrintStream ps =  new PrintStream("basic-grammar\\src\\yehuan10.txt",Charset.forName("GBK"));//PrintStream ps =  new PrintStream("basic-grammar\\src\\yehuan10.txt");//追加数据PrintWriter ps =  new PrintWriter(new FileOutputStream("basic-grammar\\src\\yehuan10.txt",true));){ps.println(100);ps.println('a');ps.println("中国");ps.println(true);ps.println(9.5);ps.write(97);//'a'} catch (Exception e) {e.printStackTrace();}}
}

PrintStream和PrintWriter的区别

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

打印流的一种应用:输出语句的重定向

System.out.println("志在千里");
  • 可以把输出语句的打印位置改到某个文件中去。
PrintStream ps = new PrintStream("文件地址");
System.setOut(ps);
package com.IO.printstream;import java.io.FileNotFoundException;
import java.io.PrintStream;public class PrintTest01 {public static void main(String[] args) {System.out.println("老骥伏枥");System.out.println("志在千里");try (PrintStream ps = new PrintStream("basic-grammar\\src\\yehuan11.txt");){// 把系统默认的打印流对象改成自己设置的打印流System.setOut(ps);System.out.println("烈士暮年");System.out.println("壮心不已");} catch (Exception e) {e.printStackTrace();}}
}

8.数据流

DataOutputStream(数据输出流)

  • 允许把数据和其类型一并写出去
package com.IO.data_stream;import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class DataOutputStreamTest1 {public static void main(String[] args) {try (//1.创建一个数据输出流包装低级的字节输出流DataOutputStream dos = new DataOutputStream(new FileOutputStream("basic-grammar\\src\\yehuan10out.txt"));){dos.writeInt(97);dos.writeDouble(99.5);dos.writeBoolean(true);dos.writeUTF("夜欢");} catch (Exception e) {e.printStackTrace();}}
}

DataInputStream(数据输入流)

  • 用于读取数据输出流写出去的数据
package com.IO.data_stream;import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;/*目标:使用数据输入流读取特定类型的数据。*/
public class DataInputStreamTest2 {public static void main(String[] args) {try (DataInputStream dis = new DataInputStream(new FileInputStream("basic-grammar\\src\\yehuan10out.txt"));){int i = dis.readInt();System.out.println(i);double d = dis.readDouble();System.out.println(d);boolean b = dis.readBoolean();System.out.println(b);String s = dis.readUTF();System.out.println(s);} catch (Exception e) {e.printStackTrace();}}}

9.序列化流

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

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

ObjectOutputStream(对象字节输出流)

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

User类:

package com.IO.object_stream;import java.io.Serializable;//注意:对象如果需要序列化,必须实现序列化接口
public class User implements Serializable {private String loginName;private String userName;private int age;private String passWord;public User() {}public User(String loginName, String userName, int age, String passWord) {this.loginName = loginName;this.userName = userName;this.age = age;this.passWord = passWord;}public String getLoginName() {return loginName;}public void setLoginName(String loginName) {this.loginName = loginName;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}@Overridepublic String toString() {return "User{" +"loginName='" + loginName + '\'' +", userName='" + userName + '\'' +", age=" + age +", passWord='" + passWord + '\'' +'}';}
}
package com.IO.object_stream;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class Test01ObjectOutputStream {public static void main(String[] args) {try (//2.创建一个对象字节输出流包装原始的字节输出流。ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("basic-grammar\\src\\yehuan11out.txt"));){//1.创建一个Java对象User u = new User("admin","夜欢",25,"123456");//3.序列化对象到文件中oos.writeObject(u);System.out.println("序列化对象成功!!");} catch (Exception e) {e.printStackTrace();}}}

注意:对象如果需要序列化,必须实现序列化接口(java.io.Serializable)

ObjectInputStream(对象字节输入流)

  • 可以把Java对象进行反序列化:把存储在文件中的Java对象读入到内存中来
package com.IO.object_stream;import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class Test02ObjectInputStream {public static void main(String[] args) {//1.创建一个对象字节输入流管道,包装 低级的字节输入流与源文件接通try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("basic-grammar\\src\\yehuan11out.txt"));){User u = (User)ois.readObject();System.out.println(u);} catch (Exception e) {e.printStackTrace();}}
}
//transient 这个成员变量将不参加序列化
private transient String passWord;

如果要一次序列化多个对象,咋整?

用一个ArrayList集合存储多个对象,然后直接对集合进行序列化即可。

注意:ArrayList集合已经实现了序列化接口!

10.补充知识:IO框架

什么是框架?

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

什么是IO框架

  • 封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。

导入commons-io-2.18.0.jar框架到项目中去

  • 在项目中创建一个文件夹:lib
  • 将commons-io-2.18.0.jar文件复制到lib文件夹
  • 在lib文件上点右键,选择ADD as Library -> 点击ok
  • 在类中导包使用

11.IO流最终完整体系

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

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

相关文章

pycharm上传github问题:rejected

我从pycharm上传项目时,遇到的问题:以下是一些解决思路: 这个错误提示表明,你在尝试将本地代码推送到远程仓库时,远程仓库中已经包含了你本地尚未获取的更改。换句话说,远程仓库的代码比你的本地代码更新。Git 为了防止冲突,拒绝了你的推送操作。 错误原因 这种情况通常…

EDR简介

一、什么是edr 终端检测与响应(EDR)是一种安全解决方案,可检测并响应勒索软件和恶意软件等威胁。它通过持续监控端点可疑活动来工作,方法是收集有关事件的数据,如系统日志、网络流量、进程间通信 (IPC)、RPC 调用、身份验证尝试和用户活动。 安装在端点上的 EDR 将收集数据…

KUKA库卡KR210机器人维修解决方案概览

库卡KR210机器人,作为一款集高性能与广泛适用性于一体的工业机器人,在众多生产线上发挥着举足轻重的作用。在其高效运转的过程中,难免会遇到一些故障,及时的维修与保养就显得尤为重要。以下,将详细阐述一些常见的维修方法及其注意事项,以期为使用者提供更为全面的指导。常…

NetScaler Console 13.1 Build 57.26 发布,新增功能概览 (集中管理 NetScaler)

NetScaler Console 13.1 Build 57.26 发布,新增功能概览 (集中管理 NetScaler)NetScaler Console Release 13.1 Build 57.26 (ESXi, Hyper-V, KVM, Xen) Formerly known as Citrix ADM - 集中管理 NetScaler 请访问原文链接:https://sysin.org/blog/netscaler-console-13/ 查…

NetScaler 13.1 Build 57.26 发布,新增功能概览 (混合多云应用交付控制器)

NetScaler 13.1 Build 57.26 发布,新增功能概览 (混合多云应用交付控制器)NetScaler Release 13.1 Build 57.26 (nCore, VPX, SDX, CPX, BLX) Formerly known as Citrix ADC - 混合多云应用交付控制器 请访问原文链接:https://sysin.org/blog/netscaler-13/ 查看最新版。原创…

keycloak~认证与校验使用说明

主要内容密码认证 授权码认证 哪个client申请的code,使用哪个client获取token 客户端认证 在kc开通了服务端帐号之后,可通过client_id和client_secret来获取token,与用户无关,无刷新token机制 自动触发社区认证 当用户在社区网站上登录后,访问这个地址可自动登录法宝 验证…

Dify报错model schema not found

工作室操作 Agent 选择模型时对话报错: "Model schema not found" error only in agents是因为没打开模型的函数调用功能:当然,也不是所有模型都支持该功能。 本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!🚀 魔都架构师 | 全网30W+技术追随…

论文阅读 | 离线强化学习研究综述25年1月

文章来源 计算机学报2025年1月 比较新的一篇中文综述,值得一读 O IntroductionDRL应用如AlphaGo需要与环境在线交互,并且进行大量数据采样,现实世界代价昂贵且试错风险极高 2020年Levine提出离线强化学习概念(Offline Reinforcement Learning, Offline RL) 挑战:还是函数…

开启或者关闭windows远程桌面连接的音量

一、如图所示,远程桌面连接到了另一台设备,是没有声音的,音量的喇叭打了一个叉号二、使用win+r进入“运行” 三、输入gpedit.msc进入组策略管理器 (避免要求使用域账号进入) 四、计算机配置一管理模块-windows组件一远程桌面服务一远程桌面会话主机一设备和资源重定向五…

8款支持 C# 语言的 AI 辅助编程神器,高效编程利器!

前言 在当今这个AI技术日新月异的时代,一股创新的浪潮正席卷着软件开发领域,其中AI辅助编程工具以其独特的魅力脱颖而出,成为了众多开发者不可或缺的得力助手。这些工具不仅能够显著提升开发效率,优化代码质量,还能有效降低bug产生率,是现代软件开发过程中不可或缺的重要…

第三章:计算机的数据表示

复习第一章:需要一台计算机,在研究其组成的方向上进行努力 第二章:知道了计算机由输入设备、存储器、运算器和输出设备组成,这个体系目前还在沿用,现在该探究计算机怎样表示数据了TL;DR计算机使用二进制(0 和 1)表示所有数据,每一个 0 或 1 都是一个二进制位 为了表示简…

【蔚蓝星球的节日】世界海洋日的探索与海洋的重要性

在浩瀚无垠的蓝色星球上,海洋占据了地球表面的大部分,它是生命的摇篮,气候的调节器,也是全球经济和文化交流的纽带。为了纪念海洋的无尽恩赐,并唤起全人类对海洋保护的意识,联合国自2009年起将每年的6月8日定为“世界海洋日”。本文将带您追溯世界海洋日的由来,探讨其与…