JavaSE学习笔记(十)IO流_part2
1 缓冲流
- 缓冲流也称为高效流、或者高级流;之前的字节流可以称为原始流
- 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
1.2 字节缓冲流
字节缓冲流性能优化原理:
- 字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好
- 字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了
构造器 | 说明 |
---|---|
public BufferedInputStream(InputStream is) | 可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能 |
public BufferedOutputStream(OutputStream os) | 可以把低级的字节输出流包装成一个高级的缓冲字节输出流管道,从而提高写数据的性能 |
功能上并无很大变化,性能提升了
try (// 这里面只能放置资源对象,用完会自动关闭:自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作)// 1、创建一个字节输入流管道与原视频接通InputStream is = new FileInputStream("D:\\resources\\newmeinv.jpeg");// a.把原始的字节输入流包装成高级的缓冲字节输入流InputStream bis = new BufferedInputStream(is);// 2、创建一个字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("D:\\resources\\newmeinv222.jpeg");// b.把字节输出流管道包装成高级的缓冲字节输出流管道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("复制完成了!");} catch (Exception e){e.printStackTrace();
}
1.3 字符缓冲流
- 作用:提高字符输入流读取/写数据的性能,除此之外多了按照行读取数据的功能
构造器 | 说明 |
---|---|
public BufferedReader(Reader r) | 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能 |
public BufferedWriter(Writer w) | 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 |
字符缓冲输入流新增功能
方法 | 说明 |
---|---|
public String readLine() | 读取一行数据返回,如果读取没有完毕,无行可读返回null |
public void newLine() | 换行操作 |
try (// 1、创建一个文件字符输入流与源文件接通。Reader fr = new FileReader("io-app2/src/data01.txt");// a、把低级的字符输入流包装成高级的缓冲字符输入流。BufferedReader br = new BufferedReader(fr);){// 2、用循环,每次读取一个字符数组的数据。 1024 + 1024 + 8
// char[] buffer = new char[1024]; // 1K字符
// int len;
// while ((len = br.read(buffer)) != -1) {// String rs = new String(buffer, 0, len);
// System.out.print(rs);
// }String line;while ((line = br.readLine()) != null){System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
字符缓冲流自带8K缓冲区
可以提高原始字符流读写数据的性能
2 转换流
- 作用:防止用UTF-8编码方式的代码读取GBK编码方式的文件产生乱码
必须文件和代码编码一致才不会乱码
构造器 | 说明 |
---|---|
public InputStreamReader(InputStream is) | 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样 |
public InputStreamReader(InputStream is ,String charset) | 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点) |
输入一定是字节流 InputStream
// 代码UTF-8 文件 GBK "D:\\resources\\data.txt"
// 1、提取GBK文件的原始字节流。
InputStream is = new FileInputStream("D:\\resources\\data.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);
}
- 如果需要控制写出去的字符使用的编码,怎么办?
- 可以把字符以指定编码获取字节后再使用字节输出流写出去:
java“方佬肆”.getBytes(编码)
- 也可以使用字符输出转换流实现。
- 可以把字符以指定编码获取字节后再使用字节输出流写出去:
构造器 | 说明 |
---|---|
public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。 |
public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照指定编码转换成字符输出流(重点) |
// 1、定义一个字节输出流
OutputStream os = new FileOutputStream("io-app2/src/out03.txt");// 2、把原始的字节输出流转换成字符输出流
// Writer osw = new OutputStreamWriter(os); // 以默认的UTF-8写字符出去 跟直接写FileWriter一样
Writer osw = new OutputStreamWriter(os , "GBK"); // 指定GBK的方式写字符出去// 3、把低级的字符输出流包装成高级的缓冲字符输出流。
BufferedWriter bw = new BufferedWriter(osw);bw.write("方佬大");
bw.write("方佬贰");
bw.write("方佬叄");
bw.write("方佬肆");bw.close();
3 序列化对象
3.1 对象序列化
- 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
- 使用到的流是对象字节输出流:ObjectOutputStream
序列化对象必须实现Serializable序列化接口
public class Student implements Serializable {...
}
构造器 | 说明 |
---|---|
public ObjectOutputStream(OutputStream out) | 把低级字节输出流包装成高级的对象字节输出流 |
方法名称 | 说明 |
---|---|
public final void writeObject(Object obj) | 把对象写出去到对象序列化流的文件中去 |
// 1、创建学生对象
Student s = newStudent("方佬肆", "fanglaosi", 21);// 2、对象序列化:使用对象字节输出流包装字节输出流管道
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io-app2/src/obj.txt"));// 3、直接调用序列化方法
oos.writeObject(s);// 4、释放资源
oos.close();
3.2 对象反序列化
- 作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化
- 使用到的流是对象字节输入流:ObjectInputStream
构造器 | 说明 |
---|---|
public ObjectInputStream(InputStream out) | 把低级字节输入流包装成高级的对象字节输入流 |
方法名称 | 说明 |
---|---|
public Object readObject() | 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回 |
// 1、创建对象字节输入流管道包装低级的字节输入流管道
ObjectInputStream is = new ObjectInputStream(new FileInputStream("io-app2/src/obj.txt"));// 2、调用对象字节输入流的反序列化方法
Student s = (Student) is.readObject();System.out.println(s);
4 打印流
- 作用:打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStream,PrintWriter两个类
- 可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true
PrintStream和PrintWriter的区别
- 打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)
- PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。
- PrintWriter继承自字符输出流Writer,支持写字符数据出去。
PrintStream
构造器 | 说明 |
---|---|
public PrintStream(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintStream(File f) | 打印流直接通向文件对象 |
public PrintStream(String filepath) | 打印流直接通向文件路径 |
方法名称 | 说明 |
---|---|
public void print(Xxx xx) | 打印任意类型的数据出去 |
PrintWriter
构造器 | 说明 |
---|---|
public PrintWriter(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintWriter (Writer w) | 打印流直接通向字符输出流管道 |
public PrintWriter(File f) | 打印流直接通向文件对象 |
public PrintWriter(String filepath) | 打印流直接通向文件路径 |
方法名称 | 说明 |
---|---|
public void print(Xxx xx) | 打印任意类型的数据出去 |
PrintWriter ps = new PrintWriter("io-app2/src/ps.txt"); // 打印功能上与PrintStream的使用没有区别ps.println(97);
ps.println('a');
ps.println(23.3);
ps.println(true);
ps.println("我是打印流输出的,我是啥就打印啥");ps.close();
输出语句重定向
System.out.println("锦瑟无端五十弦");
System.out.println("一弦一柱思华年");// 改变输出语句的位置(重定向)
PrintStream ps = new PrintStream("io-app2/src/log.txt");
System.setOut(ps); // 把系统打印流改成我们自己的打印流System.out.println("庄生晓梦迷蝴蝶");
System.out.println("望帝春心托杜鹃");
5 Properties
- Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去
- 属性文件:后缀是.properties结尾的文件,里面的内容都是 key=value,后续做系统配置信息的
其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用
方法名称 | 说明 |
---|---|
void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
public Object setProperty(String key, String value) | 保存键值对(put) |
public String getProperty(String key) | 使用此属性列表中指定的键搜索属性值 (get) |
public Set stringPropertyNames() | 所有键的名称的集合 (keySet()) |
5.1 将键值对信息存到配置文件中
Properties properties = new Properties();
properties.setProperty("方佬大", "123456"); // 保存键值对(put())
properties.setProperty("方佬贰", "123456");
properties.setProperty("方佬叄", "456789");
properties.setProperty("方佬肆", "456789");
System.out.println(properties);/**param1:保存管道,字符输出流管道param2:保存注释*/
properties.store(new FileWriter("Javacode\\users.properties"), "this is users!!");
5.2 Properties读取属性文件中的键值对信息
Properties properties = new Properties();
System.out.println(properties);// 加载属性文件中的键值对数据到属性对象properties中去
properties.load(new FileReader("Javacode\\users.properties"));System.out.println(properties);
String rs = properties.getProperty("方佬大"); // 使用指定的键搜索属性值(set())
System.out.println(rs); //123456
String rs1 = properties.getProperty("方佬肆"); // 使用指定的键搜索属性值
System.out.println(rs1); //456789
String s = properties.stringPropertyNames(); // 所有键的名称的集合(keyset())
6 IO框架:commons-io
- commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率
- commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils
导入步骤:
Step1:在项目中创建一个文件夹:lib
Step2:将commons-io-2.6.jar文件复制到lib文件夹
Step3:在jar文件上点右键,选择 Add as Library -> 点击OK
Step4:在类中导包使用
方法名称 | 说明 |
---|---|
String readFileToString(File file, String encoding) | 读取文件中的数据, 返回字符串 |
void copyFileToDirectory(File srcFile, File destDir) | 复制文件 |
void copyDirectoryToDirectory(File srcDir, File destDir) | 复制文件夹 |
// 完成文件复制到某个文件夹下
FileUtils.copyFileToDirectory(new File("D:\\resources\\hushui.jpeg"), new File("D:/"));// 完成文件夹复制到某个文件夹下
FileUtils.copyDirectoryToDirectory(new File("D:\\resources") , new File("D:\\new"));// 删除某个文件夹
FileUtils.deleteDirectory(new File("D:\\new"));
JavaSE学习笔记(十)IO流_part2相关推荐
- java学习笔记-初学IO流
目 录 什么是IO IO流的分类 Java中的IO流 java中需要掌握的流:16个 字节流 java.io.FileInputStream(字节输入流) java.io.FileOutputStre ...
- Python学习笔记十 IO编程
参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 IO编程 I ...
- javaSE学习笔记——第十四天正则表达式、Math类、System类、Data类、Calendar类等
javaSE学习第十四天 java知识 正则表达式的概述和简单使用 A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. 作用:比如 ...
- 重拾JavaSE学习笔记
重拾JavaSE学习笔记 1.常用DOS命令 2.了解Java 2.1 .java特性 2.2.JDK .JRE.JVM 2.3.java的加载和执行 3.开发环境搭建 3.1.安装jdk 3.2.配 ...
- JavaSE学习笔记(持续更新)
这里写目录标题 JavaSE学习笔记(持续更新) Java跨平台原理与核心机制 1.跨平台原理: 2.两种核心机制: JDK11的安装流程 Java程序开发的三个步骤(无编辑器版) Eclipse安装 ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- IOS之学习笔记十五(协议和委托的使用)
1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...
- 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进
吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...
- 吴恩达《机器学习》学习笔记十二——机器学习系统
吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...
- 吴恩达《机器学习》学习笔记十——神经网络相关(2)
吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...
最新文章
- python中文读音ndarray-NumPy与ndarray简介(转)
- 小场景带来大提升:“AI之眼”加持工厂品控流水线,质检质量提升80%
- ASP.NET Core 注册单例方案
- gulpfile笔记
- 【养生之道】电脑族必吃日常防辐射食品
- http keepalive原理
- 毕业设计管理系统小结
- 使用rsync搭建自用的开源镜像站
- mac brew 启动服务时报错“Bootstrap failed: 5: Input/output error”
- mysql切片库_Database数据库切片模式
- 春节期间,怎样晒朋友圈才安全?
- “本地资源检测” 上手指南,玩转最前沿的优化黑科技!
- 全球与中国线路型避雷器市场发展前景与投资战略规划分析报告2022~2028年
- Ubuntu18.04下的PCL安装(摸爬滚打)
- python获取财务数据曝光_Python-股票-从网易财经获取主要财务指标数据
- win10如何设置某软件为系统默认程序(应用)?
- 从mysql8.0读取数据并形成pandas dataframe类型数据,精确定位行列式中的元素,并读取...
- 如何判断三角形的朝向
- 服务器重启之后NVIDIA出现问题原因汇总
- 神盾局特工第一季/全集Agents Of SHIELD迅雷下载