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