heimaJava17
java
IO流
缓冲流
概念
- 缓存流也称为高效流、或者高级流。之前学习的字节流也可以称为原始流
- 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
分类
字节缓冲流
字节缓冲输入流:BufferedInputStream
- 提高字节输入流读取数据的性能,读写功能并无变化
字节缓冲输出流:BufferedOutputStream
- 提高字节输出流读取数据速度,读写功能并无变化
构造器 说明 public BufferedInputStream(InputStream is) 可以把低级字节输入流包装称一个高级的缓冲字节输入流管道,从而提高字节输入流读取数据的性能 public BufferedOutputStream(OutputStream os) 可以把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能 1.字节缓冲流为什么提高了操作数据的性能
- 字节缓冲流自带8KB缓冲区
- 可以提高原始字节流、字符流读写数据的性能
2.推荐使用那种方式提高字节流读写数据的性能?
- 建议使用字节缓冲输入流、字节缓冲输出流,结和字节数组的方式,目前看来是性能最优的组合
字符缓冲流
- 字符缓冲输入流:BufferedReader
- 作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。
构造器 说明 public BufferedReader(Reader r) 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能 字符缓冲输入流新增功能
方法 说明 public String readLine() 读取一行数据返回,如果读取没有完毕,无行可读返回NULL - 字符缓冲输出流:BufferedWriter
- *** 作用:提高字符输出流写取数据的性能,除此之外多了换行功能***
构造器 说明 pblic BufferedWriter(Writer w) 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 方法 说明 public void newLine() 换行操作 #### 转换流
- 字符缓冲输入流:BufferedReader
字符输入转换流
字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流
构造器 说明 public InputStreamReader(InputStream is) 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样 public InputStreamReader(InputStream is,String charset) 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不会乱码了(重点) package com.yu.Day1006Demo; import java.io.*; public class InputStreamReaderDemo01 {
public static void main(String[] args) throws Exception {
try (
// Reader isr = new FileReader("C:\\Users\\DELL\\Desktop\\yujava\\image\\ceshi.txt");
/**运行结果
*abc come��ιabc come��ι
* abc come��ι
* abc come��ι
* abc come��ι
* abc come��ι
* abc come��ι
* abc come��ι
* 产生乱码
* 原因:编码格式为Utf-8,读取的文件格式为GBK需要转换格式
*/
InputStream is = new FileInputStream("C:\\Users\\DELL\\Desktop\\yujava\\image\\ceshi.txt");
Reader isr = new InputStreamReader(is,"GBK");
BufferedReader br = new BufferedReader(isr);
){
String Str;
while((Str = br.readLine()) != null){
System.out.println(Str);
}
}
catch (Exception e) {
e.printStackTrace();
}
}}
abc come的喂abc come的喂
abc come的喂
abc come的喂
abc come的喂
abc come的喂
abc come的喂
abc come的喂
字符输入转换流
- OutputStreamWriter
- 可以把字节输出流按照指定编码转换成字符输出流
| 构造器 | 说明 |
|---|---|
| public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流,几乎不用 |
| public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流 |
对象序列化
- 作用:以内存为基准,把内存 中的对象存储到磁盘文件中去,称为对象序列化
- 使用到的流是对象字节输出流:ObjectOutputStream
| 构造器 | 说明 |
|---|---|
| public ObjectOutputStream(OutputStream out) | 把低级字节输出流包装成高级的对象字节输出流 |
ObjectOutputStream序列化方法
| 方法名称 | 说明 |
|---|---|
| public final void writeObject(Object obj) | 把对象写出去到对象序列化流的文件中去 |
注意事项
1.对象如果需要序列化,必须实现Serializable序列化接口
2.但想要某个数据不参与序列化时前面在创建对象的时候加
transinent修饰的成员变量不参与序列化
对象反序列化
- 使用到的流是对象字节输入流,:ObjectInputStream
- ***作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化
| 构造器 | 说明 |
|---|---|
| public ObjectInputStream(InputStream out) | 把低级字节输入流包装成高级的对象字节输入流 |
ObjectInputStream序列化方法
| 方法名称 | 说明 |
|---|---|
| public Object readObject() | 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回 |
注意事项
- 声明序列化版本号
序列化的版本号与反序列化的版本号一致才不会出错
private static final long seriolVer
打印流
- 作用:打印流可以实现方便、高效的打印数据到文件中去。
- 打印流一般是指:PrintStream,PrintWriter两个类
PrintStream
| 构造器 | 说明 |
|---|---|
| public PrintStream(OutputStream os) | 打印流直接通向字节输出流管道 |
| public PrintStream(File f) | 打印流直接通向文件对象 |
| public PrintStream(String filepath) | 打印流直接通向文件路径 |
| 方法 | 说明 |
|---|---|
| public void print(XXX xxx) | 打印任意类型的数据出去 |
PrintWrite
| 构造器 | 说明 |
|---|---|
| public PrintWriter(OutputStream os) | 打印流直接通向输出流管道 |
| public PrintWriter(Writer w) | 打印流直接通向字符输出流管道 |
| public PrintWriter(File f) | 打印流直接通向文件对象 |
| public PrintWriter(String filepath) | 打印流直接通向文件路径 |
| 方法 | 说明 |
|---|---|
| public void print(XXX xxx) | 打印任意类型的数据出去 |
PrintStream和PrintWriter的区别
- 打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)
- PrintStream继承自字节输出流OutputStream,支持写字节数据的方法
- PrintWriter继承字符输出流Writer,支持写字符数据出去
总结
1.打印流有几种?各有什么优点?
- 打印流一般是指:PrintStream,PrintWriter两个类
- 打印功能两者是一样的使用方式
- PrintStream继承自字节输出流OutputStream,支持写字节
- PrintWriter继承自字符输出流Writer,支持写字符
2.打印流的优势是什么
- 两者在打印功能上都是使用方便,性能高效(核心优势)
输出重定向
//改变文件输出语句的位置
PrintStream ps = new PrintStream("输出文件位置");
System。setOut(ps);
补充知识
Properties属性集对象
- 其实就是一个Map集合,但是一般不会当集合使用,因为HashMap更好用
Properties核心作用
- Properties代表的是一个属性文件,可以把自己对象中的键值对学习存入到一个属性文件中去。
- 属性文件:后缀是.properties结尾的文件,里面内容都是key=value,后续做系统配置信息的。
Properties的API
- Properties和IO流结和的方法
| 构造器 | 说明 |
|---|---|
| void load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对) |
| void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
| void store(OutputStream out,String comments) | 将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(InputStream)方法的格式写入输出字节流 |
| void store(Writer writer,String comments) | 将此属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输出字符流 |
| public Object setProperty(String key,String value) | 保存键值对(put) |
| public String getProperty(String key,String value) | 使用此属性列表中指定的键搜索属性值(get) |
| public Set StringPropertyNames() | 所有键的名称集合(keyset) |
存储
package com.yu.Day1006Demo;
import java.io.FileWriter;
import java.util.Properties;
public class PropertiesDemo01 {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.setProperty("admin","admin");
properties.setProperty("yu","xiao");
properties.setProperty("xiao","yu");
System.out.println(properties);
/**
* 参数一:保存管道 字符输出流管道
* 参数二:保存心得
*/
properties.store(new FileWriter("src\\user.properties"),"100");
}
}
读取
package com.yu.Day1006Demo;
import java.io.FileReader;
import java.util.Properties;
public class PropertiesDemo02 {
public static void main(String[] args)throws Exception {
Properties properties = new Properties();
System.out.println(properties);
//将存储到user.properties文件内地内容读取出来
properties.load(new FileReader("src\\user.properties"));
System.out.println(properties);
String rs = properties.getProperty("yu");
System.out.println(rs);
String rs1 = properties.getProperty("xiao");
System.out.println(rs1);
}
}
作用
- 可以存储Properties属性集的键值对数据到属性文件中去
- void store(Writer writer,String comments)
- 可以加载属性文件中的数据到Properties对象中来
- void load(Reader reader)
IO框架
commons-io 概述
- commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率。
- commons-io工具包提供了很多有关io操作的类 。有两个主要的类FileUtils,IOUtils
FileUtils主要有如下方法:
| 方法名 | 说明 |
|---|---|
| String readFileToString(File file,String encoding) | 读取文件中的数据,返回字符串 |
| void copyFile(File srcFile,File destFile) | 复制文件 |
| void copyDirectoryToDirectory(File srcDir,File destDir) | 复制文件夹 |
下载网址https://commons.apache.org/proper/commons-io/download_io.cgi
heimaJava17的更多相关文章
随机推荐
- windows使用问题(win10)
常见问题 遇到修改文件夹名称被程序占用解决办法 1.ctrl+shift+esc进入任务管理器 2.打开性能-资源监视器 3.关联的句柄搜索框输入文件夹名称 4.搜查出来暂用文件夹程序选中右键将其关闭
- .net基础—委托和事件
委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联. 可以通过委托实例调用方法.可以将任何可访问类或结构中与 ...
- TCP连接connect函数返回错误
如果是 TCP 套接字,那么调用 connect 函数将激发 TCP 的三次握手过程,而且仅在连接建立成功或出错时才返回.其中出错返回可能有以下几种情况: 三次握手无法建立,客户端发出的 SYN 包没 ...
- Comparator与Comparable实现List中某一对象属性排序
//实体类实现 Comparable接口 进行降序排序 public class TestCompare implements Comparable<TestCompare>{ priva ...
- window 画工业图软件
1.autoCAD 2.visio 3.CorelDraw 4.DrawIO
- 物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器
物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器 VX : orihard2014 标签: 条码识别扫码器, 自动分拣读码器, 物流扫码固定式扫描相机, 物流扫码相机
- vue 在 v-for 时给每项元素绑定事件需要用事件代理吗?为什么?
vue本身不做事件代理(react将所有事件都委托到document上,然后进行派发) 普通html元素和在组件上挂了.native修饰符的事件.最终EventTarget.addEventListe ...
- linux 系统⽇常管理--运维必备
[监控系统的状态] 1. w 查看当前系统的负载 相信所有的linux管理员最常⽤的命令就是这个'w' 了,该命令显⽰的信息还是蛮丰富 的.第⼀⾏从左⾯开始显⽰的信息依次为:时间,系统运⾏时间,登录⽤ ...
- 实验:STM32F103烧写支持Arduino
1.搭建烧写环境 烧写器:ST-LINK. 2.启动stm32 flash烧写工具 3.连接识别CPU 4.打开generic-boot20_pc13.bin 5.烧写程序 6.查上miniUS ...
- 「SOL」NOI2017Day2 T1T2
就当我没做过这套题 而且 T3 也不会 Day2 A. 游戏 > Link 游戏 - LOJ 做过 2-sat 的读者应该能够一眼秒出这道题的正解 -- \(\mathcal O(2^d)\) ...