JAVA——IO流进阶:功能流与commonsio工具类
一,功能流(处理流)
功能流是为增强、提升性能的,本身不具备直接操作节点的能力。
1.1 Buffered缓存流
功能流的一种:
缓冲流: 增强功能,提高性能
使用: 功能流(节点流)
字节缓冲流:
字节输入缓冲流 BufferedInputStream
字节输出缓冲流 BufferedOutputStream
无新增方法,可以发生多态
字符缓冲流:
BufferedReader 新增方法 readLine() 读取一行
BufferedWriter 新增方法 newLine() 写出换行符
不能发生多态,因为父类引用对子类新增方法不可见
示例代码:字节输入缓冲流 BufferedInputStream
//1、创建源,建立联系
File src =new File("test.txt");
//2、选择缓冲流
InputStream is =new BufferedInputStream(new FileInputStream(src));
//3、操作 : 多个读取
byte[] car =new byte[2];
int len =0;
while(-1!=(len=is.read(car))){
//获取数组的内容 字节数组转字符串 new String(字节数组,0,length)
System.out.println(new String(car,0,len));
}
//4、释放资源
is.close();
字符输入缓冲流 BufferedReader
//创建源:
File src =new File("test.txt");
//使用字符缓冲流 提高性能读取文件 +新增方法(不能使用多态)
BufferedReader br =new BufferedReader(new FileReader(src));
//操作 行读取
String line=null;
//readLine()可以直接读取一行数据
while(null!=(line=br.readLine())){
System.out.println(line);
}
//释放资源
br.close();
1.2 数据处理流
DataInputStream 基本数据类型输入流
新增方法: read…();
DataOutputStream 基本数据类型输入流
新增方法: write…();
必须先写,再读。读的顺序必须和写的顺序保持一致
可以处理基本类型+String,保留数据的类型。前提是读取顺序与写出顺序一致,否则读取数据不正确
/**
* 数据+类型 输出到文件
* @param destPath
* @throws IOException
*/
public static void write(String destPath) throws IOException{
int point = 2;
long num = 100L;
String str = "数据类型";
//创建源
File dest = new File(destPath);
//选择流
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dest)));
//操作 写出的顺序 为读取作准备
dos.writeInt(point);
dos.writeLong(num);
dos.writeUTF(str);
dos.flush();
//释放资源
dos.close();
}
1.3 Object对象流
作用: 可能读写数据保留数据的数据类型(引用数据类型|基本数据类型)
序列化 : 将对象类型的数据转为一个可以存储|可以传输的过程
反序列化 : 反转状态(转为java中的对象格式)
ObjectInputStream 反序列化输入流
新增方法: Object readObject() 从ObjectInputStream中读取一个对象。
ObjectOutputStream 序列化输出流
新增方法: void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
注意:
- 先序列化后反序列化
- 读入与写出的顺序要保持一致
- 不是所有类型的数据都能够序列化 需要实现一个空接口 java.io.Serializable
- 不是所有的属性都需要序列化 transient修饰
- 静态的变量不会序列化
- 父类有实现序列化接口,子类可以序列所有成员
- 子类实现了序列化接口父类没有实现,子类只能序列化自己独有的内容
序列化
package com.xxxx.myio;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
/*
序列化一个对象到文件
*/
public class Demo005 {
public static void main(String[] args) throws Exception {
// 确定目的地
File file = new File("a.txt");
// 选择流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
// 写数据
Student stu = new Student("zas",18,false);
oos.writeObject(stu);
oos.flush();
// 释放资源
oos.close();
}
}
反序列化
/**
* 反序列化:
* 1、先写入再读取
* 2、读取对象需要知道具体类型,依次读取
* 注意:
* 1)不是所有的对象都可以序列化 Serializable
* 2)不是所有的属性都需要序列化 transient
*/
public static void read(String srcPath) throws FileNotFoundException,IOException, ClassNotFoundException{
//创建源
File src=new File(srcPath);
//选择流 OjbectInputStream
ObjectInputStream dis=new ObjectInputStream(new BufferedInputStream(new FileInputStream(src)));
//操作 读取的顺序与写出的顺序一致 必须存在才能读取
Object obj=dis.readObject();
if(obj instanceof Employee){
Employee emp=(Employee)obj;
System.out.println(emp.getName());
System.out.println(emp.getSalary());
}
obj=dis.readObject();
int[]arr=(int[])obj;
System.out.println(Arrays.toString(arr));
//释放资源
dis.close();
}
二,Commons-io工具类
CommonsIO 是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons IO可以很方便的读写 文件,url源代码等。commons-IO 需要加入classpath 的第三方 jar 包内的 class 文件才能在项目中使用
2.1 IO工具类IOUtils
此方法有多个重载方法,满足不同 的输入输出流,
IOUtils.copy(InputStream input, OutputStream output)
这个方法适合拷贝较大的数据流,比如2G以上 ,默认会用1024*4的buffer来读取
IOUtils.copyLarge(Reader input, Writer output)
通过文本获取输入流 , 可以指定编 码格式
IOUtils.toInputStream(String input, String encoding)
获取一个缓冲输入流,默认缓冲大小 1KB,也可以指定缓冲大小
IOUtils.toBufferedInputStream(InputStream input)
获取一个字符缓冲流,可指定缓冲大小
IOUtils.toBufferedReader(Reader reader)
2.2 IO 工具类 FilenameUtils
这个工具类是用来处理文件名(文件路径)的,可以轻松解决不同操作系统文件名称规范不同的问题,
里面的方法都是静态的,直接用类进行调用
FilenameUtils.getBaseName(String filename) // 去除目录和后缀后的文件名
FilenameUtils.getExtension(String filename) // 获取文件的后缀
FilenameUtils.getName(String filename) // 获取文件名
FilenameUtils.getPath(String filename) // 去除盘符后的路径
FilenameUtils.getPrefix(String filename) // 盘符
isExtension(String fileName, String text) // 判断fileName是否是text后缀名
2.3 IO 工具类 FileUtils
复制文件夹
复制文件夹(文件夹里面的文件内容 也会复制)
FileUtils.copyDirectory(File srcDir, File destDir)
复制文件夹, 带有文件过滤功能
FileUtils.copyDirectory(File srcDir, File destDir, FileFilter filter)
以子目录的形式将文件 夹复制到到另一个文件夹下
FileUtils.copyDirectoryToDirectory(File srcDir, File destDir)
复制文件
复制文件
FileUtils.copyFile(File srcFile, File destFile)
复制文件到一个指定的目录
FileUtils.copyFileToDirectory(File srcFile, File destDir)
把字符串写入文件
字符串以指定 的编码写到文件
FileUtils.writeStringToFile(File file, String data, String encoding)
指定是否追加
FileUtils.writeStringToFile(File file, String data, String encoding, boolean append)
字节数组写入文件
系列方法,可以指定追加,偏移 量等
FileUtils.writeByteArrayToFile(File file, byte[] data)
文件移动
移动文件
FileUtils.moveFile(File srcFile, File destFile)
删除文件
删除文件夹,包括文件夹和文件夹里面所有的文件
FileUtils.deleteDirectory(File directory)