JAVA核心技術I---JAVA基礎知識(二進制文件讀寫和zip文件讀寫)


一:二進制文件讀寫

(一)寫文件

–先創建文件,寫入數據,關閉文件
–FileOutputStream, BufferedOutputStream,DataOutputStream
–DataOutputStream
  • flush
  • write/writeBoolean/writeByte/writeChars/writeDouble/writeInt/WriteUTF/…
–try-resource 語句,自動關閉資源
–關閉最外層的數據流,將會把其上所有的數據流關閉
    private static void WriteBinFile() {
        // TODO Auto-generated method stub
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        DataOutputStream dos = null;
        
        try {
            // 節點類
            fos = new FileOutputStream("D:\\MyJava\\Code\\JH16\\test\\aa\\bb\\F.bat");
            bos = new BufferedOutputStream(fos);    //裝飾類
            dos = new DataOutputStream(bos);    //裝飾類
            
            dos.writeInt(100);
            dos.writeUTF("af");
            dos.writeInt(180);
            dos.writeInt(150);
            dos.writeUTF("");
        }catch(Exception e) {
            System.err.println(e.getMessage());
        }finally {
            try {
                dos.close();     // 關閉最后一個類,會將所有的底層流都關閉
            }catch(Exception e){
                System.err.println(e.getMessage());
            }
        }
    }

(二):讀文件

–先打開文件,讀入數據,關閉文件
–FileInputStream, BufferedInputStream,DataInputStream
–DataInputStream
  • read/readBoolean/readChar/readDouble/readFloat/readInt/readUTF/…
–try-resource 語句,自動關閉資源
–關閉最外層的數據流,將會把其上所有的數據流關閉
    private static void ReadBinFile() {
        // TODO Auto-generated method stub
        
        try(DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("D:\\MyJava\\Code\\JH16\\test\\aa\\bb\\F.bat")))){
            int a = dis.readInt();
            String s1 = dis.readUTF();
            int b = dis.readInt();
            int c = dis.readInt();
            String s2 = dis.readUTF();
            System.out.printf("%d %s %d %d %s",a, s1,b,c,s2);
        }catch(Exception e) {
            System.err.println(e.getMessage());
        }
                
    }

二:ZIP文件讀寫

壓縮包:zip, rar, gz, ……
Java zip 包支持Zip和Gzip包的壓縮和解壓
zip文件操作類: java.util.zip包中
–java.io.InputStream, java.io.OutputStream的子類
–ZipInputStream, ZipOutputSream 壓縮文件輸入/輸出流
–ZipEntry 壓縮項

(一)單個/多個壓縮

–打開輸出zip文件
–添加一個ZipEntry
–打開一個輸入文件,讀數據,向ZipEntry寫數據,關閉輸入文件
–重復以上兩個步驟,寫入多個文件到zip文件中
–關閉zip文件
    public static void SingleZip() throws Exception{    
        File file = new File("c:/temp/abc.txt") ;  // 定義要壓縮的文件  
        File zipFile = new File("c:/temp/single2.zip") ;   // 定義壓縮文件名稱  
        
        InputStream input = new FileInputStream(file) ; // 定義文件的輸入流  
        ZipOutputStream zipOut = null ; // 聲明壓縮流對象  
        zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
        zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 設置ZipEntry對象  
        zipOut.setComment("single file zip") ;  // 設置注釋  
        
        //壓縮過程
        int temp = 0 ;  
        while((temp=input.read())!=-1){ // 讀取內容  
            zipOut.write(temp) ;    // 壓縮輸出  
        }  
        input.close() ; // 關閉輸入流  
        zipOut.close() ;    // 關閉輸出流  
        
        System.out.println("single file zip done.");
    }  
    public static void MultipleFileZip(String args[]) throws Exception{    // 所有異常拋出
        File file = new File("c:/temp/multiple") ;    // 定義要壓縮的文件夾
        File zipFile = new File("c:/temp/multiple2.zip") ;    // 定義壓縮文件名稱
        
        InputStream input = null ;    // 定義文件輸入流
        ZipOutputStream zipOut = null ;    // 聲明壓縮流對象
        zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
        zipOut.setComment("multiple file zip") ;    // 設置注釋
        
        //開始壓縮
        int temp = 0 ;
        if(file.isDirectory()){    // 判斷是否是文件夾
            File lists[] = file.listFiles() ;    // 列出全部子文件
            for(int i=0;i<lists.length;i++){
                input = new FileInputStream(lists[i]) ;    // 定義文件的輸入流
                zipOut.putNextEntry(new ZipEntry(file.getName()
                    +File.separator+lists[i].getName())) ;    // 設置ZipEntry對象
                System.out.println("正在壓縮" + lists[i].getName());
                while((temp=input.read())!=-1){    // 讀取內容
                    zipOut.write(temp) ;    // 壓縮輸出
                }
                input.close() ;    // 關閉輸入流
            }
        }
        zipOut.close() ;    // 關閉輸出流
        System.out.println("multiple file zip done.");
    }

(二)單個/多個文件解壓

