Java之IO流
一:IO流体系结构:
IO流总结
一、IO流的体系结构:
二、字节流、转换流、字符流的使用与选择:
-
字节流主要用于文件的复制
2.1.1 InputStream抽象父类:方法见上图
|–FileInputStream子类
OutputStream抽象父类:方法见上图
|–FileOutputStream子类
2.1.2多级文件夹的复制代码实现:
public static void main(String[] args) throws IOException {
//源文件夹
File srcDir = new File("aaa");
//目标文件夹
File destDir = new File("bbb");
//定义一个方法 复制文件夹的方法
copyDir(srcDir, destDir);
}
/*
* 复制文件夹的方法
* 方法的返回值类型 void
* 方法的参数列表 源文件夹srcDir 目标文件夹destDir
*/
public static void copyDir(File srcDir,File destDir) throws IOException{
//验证 目标文件夹不存在 创建
if(!destDir.exists()){
destDir.mkdir();
}
//是否是文件夹
if(!srcDir.isDirectory() || !destDir.isDirectory() ){
System.out.println("录入的文件夹有误!!");
return;
}
//获取 源文件夹 下 所有的子文件及子文件夹
File[] files = srcDir.listFiles();
//遍历 得到每一个file对象 有文件也有文件夹
for (File file : files) {
//判断file 是否是 文件
if(file.isFile()){//是文件
//下面要做文件的复制
//file是源文件
File srcFile = file;
//创建一个 目标文件对象
File destFile = new File(destDir,file.getName());
//完成 文件的复制
copyFile(srcFile, destFile);
}
if(file.isDirectory()){//是文件夹
File dest = new File(destDir,file.getName());
dest.mkdir();
copyDir(file, dest);
}
}
}
/*
* 完成文件复制的方法
*/
public static void copyFile(File srcFile,File destFile) throws IOException{
//创建字节输入流 关联源文件
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
fos.write(buffer, 0, len);
}
fos.close();
fis.close();
}
2.2- 字符转换流用于在字节流和字符流编码不同,或者是读写的时候的编码不同时,进行转换。
2.2.1 字符转换流:
-
|–InputStreamReader
- |–FileReade
|–OutputStreamWriter
- |–FileWriter2.2.2字符转换流的使用:
构造方法:InputStreamReader(InputStream in,String charset);
是字节通向指定字符的桥梁,将字节读取到字节输入流中然后按照指定的编码格式进行转换,读取。
方法:int read()读取 单个字符;int read(byte[] b,int 0,int len)读byte[]数组的一部分
OutputStreamWriter
构造方法:OutputStreamWriter(OutputStream out,String charset);
是字符通向字节的桥梁,将字符用字节输出流,按照指定的编码格式转换后写到中指定文件
2.2.3 转换流读取文件代码实现:
/*
*有两个文本文件,分别为a.txt和b.txt,其中a.txt编码方式是gbk,而b.txt的编码方式是utf8。- 要求将使用转换流实现如下功能: 将a.txt和b.txt文件的内容复制到c.txt文件中,保证内容不乱码。
*/
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"),"GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test2.txt"),"UTF-8");
int len;
while((len=isr.read())!=-1){
osw.write(len);
}
osw.close();
isr.close();}
- 字符流用于读写文本文件,且用BufferedXxx更加方便。
2.3.1字符流的读取一般使用高效流,即它对应的包装类BufferedXxxx
2.3.2 BufferedReader和BufferedWriter
构造方法:BufferedReader(new FileReader(“path”));
方法:String readLine();一次读取一行;close()
构造方法:BufferedWriter(new FileWriter(“path”));
方法:void write();一次写一个字符;void write(char[] c,int 0,int len) ;一次写一个char数组的一部分; void newLine();换行,不用考虑系统的换行
2.3.3代码的实现:
略
三、序列化
3.1序列化和反序列化的作用:
序列化的作用:将对象的状态写到指定的文件中去
反序列化的作用:将对象从文件中读出来
3.2序列化和反序列化:
3.1.1首先一个类需要实现Serializable接口,才能进行序列化和反序列化。其次实现序列化后该类不可改动,若改动则会导致版本信息不匹配引发异常。所以一般会直接指定序列化的UID常量。
3.1.2如果有的属性并不想被序列化,不想被包含在对象中被写到文件中去,则使用transient关键字修饰。
3.3序列化和反序列化的使用:
序列化:
构造方法:ObjectInputStream(InputStream in)创建指定存储序列化对象文件的输入流对象
成员方法:Object readObject()从指定文件中读取对象数据
反序列化:
构造方法:ObjectOutputStream(OutputStreamt out)创建指定存储序列化对象文件的输入流对象
成员方法:void Object writeObject()从指定文件中读取对象数据
3.3示例代码:
序列化:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("p3.person"));
Object obj = ois.readObject();
System.out.println(obj);
反序列化:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("p3.person"));
//创建一个Person对象
Person p = new Person("范冰冰", 36);
oos.writeObject(p);
oos.close();
四、打印流PrintWriter
基本用法和IO流一样只是只能输出到文件或者是Console窗口
五、comons-io工具包的使用
readFileToString(File file):读取文件内容,并返回一个String;
writeStringToFile(File file,String content):将内容content写入到file中
copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制,会复制全部的文件夹,包括最外层的一起复制到目标文件夹中
copyFile(File srcFile, File destFile): 文件复制
copyDirectory(File srcDir,File destDir) :只会复制源文件夹中的内容到目标文件夹,不会复制源文件夹
上一篇: 数组类型和多维数组本质