欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java之IO流

程序员文章站 2024-03-04 15:40:47
...

一:IO流体系结构:
Java之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
    - |–FileWriter

    2.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。

    1. 要求将使用转换流实现如下功能: 将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();}
  1. 字符流用于读写文本文件,且用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 fileString content):将内容content写入到file
copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制,会复制全部的文件夹,包括最外层的一起复制到目标文件夹中
copyFile(File srcFile, File destFile): 文件复制
copyDirectory(File srcDir,File destDir) :只会复制源文件夹中的内容到目标文件夹,不会复制源文件夹