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的更多相关文章
随机推荐
- Excel 的盒须图 离群值 Outliers
Excel 中的盒须图 翻译自https://www.excel-easy.com/examples/box-whisker-plot.html 本示例教您如何在Excel中创建盒须图.盒须图显示了数 ...
- css 选择器再学一遍记录一下*1
1 <!DOCTYPE html> 2 <html> 3 <HEAD> 4 5 <style> 6 *{font-size: 12px; padding ...
- abap screen页签开发注意事项
问题描述:我比较懒,开发程序的时候所有的页签都是直接公用主程序的按钮功能,这就导致,当我按了按钮之后,SY-UCOMM里保存的是我自建按钮的code, 如果不进行页签跳转,或者按其他按钮的话,直接按下 ...
- 89、des加密算法
import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpe ...
- 2020ICPC上海I - Sky Garden
思维 [I-Sky Garden_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)(重现赛)@hzy0227 (nowcoder.com)](https://codeforces.co ...
- nodejs发布cesium问题,其他电脑访问发布
在电脑上安装nodejs后在选择的cesium文件中,按住shift和鼠标右键,打开powershell,输入命令行hs -p 1212,完成cesium的发布,出现两个网址,127.0.0.1:12 ...
- Docker emqx实践
把emqx服务迁移到另一台服务器上 1.新服务器安装docker apt install docker.io 1.从服务器上导出镜像 导出镜像文件: docker export 55d48d3a13 ...
- 转载:java中DAO层、Service层、Control层的说明
转自:https://blog.csdn.net/qq_22771739/article/details/82344336?utm_source=blogxgwz6 DAO层:DAO层叫数据访问层,全 ...
- Win10服务主机本地系统磁盘占用过高解决
前言:发现电脑卡,磁盘被本地系统占用好多.把尝试过的方法都发一下. 1.尝试用了网上的关闭家庭组: win+R打开运行输入:services.msc 打开Windows服务管理器.找到HomeGro ...
- [转]Selenium私房菜系列1 -- Selenium简介
一.Selenium是什么? Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,本系列现在主要包括以下4款: 1.Selenium Core:支持DHTML的测试案 ...