天天看點

Java---進階流一、轉換流二、序列化流和反序列化流三、解壓縮流和壓縮流

目錄

一、轉換流

(1)指定的字元集讀寫資料

二、序列化流和反序列化流

三、解壓縮流和壓縮流

(1)解壓縮流

 (2)壓縮流

一:壓縮檔案

二:壓縮檔案夾

注:本文并未介紹Java中的所有進階流,隻介紹了三種!

一、轉換流

轉換流就是轉換,它可以使位元組流轉換成字元流,也可以将字元流轉換成位元組流。

在讀資料時InputStreamReader,就是将位元組流轉換成字元流

寫資料時OutputStreamWriter,就是将字元流轉換成位元組流

他們的作用可以指定字元集讀寫資料,位元組流可以使用字元流中的方法

(1)指定的字元集讀寫資料

public class exe_one {
    public static void main(String[] args) throws IOException {
      File src=new File("D:\\java\\8.txt");
      duqu(src,"GBK");
      xie(src,"GBK");
   }
   public static void duqu(File src,String charset) throws IOException {
        //讀取src路徑的檔案,charset是指定的字元集

       //轉換流
       InputStreamReader inputStreamReader=new InputStreamReader(new FileInputStream(src),charset);
       int b;
       while((b=inputStreamReader.read())!=-1){
           System.out.print((char)b);
       }
       inputStreamReader.close();
   }
   public static void xie(File src,String charset) throws IOException {
        //寫到src檔案,charset是指定的字元集
        OutputStreamWriter outputStreamWriter=new OutputStreamWriter(new FileOutputStream(src),charset);
        outputStreamWriter.write("一加一等于100");
        outputStreamWriter.close();
   }
}
           

二、序列化流和反序列化流

序列化流:ObjectOutputStream,它可以把Java中的對象

寫到本地檔案中,比如具體執行個體中遊戲的存檔,如果單純将資料寫進去,

那麼使用者就可以看懂并進行修改,序列化的作用就是将對象寫進本地檔案中,

并且是一串奇怪的字元,别人看不懂。

同時要注意一個小細節,使用序列化流儲存檔案一定要記得将javabean類實作Serializable接口

反序列化流:ObjectInputStream他的作用就是将序列化到本地檔案中的對象讀取到程式中

public class exe_one {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        File src=new File("D:\\java\\7.txt");
      //xulie(src);
      fanxulie(src);
   }
   public static void xulie(File src) throws IOException {
        //序列化流将對象儲存到本地檔案中
       Student s=new Student("張三",19);
       ObjectOutputStream outputStream=new ObjectOutputStream(new FileOutputStream(src));
       outputStream.writeObject(s);
       outputStream.close();
   }
   public static void fanxulie(File src) throws IOException, ClassNotFoundException {
        //反序列化
       ObjectInputStream o=new ObjectInputStream(new FileInputStream(src));
       Student s= (Student) o.readObject();
       System.out.println(s.name);
       o.close();
   }
}
           
Java---進階流一、轉換流二、序列化流和反序列化流三、解壓縮流和壓縮流

三、解壓縮流和壓縮流

對于解壓縮流和壓縮流的定義其實很簡單,就是解壓和壓縮

(1)解壓縮流

解壓本質:就是吧每一個ZipEntry按照層級拷貝到本地另外一個檔案夾中

要注意這裡的解壓縮的格式字尾名一定要是zip,其他Java無法識别。 

解壓縮流基本代碼:

//将一個a壓縮包解壓

public class exe_one {
    public static void main(String[] args) throws IOException {
       File src=new File("D:\\java\\a.zip");
       File dest=new File("D:\\java");
       jieyasuo(src,dest);
    }
    public static void jieyasuo(File src,File dest) throws IOException {
      //先擷取壓縮包中的資料
        ZipInputStream zip=new ZipInputStream(new FileInputStream(src));
        //擷取壓縮包中的每一個zipEntry對象
        ZipEntry entry;
        while((entry= zip.getNextEntry())!=null){
            System.out.println(entry);
            if(entry.isDirectory()){
                //是檔案夾
                    File fiel=new File(dest,entry.toString());
                    fiel.mkdirs();
            }
            else{
                //是檔案
                //開始将壓縮包中的資料寫到指定的位置上去
                FileOutputStream outputStream=new FileOutputStream(new File(dest,entry.toString()));
                int b;
                while((b=zip.read())!=-1){
                    outputStream.write(b);
                }
                outputStream.close();
                zip.closeEntry();
            }
        }
        zip.close();
    }

}
           

 (2)壓縮流

一:壓縮檔案

public class exe_one {
    public static void main(String[] args) throws IOException {
       File src=new File("D:\\C\\ssss.txt");
       File dest=new File("D:\\C");
       jieyasuo(src,dest);
    }
    public static void jieyasuo(File src,File dest) throws IOException {
        //将ssss.txt壓縮成zip格式
        //建立壓縮關流
        ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(new File(dest,"ssss.txt")));
        //建立zipEntry對象,表示壓縮包中的每一個檔案
        ZipEntry entry=new ZipEntry("ssss.txt");
        //将ZipEntry對象放到壓縮包中
        zipOutputStream.putNextEntry(entry);
        //将src檔案中的資料寫到壓縮包中
        FileInputStream fileInputStream=new FileInputStream(src);
        int b;
        while((b=fileInputStream.read())!=-1){
            zipOutputStream.write(b);
        }
        zipOutputStream.closeEntry();
        zipOutputStream.close();

    }

}
           

二:壓縮檔案夾

具體代碼如下:

public class exe_one {
    public static void main(String[] args) throws IOException {
        File src=new File("D:\\java\\a");
        File destparent=src.getParentFile();//得到壓縮檔案的父級路徑
        File dest=new File(destparent,src.getName()+".zip");

        //建立壓縮關聯包
        ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(dest));
        //擷取src中的每個檔案以及檔案夾變成ZipEntry對象
        yasuo(src,zipOutputStream,src.getName());
        zipOutputStream.close();
    }
   public static void yasuo(File src,ZipOutputStream zipOutputStream,String name) throws IOException {
       File[] files=src.listFiles();
       for(File file:files){
           if(file.isFile()){
               //是檔案
               //變成ZipEntrry對象,将資料壓縮
               ZipEntry entry=new ZipEntry(name+"\\"+file.getName());//壓縮到的路徑
               zipOutputStream.putNextEntry(entry);
               //讀取檔案中的資料,寫到壓縮包中
               FileInputStream inputStream=new FileInputStream(file);
               int b;
               while((b=inputStream.read())!=-1){
                   zipOutputStream.write(b);
               }
               inputStream.close();
               zipOutputStream.closeEntry();
           }
           else{
               //檔案夾壓縮
               //遞歸壓縮
               yasuo(file,zipOutputStream,name+"\\"+file.getName());
           }
       }
   }
}