流的分类
jdk中提供了各种不同的流用于处理不同的输入输出源,根据流性质划分分为以下类型:
-
按流向分(站在程序角度考虑)
-
输入流(input)
-
输出流(output)
-
-
按类型分:
-
字节流(InputStream/OutputStream)
-
字符流(Reader/Writer)
-
-
按功能分:
-
节点流(低级流:直接跟输入输出源对接)
-
FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter...
-
-
处理流(高级流:建立在低级流的基础上)
-
转换流
-
缓冲流
-
-
文件拷贝
文件拷贝的原理即:将一个源文件(标准文件)拷贝到指定目录中,通过输入流获取源文件的输入流,再通过获取目标文件的输出流,完成读写过程,如下:
public class FileCopy {
/**
* 完成文件拷贝
* @param source 源文件
* @param targetDir 目标目录
*/
public void copy(File source,File targetDir){
//根据指定的目录以及源文件名称构建新的file对象
File target = new File(targetDir,source.getName());
InputStream is = null;
OutputStream os = null;
try {
//创建源文件的输入流
is = new FileInputStream(source);
//创建目标文件的输出流
os = new FileOutputStream(target);
//声明字节缓冲区
byte[] b = new byte[1024];
//声明临时变量存储每次读取的真实长度
int len = 0;
System.out.println("开始拷贝...");
while((len = is.read(b)) != -1){
//将读取到源文件的字节信息通过目标文件输出流写入到目标文件
os.write(b,0,len);
}
System.out.println("拷贝完成!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
//确保流对象不为空时关闭资源
if(os != null){
os.close();
}
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//源文件
File f1 = new File("D:\\素材\\视频\\larva搞笑虫子\\1.mp4");
//目标目录
File f2 = new File("D:\\video"); //d:/video/1.mp4
//开始拷贝
new FileCopy().copy(f1, f2);
}
}
对象序列化
对象序列化是一种用于在文件或者各种其他输入输出设备中存储java对象的机制,通过将实现过序列化结构的对象存储到指定的输出源,可以完整的保存对象数据;对象序列化机制一般常用于大型项目中的缓存技术,以缓存经常需要使用到的对象数据;java中实现对象序列化通常包含两种方式:
-
实现Serializable接口
-
实现Externalizable接口
完成对象序列化的过程必须包含以下步骤:
-
需要完成序列化的对象对应的类必须实现Serializable接口
-
通过对象输出流将对象存储到指定的输出源(文件,网络)中(通过ObjectOutputStream)
若需要将文件或者其他输入输出设备中的java对象读取出来,可以通过ObjectInputStream完成对象反序列化