–打開輸入的zip文件
–獲取下一個ZipEntry
–新建一個目標文件,從ZipEntry讀取數據,向目標文件寫入數據,
關閉目標文件
–重復以上兩個步驟,從zip包中讀取數據到多個目標文件
–關閉zip文件
    public static void SingleFileUnzip(String args[]) throws Exception{     
        //待解壓文件, 需要從zip文件打開輸入流,讀取數據到java中
        File zipFile = new File("c:/temp/single.zip") ;   // 定義壓縮文件名稱          
        ZipInputStream input = null ;   // 定義壓縮輸入流  
        input = new ZipInputStream(new FileInputStream(zipFile)) ;  // 實例化ZIpInputStream  
        ZipEntry entry = input.getNextEntry() ; // 得到一個壓縮實體  
        System.out.println("壓縮實體名稱:" + entry.getName()) ;  //獲取壓縮包中文件名字 
        
        //新建目標文件,需要從目標文件打開輸出流,數據從java流入
        File outFile = new File("c:/temp/" + entry.getName());
        OutputStream out = new FileOutputStream(outFile) ;   // 實例化文件輸出流  
        int temp = 0 ;  
        while((temp=input.read())!=-1){  
            out.write(temp) ;  
        }  
        input.close() ;     // 關閉輸入流  
        out.close() ;   // 關閉輸出流
        System.out.println("unzip done.") ;
    }  
    public static void MultipleFileUnzip(String args[]) throws Exception{    
        //待解壓的zip文件,需要在zip文件上構建輸入流,讀取數據到Java中
        File file = new File("c:/temp/multiple.zip") ;   // 定義壓縮文件名稱  
        File outFile = null ;   // 輸出文件的時候要有文件夾的操作  
        ZipFile zipFile = new ZipFile(file) ;   // 實例化ZipFile對象  
        ZipInputStream zipInput = null ;    // 定義壓縮輸入流  
        
        //定義解壓的文件名
        OutputStream out = null ;   // 定義輸出流,用於輸出每一個實體內容  
        InputStream input = null ;  // 定義輸入流,讀取每一個ZipEntry  
        ZipEntry entry = null ; // 每一個壓縮實體  
        zipInput = new ZipInputStream(new FileInputStream(file)) ;  // 實例化ZIpInputStream 
        
        //遍歷壓縮包中的文件
        while((entry = zipInput.getNextEntry())!=null){ // 得到一個壓縮實體  
            System.out.println("解壓縮" + entry.getName() + "文件") ;  
            outFile = new File("c:/temp/" + entry.getName()) ;   // 定義輸出的文件路徑  
            if(!outFile.getParentFile().exists()){  // 如果輸出文件夾不存在 
                outFile.getParentFile().mkdirs() ;   
                // 創建文件夾 ,如果這里的有多級文件夾不存在,請使用mkdirs()
                // 如果只是單純的一級文件夾,使用mkdir()就好了
            }  
            if(!outFile.exists()){  // 判斷輸出文件是否存在
                if(entry.isDirectory())
                {
                    outFile.mkdirs();
                    System.out.println("create directory...");
                }
                else
                {
                    outFile.createNewFile() ;   // 創建文件
                    System.out.println("create file...");
                }                  
            }  
            if(!entry.isDirectory())
            {
                input = zipFile.getInputStream(entry) ; // 得到每一個實體的輸入流  
                out = new FileOutputStream(outFile) ;   // 實例化文件輸出流  
                int temp = 0 ;  
                while((temp=input.read())!=-1){  
                    out.write(temp) ;  
                }  
                input.close() ;     // 關閉輸入流  
                out.close() ;   // 關閉輸出流  
            }
            
        }  
        input.close() ;  
    }  

三:練習

讀取以下的a.txt,統計相同單詞的次數,最后按照次數的大小降序排列,輸出到b.txt中。

a.txt (===算分隔符,不算單詞,不考慮單詞大小寫)

==============

hello world

hello

java world   hello

==============



b.txt

============

hello,3

world,2

java,1

============



提示:需要用到的內容有文本文件讀和寫操作。還要加上數據結構,有ArrayList, HashMap,Comparable等。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class MyComparator implements Comparator<Map.Entry<String,Integer>>{
    public int compare(HashMap.Entry<String,Integer> he1,HashMap.Entry<String,Integer> he2) {
        return he2.getValue()-he1.getValue();
    }
}

public class homework {
    static final int MAX = 50;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashMap<String, Integer> hm = new HashMap<String,Integer>();
        
        //文件讀取
        try(BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("D:\\MyJava\\Code\\JH17\\a.txt")))){
            String line;
            while((line = br.readLine())!=null) {
                Pattern p = Pattern.compile("\\s+");  //正則匹配空格
                String words[]= p.split(line);  //獲取的字符串進行分割單詞
                
                for(String item : words) {  
                    if(item.length()!=0) {
                        if(hm.get(item)==null)
                            hm.put(item, 1);  //將數據放入map中
                        else
                            hm.put(item, hm.get(item)+1);
                    }
                }
            }
        }catch(Exception e) {
            System.err.println(e.getMessage());
        }
        
        //HashMap轉換為list,進行排序
        List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(hm.entrySet());
        Collections.sort(list,new MyComparator());
        
        //將數據寫入文件
        try(BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\MyJava\\Code\\JH17\\b.txt")))){
            for(Map.Entry<String, Integer> item: list) {
                bw.write(item.getKey()+","+item.getValue());
                bw.newLine();
            }
        }catch(Exception e) {
            System.err.println(e.getMessage());
        }
        
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM