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 |
所有键的名称集合(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