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());
        }
        
    }

}

 

posted @ 2019-01-09 15:49  山上有风景  阅读(3426)  评论(0编辑  收藏  举报