public class TestObjectInputStream {
public static void main(String[] args) {
//创建对象输入字节流与文件字节输入流对象
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/data3"))){
//将对象反序列化到内存中
Users users = (Users) ois.readObject();
System.out.println(users);
}catch(Exception e){
e.printStackTrace();
}
}
}
当以文件作为数据源或目标时,除了可以使用字符串作为文件以及位置的指定以外,我们也可以使用File类指定。
public class TestFile {
public static void main(String[] args) {
//创建字符缓冲流与文件字符输入流对象
try(BufferedReader br = new BufferedReader(new FileReader(new File("d:/sxt.txt")));
//创建字符输出流对象
PrintWriter pw = new PrintWriter(new File("d:/sxt8.txt"))){
//操作流
String temp = "";
int i=1;
while((temp = br.readLine()) != null){
pw.println(i+","+temp);
i++;
}
pw.flush();
}catch(IOException e){
e.printStackTrace();
}
}
}
装饰器模式简介
装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。
装饰器模式
class Iphone {
private String name;
public Iphone(String name) {
this.name = name;
}
public void show() {
System.out.println("我是" + name + ",可以在屏幕上显示");
}
}
class TouyingPhone {
public Iphone phone;
public TouyingPhone(Iphone p) {
this.phone = p;
}
// 功能更强的方法
public void show() {
phone.show();
System.out.println("还可以投影,在墙壁上显示");
}
}
public class TestDecoration {
public static void main(String[] args) {
Iphone phone = new Iphone("iphone30");
phone.show();
System.out.println("===============装饰后");
TouyingPhone typhone = new TouyingPhone(phone);
typhone.show();
}
}
IO流体系中的装饰器模式
IO流体系中大量使用了装饰器模式,让流具有更强的功能、更强的灵活性。比如:
FileInputStream fis = new FileInputStream(src);
BufferedInputStream bis = new BufferedInputStream(fis);
显然BufferedInputStream装饰了原有的FileInputStream,让普通的FileInputStream也具备了缓存功能,提高了效率。
Apache基金会介绍
Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。在它所支持的Apache项目与子项目中,所发行的软件产品都遵循Apache许可证(Apache License)。 官方网址为:www.apache.org 。
很多著名的Java开源项目都来源于这个组织。比如:commons、kafka、lucene、maven、shiro、struts等技术,以及大数据技术中的:hadoop(大数据第一技术)、hbase、spark、storm、mahout等。
commons-io工具包
Apache的commons-io工具包中提供了IOUtils/FileUtils,为我们提供了更加简单、功能更加强大的文件操作和IO流操作功能。非常值得大家学习和使用。
下载与添加commons-io包
下载地址
https://commons.apache.org/proper/commons-io/download_io.cgi
添加jar包
FileUtils类中常用方法的介绍
打开FileUtils的api文档,我们抽出一些工作中比较常用的方法,进行总结和讲解。总结如下:
| 方法名 | 使用说明 |
|---|---|
| cleanDirectory | 清空目录,但不删除目录 |
| contentEquals | 比较两个文件的内容是否相同 |
| copyDirectory | 将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的文件 |
| copyFile | 将一个文件拷贝到一个新的地址 |
| copyFileToDirectory | 将一个文件拷贝到某个目录下 |
| copyInputStreamToFile | 将一个输入流中的内容拷贝到某个文件 |
| deleteDirectory | 删除目录 |
| deleteQuietly | 删除文件 |
| listFiles | 列出指定目录下的所有文件 |
| openInputSteam | 打开指定文件的输入流 |
| readFileToString | 将文件内容作为字符串返回 |
| readLines | 将文件内容按行返回到一个字符串数组中 |
| size | 返回文件或目录的大小 |
| write | 将字符串内容直接写到文件中 |
| writeByteArrayToFile | 将字节数组内容写到文件中 |
| writeLines | 将容器中的元素的toString方法返回的内容依次写入文件中 |
| writeStringToFile | 将字符串内容写到文件中 |
读取文件内容,并输出到控制台上(只需一行代码!)
import java.io.File;
import org.apache.commons.io.FileUtils;
public class TestUtils1 {
public static void main(String[] args) throws Exception {
String content = FileUtils.readFileToString(new File("d:/a.txt"), "gbk");
System.out.println(content);
}
}
我们可以使用FileUtils完成目录拷贝,在拷贝过程中可以通过文件过滤器(FileFilter)选择拷贝内容。
import java.io.File;
import java.io.FileFilter;
import org.apache.commons.io.FileUtils;
public class TestFileUtilsDemo2 {
public static void main(String[] args) throws Exception {
FileUtils.copyDirectory(new File("d:/aaa"), new File("d:/bbb"), new FileFilter() {
@Override
public boolean accept(File pathname) {
// 使用FileFilter过滤目录和以html结尾的文件
if (pathname.isDirectory() || pathname.getName().endsWith("html")) {
return true;
} else {
return false;
}
}
});
}
}
打开IOUtils的api文档,我们发现它的方法大部分都是重载的。所以,我们理解它的方法并不是难事。因此,对于方法的用法总结如下:
| 方法名 | 使用说明 |
|---|---|
| buffer | 将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小 |
| closeQueitly | 关闭流 |
| contentEquals | 比较两个流中的内容是否一致 |
| copy | 将输入流中的内容拷贝到输出流中,并可以指定字符编码 |
| copyLarge | 将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝 |
| lineIterator | 返回可以迭代每一行内容的迭代器 |
| read | 将输入流中的部分内容读入到字节数组中 |
| readFully | 将输入流中的所有内容读入到字节数组中 |
| readLine | 读入输入流内容中的一行 |
| toBufferedInputStream,toBufferedReader | 将输入转为带缓存的输入流 |
| toByteArray,toCharArray | 将输入流的内容转为字节数组、字符数组 |
| toString | 将输入流或数组中的内容转化为字符串 |
| write | 向流里面写入内容 |
| writeLine | 向流里面写入一行内容 |
我们没有必要对每个方法做测试,只是演示一下读入d:/sxt.txt文件内容到程序中,并转成String对象,打印出来。
IOUtils的使用
import java.io.*;
import org.apache.commons.io.IOUtils;
public class TestIOUtilsDemo {
public static void main(String[] args) throws Exception {
String content = IOUtils.toString(new FileInputStream("d:/sxt.txt"),"utf-8");
System.out.println(content);
}
}
按流的方向分类:
按流的处理数据单元分类:
按流的功能分类:
IO的四个基本抽象类:InputStream、OutputStream、Reader、Writer
InputStream的实现类:
OutputStream的实现类:
Reader的实现类
Writer的实现类
把Java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为Java对象的过程称为对象的反序列化。