Java高级重点知识点-21-IO、字节流、字符流、IO异常处理、Properties中的load()方法

文章目录

  • IO
    • IO的分类
  • 字节流
    • 字节输出流【OutputStream】
    • 字节输入流【InputStream】
    • 图片复制
  • 字符流
    • 字符输入流【FileReader】
    • 字符输出流【FileWriter】
  • IO异常的处理(扩展知识)
  • Properties属性集(java.util)

IO

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写 出数据。

IO的分类

  • 数据的流向: 输入流(把数据从 其他设备 上读取到 内存 中的流。)和输出流(把数据从 内存 中写出到 其他设备 上的流。)
  • 数据的类型: 字节流(以字节为单位,读写数据的流。)和字符流(以字符为单位,读写数据的流。)

IO流父类:

输入流输出流
字节流字节输入流InputStream字节输出流OutputStream
字符流字符输入流Reader字符输出流Writer

字节流

在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

字节输出流【OutputStream】

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类

  1. FileOutputStream类

java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class OutPutStreamDemo {public static void main(String[] args) throws FileNotFoundException {FileOutputStream fileOutputStream = new FileOutputStream("D:/outputstreamdemo.txt");FileOutputStream fileOutputStream1 = new FileOutputStream(new File("D:/outputstreamdemo2.txt"));}
}

在这里插入图片描述

在这里插入图片描述
这里通过源码我们可以发现,在我们使用其有参构造器创建对象的时候需要抛出一个FileNotFoundException 异常。并且我们可以注意到,当我们创建了一个输出流对象的时候,在我们的计算机中同样也会创建对应的文件(这里的文件是自动创建的,而之前我们使用File对象创建文件的时候,在硬盘中没有直接创建文件)。

写出字节数据

  • 写出字节: write(int b) 方法
import java.io.FileOutputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("D:/outputstreamdemo.txt");fileOutputStream.write(97);fileOutputStream.write(98);fileOutputStream.write(99);fileOutputStream.close();}
}

在这里插入图片描述

  • 写出字节数组: write(byte[] b)
import java.io.FileOutputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("D:/outputstreamdemo.txt");byte[] bytes = "今天天气很好".getBytes();fileOutputStream.write(bytes);fileOutputStream.close();}
}

在这里插入图片描述
这里我会发现,当我们写入新数据的时候,原来的数据被覆盖掉了。因此我们可以使用数据追加的构造方法。

import java.io.FileOutputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("D:/outputstreamdemo.txt",true);byte[] bytes = "今天天气很好".getBytes();fileOutputStream.write(bytes);fileOutputStream.close();}
}

在这里插入图片描述

  • 写出指定长度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节
import java.io.FileOutputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("D:/outputstreamdemo.txt",true);byte[] bytes = "abcdef".getBytes();fileOutputStream.write(bytes,4,2);fileOutputStream.close();}
}

在这里插入图片描述
这里我们使用getBytes()方法将字符串转换为字节数组,如何通过指定起始写位置4以及读写字节个数2,来向文件中写入数据ef。

写出换行:
Windows系统里,换行符号是 \r\n

import java.io.FileOutputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("D:/outputstreamdemo.txt",true);byte[] bytes = "abcdef".getBytes();for (byte aByte : bytes) {fileOutputStream.write( aByte);fileOutputStream.write("\r\n".getBytes());}fileOutputStream.close();}
}

在这里插入图片描述

字节输入流【InputStream】

java.io.InputStream 抽象类是表示字节输入流的所有类的超类

  1. FileInputStream类
    java.io.FileInputStream 类是文件输入流,从文件中读取字节。

数据准备: D:/outputstreamdemo2.txt

abcdef
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {new FileInputStream(new File("D:/outputstreamdemo2.txt"));FileInputStream in = new FileInputStream("D:/outputstreamdemo.txt");}
}
  • 读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回 -1
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {new FileInputStream(new File("D:/outputstreamdemo2.txt"));FileInputStream in = new FileInputStream("D:/outputstreamdemo.txt");int read = in.read();System.out.println((char) read);read = in.read();System.out.println((char) read);}
}

在这里插入图片描述

  • 使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {new FileInputStream(new File("D:/outputstreamdemo2.txt"));FileInputStream in = new FileInputStream("D:/outputstreamdemo.txt");int len = 0;byte[] read = new byte[2];while ( (len = in.read(read)) != -1){System.out.println(new String(read,0,len));}}
}

在这里插入图片描述

图片复制

