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的更多相关文章
随机推荐
- Android MD5加密、RSA加密
现在公司做金融项目,需要考虑安全加密方面的问题.感谢大牛同事(冯哥) ,给我很大的帮助. 考虑到安全优化,我们把秘钥.加密步骤放到native中.考虑用到的技术:(1 )jni,(2 )OpenSSL ...
- SpannableString 设置文字中的颜色 链接
SpannableString spannableString = new SpannableString(matchResult); int index = matchResult.indexOf( ...
- Beginning IOS 7 Development Exploring the IOS SDK - Navigation Controllers and Table Views
Note You may notice that the familyNames property is declared using the copy keyword instead of stro ...
- ubuntu 逻辑卷增加磁盘
使用lv* 相关的命令 lvdisplay lvscan ACTIVE '/dev/ubuntu-vg/ubuntu-lv' [<74.00 GiB] inherit lv ...
- Flink写入Redis集群 重写flink-connector-redis包,解决Cluster无法输入密码问题
起因:使用flink的时候难免和redis打交道,相信大家都使用过flink-connector-redis来处理,但是当我想要使用RedisSink写入集群时,发现居然不支持使用密码,于是有了这篇笔 ...
- SQL Server性能优化
源代码文件 1,什么是性能问题? 现有资源没有达到最大吞吐量的前提下,系统不能满足合理的预期表现,则可以定义为有性能问题.性能指标包括:响应时间,吞吐量,可扩展性. 2,初探优化 2.1优化论 一般遇 ...
- video.js 苹果手机设置了currentTime却还是从头播放?
最近在项目(方案大赛)中需要保存学习进度,用户再打开页面时会从上次的视频进度继续观看.我们使用了video.js,在PC浏览器和安卓手机上均可以跳转,但是苹果手机很顽固的从头开始了呢-- 后来我们在 ...
- 【2】locust性能测试原理分析+登录测试脚本+总结
login_per_test1.py #对登录功能进行单点性能测试(一组测试数据)#发送首页请求,通过locust进行性能测试from locust import HttpLocust,task,T ...
- vue编辑修改,点击取消操作时,table内的内容不变
1.父组件内 2.子组件内(使用JSON.parse(JSON.stringify(xxx值))) 进行深拷贝
- git stash (pycharm/vscode的gui演示)
git stash (pycharm/vscode的gui演示) 场景 代码刚写到一半,发现线上bug需要马上修改部署上线 此时手头的代码写一半,提交根本跑不动甚至影响原来的业务了 回滚就白瞎搬了好几 ...