一:二進制文件讀寫
(一)寫文件
–先創建文件,寫入數據,關閉文件 –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()); } } }