准备工作:首先在D盘创建一个file1目录,在文件目录中存放一张照片,然后创建一个file2目录。
在这里插入图片描述

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class OutPutStreamDemo {public static void main(String[] args) throws IOException {FileInputStream in = new FileInputStream("D:\\file1\\basketball.jpg");FileOutputStream out = new FileOutputStream("D:\\file2\\test.jpg");int len =  0;byte[] buff = new byte[1024];while ((len = in.read(buff)) != -1){out.write(buff,0,len);}out.close();in.close();}
}

在这里插入图片描述

字符流

以字符为单位读写数据,专门用于处理文本文件。

字符输入流【FileReader】

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
读取字符数据:
数据准备:在D盘创建一个file1目录,里面放一个a.txt,文字内容为你好;
在这里插入图片描述

  • 读取字符: read() 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取
import java.io.File;
import java.io.FileReader;
import java.io.IOException;public class FileReaderDemo {public static void main(String[] args) throws IOException {File file = new File("D:\\file1\\a.txt");FileReader reader1 = new FileReader(file);FileReader reader2 = new FileReader("D:\\file2\\b.txt");int len = 0;while ((len = reader1.read()) != -1){System.out.print((char)len);}reader1.close();}
}

在这里插入图片描述

  • 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1
import java.io.File;
import java.io.FileReader;
import java.io.IOException;public class FileReaderDemo {public static void main(String[] args) throws IOException {File file = new File("D:\\file1\\a.txt");FileReader reader1 = new FileReader(file);int len = 0;char[] buff = new char[1024];while ((len = reader1.read(buff)) != -1){System.out.print(new String(buff,0,len));}reader1.close();}
}

在这里插入图片描述

字符输出流【FileWriter】

java.io.FileWriter 类是写出字符到文件的便利类

基本写出数据:

  • 写出字符: write(int b) 方法,每次可以写出一个字符数据。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo {public static void main(String[] args) throws IOException {File file = new File("D:\\file1\\a.txt");FileWriter writer = new FileWriter(file,true);writer.write(97);writer.write('c');writer.write(4000);writer.close();}
}

注意:
关闭资源时,与FileOutputStream不同。如果不关闭,数据只是保存到缓冲区,并未保存到文件。
这里涉及到一个问题,就是我们的close()方法执行后就无法使用同样的流对象来进行写数据了,所以我们可以使用flush()方法。

代码示例:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo {public static void main(String[] args) throws IOException {File file = new File("D:\\file1\\a.txt");FileWriter writer = new FileWriter(file,true);writer.write(97);writer.write('c');writer.write(4000);writer.flush();writer.write('d');writer.write('1');writer.close();}
}

在这里插入图片描述
flush :刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

写出其他数据:

  • 写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo {public static void main(String[] args) throws IOException {File file = new File("D:\\file1\\a.txt");FileWriter out = new FileWriter(file,true);char[] arr = "我的测试数据".toCharArray();out.write(arr); // 写入了 我的测试数据out.write(arr,2,2); // 写入了 测试out.close();}
}

在这里插入图片描述

  • 写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo {public static void main(String[] args) throws IOException {File file = new File("D:\\file1\\a.txt");FileWriter out = new FileWriter(file,true);String str = "你好世界";out.write(str); // 写入了 你好世界out.write(str,2,2); // 写入了 世界out.close();}
}

在这里插入图片描述
小tips:

  • 我们在创建FileWriter对象的时候,指定了boolean值的参数,这样我们的数据就可以进行续写了。
    在这里插入图片描述
  • 我们可以写出数据的时候进行换行。
    在这里插入图片描述

IO异常的处理(扩展知识)

  • JDK7前处理

通过try-catch-finally代码块来进行处理。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo {public static void main(String[] args){File file = new File("D:\\file1\\a.txt");FileWriter out = null;try {out = new FileWriter(file,true);String str = "你好世界";out.write(str); // 写入了 你好世界out.write("\r\n");out.write(str,2,2); // 写入了 世界} catch (IOException e) {e.printStackTrace();} finally {if (out != null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}}
}
  • JDK7的处理(的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。)
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class FileWriterDemo {public static void main(String[] args) {File file = new File("D:\\file1\\a.txt");try (FileWriter out = new FileWriter(file, true)) {String str = "你好世界";out.write(str); // 写入了 你好世界out.write("\r\n");out.write(str, 2, 2); // 写入了 世界} catch (IOException e) {e.printStackTrace();}}
}
  • JDK9的改进(对于引入对象的方式,支持的更加简洁)
public class TryDemo {public static void main(String[] args) throws IOException {// 创建流对象final FileReader fr = new FileReader("in.txt");FileWriter fw = new FileWriter("out.txt");// 引入到try中try (fr; fw) {// 定义变量int b;// 读取数据while ((b = fr.read())!=1) {// 写出数据fw.write(b);}} catch (IOException e) {e.printStackTrace();}}
}

Properties属性集(java.util)

java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。

  • public Object setProperty(String key, String value) : 保存一对属性。
  • public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
  • public Set stringPropertyNames() :所有键的名称的集合。

import java.io.FileNotFoundException;
import java.util.Properties;
import java.util.Set;public class ProDemo {public static void main(String[] args) throws FileNotFoundException {// 创建属性集对象Properties properties = new Properties();// 添加键值对元素properties.setProperty("filename", "D:\\file1");properties.setProperty("username", "root");properties.setProperty("password", "123456");// 打印属性集对象System.out.println(properties);// 通过键,获取属性值System.out.println(properties.getProperty("filename"));System.out.println(properties.getProperty("username"));System.out.println(properties.getProperty("password"));// 遍历属性集,获取所有键的集合Set<String> strings = properties.stringPropertyNames();// 打印键值对for (String key : strings) {System.out.println(key + " ‐‐ " + properties.getProperty(key));}}
}

在这里插入图片描述

  • public void load(InputStream inStream) : 从字节输入流中读取键值对。

数据准备:
首先创建一个D:\file1\a.txt文件。在文件中写入如下数据:

filename=测试Properties类
username=root
password=123456
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;public class ProDemo2 {public static void main(String[] args) throws IOException {// 创建属性集对象Properties pro = new Properties();// 加载文本中信息到属性集pro.load(new FileReader("D:\\file1\\a.txt"));// 遍历集合并打印Set<String> strings = pro.stringPropertyNames();for (String key : strings) {System.out.println(key + " ‐‐ " + pro.getProperty(key));}}
}

在这里插入图片描述

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

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

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

相关文章

《侃侃而谈 · 关于接外单的一些事》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

期末成绩发布方式

期末考试结束后&#xff0c;成绩单的发放总是让老师们头疼不已。想象一下&#xff0c;每个学生的成绩都需要老师一个个私信给家长&#xff0c;不仅耗时耗力&#xff0c;而且极易出错。 在传统的成绩单发放方式中&#xff0c;老师往往需要通过电子邮件、短信或者微信等方式&…

【Rust基础入门】Hello Cargo

文章目录 前言Cargo是什么&#xff1f;Cargo的作用查看cargo版本使用cargo创建项目Cargo.toml文件cargo build命令cargo runcargo check为发布构建 总结 前言 在Rust编程中&#xff0c;Cargo扮演着至关重要的角色。它是Rust的包管理器&#xff0c;负责处理许多任务&#xff0c…

【TB作品】51单片机 Proteus仿真 00002仿真-智能台灯色调倒计时光强

实验报告&#xff1a;基于51单片机的智能台灯控制系统 背景 本实验旨在设计一个基于51单片机的智能台灯控制系统&#xff0c;该系统可以通过按键进行手动控制&#xff0c;并能根据环境光强度自动调节台灯亮度。此外&#xff0c;系统还具备倒计时关灯功能。 器件连接 51单片…

软件运维服务方案(Word原件2024)

软件运维服务方案&#xff08;Word原件&#xff09; 1. 服务简述 我们提供全面的软件运维服务&#xff0c;确保软件系统的稳定运行。 1.1 服务内容 包括监控、维护、故障排查与优化。 1.2 服务方式 结合远程与现场服务&#xff0c;灵活响应客户需求。 1.3 服务要求 高效响应&am…

双向DFS——AcWing 171. 送礼物

双向DFS 定义 双向深度优先搜索&#xff08;Bi-directional Depth First Search, BD-DFS&#xff09;是一种在图或树中寻找两点间路径的算法。与传统的单向DFS不同&#xff0c;BD-DFS同时从起始节点和目标节点出发进行搜索&#xff0c;使用两个DFS过程。一个向前探索从起点到…

从一个(模型设计的)想法到完成模型验证的步骤

从有一个大型语言模型&#xff08;LLM&#xff09;设计的想法到完成该想法的验证&#xff0c;可以遵循以下实践步骤&#xff1a; 需求分析&#xff1a; 明确模型的目的和应用场景。确定所需的语言类型、模型大小和性能要求。分析目标用户群体和使用环境。 文献调研&#xff1a…

swiftui中常用组件picker的使用,以及它的可选样式

一个可选项列表就是一个picker组件搞出来的&#xff0c;它有多个样式可以选择&#xff0c;并且可以传递进去一些可选数据&#xff0c;有点像前端页面里面的seleted组件&#xff0c;但是picker组件的样式可以更多。可以看官方英文文档&#xff1a;PickerStyle | Apple Developer…

【对接支付宝支付详细流程】

下面示例使用的是支付宝的网页支付&#xff0c;最终的效果如图&#xff1a; 1.前置条件 对接支付宝你需要了解的知识点 1.加密算法 对称加密和非对称加密&#xff0c;RSA2加密算法&#xff0c;签名验证 2.支付宝平台openid unionId的概念 https://opendocs.alipay.com/pre…

文件管理下:文件函数的学习

前言 Hello,小伙伴们你们的作者君又来了&#xff0c;上次我们简单介绍了文件的坐拥并简单提到了数据的读取&#xff0c;和C语言的默认流的作用&#xff0c;今天我将继续带领大家探索文件的奥秘&#xff0c;大家准别好了吗&#xff1f; 在内容开始之前还是按照惯例&#xff0c…

初识java—jdk17的一些新增特性

文章目录 前言一 &#xff1a; yield关键字二 &#xff1a;var关键字三 &#xff1a;密封类四 &#xff1a;空指针异常&#xff1a;五&#xff1a;接口中的私有方法&#xff1a;六&#xff1a;instanceof关键字 前言 这里介绍jdk17相对于jdk1.8的部分新增特性。 一 &#xff…

QT使用QGraphicsView绘图 重写QGraphicsObject类实现点在QPainterPath路径上移动动画效果

闲谈&#xff1a;眨眼间&#xff0c;2024年就过去了一半了&#xff0c;年前定下的计划一个都没完成&#xff0c;乘着有空&#xff0c;把之前学习的内容和示例先总结了。 目录 导读SVG 转QPainterPath 路径获取QPainterPath指定长度时的坐标。重写QGraphicsObject类 实现点图元Q…

stm32精密控制步进电机(基础篇)

众所周知&#xff0c;步进电机由于使用脉冲控制&#xff0c;会比直流电机的控制稍难一些&#xff0c;但开环控制时也更加稳定。 落到做项目的时候&#xff0c;目前来说我都会先考虑步进电机&#xff0c;再去考虑直流&#xff0c;无刷这样的电机。包括毕设时所用的机械臂也是用…

并发处理 优先图和多重图

优先图(Precedence Graph)视图可串性多重图(Polygraph) 优先图(Precedence Graph) 优先图用于冲突可串性的判断。 优先图结构&#xff1a; 结点 (Node)&#xff1a;事务&#xff1b;有向边 (Arc): Ti → Tj &#xff0c;满足 Ti <s Tj&#xff1b; 存在Ti中的操作A1和Tj…

开源全新H5充值系统源码/自定义首页+充值页面/灵活对接上游渠道接口

开源全新H5充值系统源码&#xff0c;系统基于thinkphp框架开发&#xff0c;功能已全完善&#xff0c;可灵活对接其他上游渠道接口&#xff0c;默认对接了大猿人接口&#xff0c;另外可无限制自定义创建充值页面&#xff0c;首页支持后台自定义修改&#xff0c;支持三级分销&…

史上最全的自抗扰控制(ADRC)学习资料

史上最全的自抗扰控制&#xff08;ADRC&#xff09;学习资料 需要的私信我~ 需要的私信我~ 需要的私信我~ ​ 本文将作者近些年来学习ADRC算法的学习资料进行汇总&#xff0c;整理了这一版相对较全的学习资料&#xff0c;包含参考文献以及仿真案例&#xff0c;适合初学者入门&…

6、Redis系统-数据结构-05-整数

五、整数集合&#xff08;Intset&#xff09; 整数集合是 Redis 中 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不大时&#xff0c;就会使用整数集合这个数据结构作为底层实现。整数集合通过紧凑的内存布局和升级机制&#xff0c;实现了…

HiAI Foundation开发平台,加速端侧AI应用的智能革命

如果您是一名开发者&#xff0c;正在寻找一种高效、灵活且易于使用的端侧AI开发框架&#xff0c;那么HarmonyOS SDKHiAI Foundation服务&#xff08;HiAI Foundation Kit&#xff09;就是您的理想选择。 作为一款AI开发框架&#xff0c;HiAI Foundation不仅提供强大的NPU计算能…

直击2024 WAIC现场:关于大模型,热情、焦虑与冷静同在

世博展览馆内人们的热情&#xff0c;与世博中心内参与论坛的人们&#xff0c;心情似乎并不成正比。 展馆内人们看到的大模型加速落地是表象&#xff0c;也是结果&#xff1b;而论坛里的企业家和人工智能学者们则更关注大模型的未来发展方向和商业化进程&#xff0c;以及AI安全…

计算机的错误计算(二十三)

摘要 计算机的错误计算&#xff08;二十二&#xff09;阐明&#xff1a;对于结果应该为 0的算式&#xff0c;即使增加计算精度&#xff0c;也得不出0. 针对 &#xff0c;本节给出一种解决方案。 计算机的错误计算&#xff08;十九&#xff09;展示了计算机对 的错误计算&…