1. 程式人生 > >java.io常見流/java.io.file檔案操作大全

java.io常見流/java.io.file檔案操作大全

http://wosyingjun.iteye.com/blog/1885786

今天學習了下java的IO流,這裡做個總結,方便查詢。

InputStream/OutputSrteam

InputStream是個抽象類,表示位元組輸入流的所有類的超類。常見的有向檔案寫入資料。

OutputStream是個抽象類,表示位元組輸出流的所有類的超類。常見的有從檔案寫出資料。

繼承關係:




  





 

舉例:採用FileInputStream/FileOutputStream讀寫檔案。

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. //讀取檔案
  4. public
    class TestFileInputStream {  
  5.   publicstaticvoid main(String[] args) {  
  6.     FileInputStream in = null;//定義一個輸入位元組流
  7.     try {  
  8.       in = new FileInputStream("D:/test/newfilename.txt");  
  9.     } catch (FileNotFoundException e) {  
  10.       System.out.println("找不到指定檔案");   
  11.       System.exit(-1);  
  12.     }  
  13.     try {  
  14.       long num = 0;  
  15.       int b = 0;  
  16.       while((b=in.read())!=-1){ //不等於-1就說明沒有讀到結尾
  17.         System.out.print((char)b); //輸出位元組
  18.         num++;  
  19.       }  
  20.       in.close();    
  21.       System.out.println();  
  22.       System.out.println("共讀取 "+num+" 位元組");  
  23.     } catch (IOException e1) {  
  24.       System.out.println("檔案讀取錯誤"
    ); System.exit(-1);  
  25.     }  
  26.   }  
  27. }  
Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. //讀出檔案並寫入另一個檔案
  4. publicclass TestFileOutputStream {  
  5.   publicstaticvoid main(String[] args) {  
  6.       int b = 0;  
  7.       FileInputStream in = null;//用於讀檔案
  8.       FileOutputStream out = null;//用於向檔案寫資料
  9.       try {  
  10.         in = new FileInputStream("D:/test/oldfile.txt");//就像在oldfile這個檔案裡插入一個管道用於讀取裡面的內容。
  11.         out = new FileOutputStream("D:/test/newfile.txt");//就像在newfile這個檔案裡插入一個管道用於向裡面寫人內容
  12.         while((b=in.read())!=-1){  
  13.           out.write(b);  
  14.         }  
  15.         in.close();   
  16.         out.close();  
  17.       } catch (FileNotFoundException e2) {  
  18.         System.out.println("找不到指定檔案"); System.exit(-1);  
  19.       } catch (IOException e1) {  
  20.         System.out.println("檔案複製錯誤"); System.exit(-1);  
  21.       }  
  22.       System.out.println("檔案已經複製");  
  23.   }  
  24. }  

##################################################################

Reader/Writer

Reader用於讀取字元的抽象類子類必須實現的方法只有 read(char[], int, int) 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。

 Writer寫入字元流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。

 

 

 舉例:採用FileReader/FileWriter讀寫檔案。

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. //讀取檔案
  4. publicclass TestFileReader {  
  5.   publicstaticvoid main(String[] args) {  
  6.     FileReader fr = null;   
  7.     int c = 0;  
  8.     try {  
  9.       fr = new FileReader("D:/test/newfilename.txt");  
  10.       while ((c = fr.read()) != -1) {  
  11.         System.out.print((char)c);  
  12.       }  
  13.       fr.close();  
  14.     } catch (FileNotFoundException e) {  
  15.       System.out.println("找不到指定檔案");  
  16.     } catch (IOException e) {  
  17.       System.out.println("出錯");  
  18.     }  
  19.   }  
  20. }  
Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. //寫入檔案
  4. publicclass TestFileWriter {  
  5.   publicstaticvoid main(String[] args) {  
  6.     FileWriter fw = null;  
  7.     try {  
  8.       fw = new FileWriter("D:/test/newfilename.txt");  
  9.       for(int c=0;c<=50000;c++){  
  10.         fw.write(c);//c表示的是unicode編碼,50000基本涵蓋了所有國家的文字。
  11.       }  
  12.       fw.close();  
  13.     } catch (IOException e1) {  
  14.         e1.printStackTrace();  
  15.       System.out.println("出錯");  
  16.       System.exit(-1);  
  17.     }  
  18.   }  
  19. }  

  ######################################################################## 

   常見處理流

 ########################################################################



 

1:緩衝流

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. publicclass TestBufferStream2 {  
  4.   //向一個檔案裡寫入資料並且從中讀取出
  5.   publicstaticvoid main(String[] args) {  
  6.     try {  
  7.       BufferedWriter bw = new BufferedWriter(new FileWriter("D:/test/DateTest.java,true"));//true表示不會刪除檔案之前所有的內容
  8.       BufferedReader br = new BufferedReader( new FileReader("D:/test/DateTest.java"));  
  9.       String s = null;  
  10.       for(int i=1;i<=10;i++){  
  11.         s = String.valueOf(Math.random());   
  12.         bw.write(s);  
  13.         bw.newLine();  
  14.       }  
  15.       bw.flush();  
  16.       while((s=br.readLine())!=null){  //BufferReader有快取區的功能,可以讀一行
  17.         System.out.println(s);  
  18.       }  
  19.       bw.close();   
  20.       br.close();  
  21.     } catch (IOException e) {  
  22.         e.printStackTrace();  
  23.     }  
  24.   }  
  25. }  

2:轉換流

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. publicclass TestTransForm2 {  
  4.   publicstaticvoid main(String args[]) {  
  5.     InputStreamReader isr = new InputStreamReader(System.in);//System.in代表鍵盤輸入流
  6.     BufferedReader br = new BufferedReader(isr);//在外面再套接一層
  7.     String s = null;  
  8.     try {  
  9.       s = br.readLine(); //等待鍵盤輸入直到輸入一行
  10.       while(s!=null){  
  11.         if(s.equalsIgnoreCase("exit")) break;   
  12.         System.out.println(s.toUpperCase());  
  13.         s = br.readLine();   
  14.       }  
  15.       br.close();  
  16.     } catch (IOException e) {  
  17.       e.printStackTrace();  
  18.     }  
  19.   }  
  20. }   

 3:資料流

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. publicclass TestDataStream {  
  4.   publicstaticvoid main(String[] args) {  
  5.     ByteArrayOutputStream baos =  new ByteArrayOutputStream(); //定義位元組陣列流
  6.     DataOutputStream dos = new DataOutputStream(baos);//套接資料型別流
  7.     try {  
  8.       dos.writeDouble(Math.random());//寫入double型別資料
  9.       dos.writeBoolean(true);  
  10.       ByteArrayInputStream bais =  new ByteArrayInputStream(baos.toByteArray());  
  11.       System.out.println(bais.available());  
  12.       DataInputStream dis = new DataInputStream(bais);  
  13.       System.out.println(dis.readDouble());//讀取double型別資料
  14.       System.out.println(dis.readBoolean());  
  15.       dos.close();   
  16.       dis.close();  
  17.     } catch (IOException e) {  
  18.       e.printStackTrace();  
  19.     }  
  20.   }  
  21. }  

  4:列印流

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. publicclass TestPrintStream1 {   
  4.   publicstaticvoid main(String[] args) {  
  5.     PrintStream ps = null;  
  6.     try {  
  7.       FileOutputStream fos =  new FileOutputStream("D:/test/DateTest.java");  
  8.       ps = new PrintStream(fos);  
  9.     } catch (IOException e) {  
  10.       e.printStackTrace();  
  11.     }  
  12.     if(ps != null){  
  13.       System.setOut(ps);//設定System.out輸出到ps(原來是在dos)
  14.     }  
  15.     for(char c = 0; c <= 60000; c++){  
  16.       System.out.print(c+ " ");//print具有自動的flush功能,所有資料將被寫入檔案
  17.     }  
  18.   }  
  19. }  
Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.*;   
  4. import java.io.*;  
  5. //類似log功能
  6. publicclass TestPrintStream3 {  
  7.   publicstaticvoid main(String[] args) {  
  8.     String s = null;  
  9.     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  10.     try {  
  11.       FileWriter fw = new FileWriter ("D:/test/log.java"true);//log 
  12.       PrintWriter log = new PrintWriter(fw);  
  13.       while ((s = br.readLine())!=null) {  
  14.         if(s.equalsIgnoreCase("exit")) break;  
  15.         System.out.println(s.toUpperCase());  
  16.         log.println("-----");  
  17.         log.println(s.toUpperCase());   
  18.         //log.flush();
  19.       }  
  20.       log.println("==="+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+"===");   
  21.       log.flush();  
  22.       log.close();  
  23.     } catch (IOException e) {  
  24.       e.printStackTrace();  
  25.     }  
  26.   }  
  27. }  

 5:物件流

Java程式碼  收藏程式碼
  1. package yingjun.io;  
  2. import java.io.*;  
  3. publicclass TestObjectIO {  
  4.     publicstaticvoid main(String args[]) throws Exception {  
  5.         T t = new T();  
  6.         t.k = 111;  
  7.         FileOutputStream fos = new FileOutputStream("D:/test/DateTest.java");  
  8.         ObjectOutputStream oos = new ObjectOutputStream(fos);  
  9.         oos.writeObject(t);  
  10.         oos.flush();  
  11.         oos.close();  
  12.         FileInputStream fis = new FileInputStream("D:/test/DateTest.java");  
  13.         ObjectInputStream ois = new ObjectInputStream(fis);  
  14.         T tReaded = (T)ois.readObject();  
  15.         System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);  
  16.     }  
  17. }  
  18. class T implements Serializable //可以被序列化的(可以把物件寫到檔案或者網路上傳輸)
  19. {  
  20.     int i = 10;  
  21.     int j = 9;  
  22.     double d = 2.3;  
  23.     transientint k = 15//transient修飾的成員變數在序列化的時候不考慮
  24. }  

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

http://wosyingjun.iteye.com/blog/1885404

java.io.file檔案操作大全

Java程式碼  收藏程式碼
  1. package yingjun.file;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import org.junit.Test;  
  7. publicclass TestFile {  
  8.     //建立檔案、資料夾
  9.     @Test
  10.     publicvoid addFile() throws IOException{  
  11.         //File file=new File("D:/test/testfile/"+"filename.txt");  
  12.         File file=new File("D:/test/testfile/","filename.txt");  
  13.         if(!file.getParentFile().exists()){ //如果該檔案路徑不存在就建立該路徑
  14.             file.getParentFile().mkdirs();  
  15.         }  
  16.         if(!file.exists()) {  //指定路徑下的filename.txt檔案要是不存在就建立
  17.             file.createNewFile();   
  18.         }  
  19.     }  
  20.     //刪除檔案
  21.     @Test
  22.     publicvoid deleteFile(){  
  23.          File file=new File("D:/test/testfile/"+"filename.txt");    
  24.           if(file.exists()&&file.isFile())    
  25.               file.delete();    
  26.     }  
  27.     //刪除檔案目錄
  28.     @Test
  29.     publicvoid deleteFileDir(){  
  30.         RecursionDel("D:/test/"); //採用遞迴刪除test目錄下的的所有檔案(包括test)
  31.     }  
  32.     privatevoid RecursionDel(String path){  
  33.          File dir=new File(path);   
  34.             if(dir.exists()){    
  35.                 File[] tmp=dir.listFiles();    
  36.                 for(int i=0;i<tmp.length;i++){    
  37.                     if(tmp[i].isDirectory()){    
  38.                         RecursionDel("D:/test/"+tmp[i].getName());    
  39.                     }else{    
  40.                         tmp[i].delete();  
  41.                     }    
  42.                 }    
  43.                 dir.delete();    
  44.             }    
  45.     }  
  46.     //複製檔案
  47.     @Test
  48.     publicvoid copyFile() throws IOException{  
  49.             FileInputStream in=new FileInputStream("D:/test/testfile/filename.txt");  //要拷貝的檔案目錄
  50.             File file=new File("D:/test/filename.txt");  //拷貝到的檔案目錄
  51.             if(!file.exists()) {  
  52.                 file.createNewFile();    
  53.             }  
  54.             FileOutputStream out=new FileOutputStream(file);    
  55.             int c;    
  56.             byte buffer[]=newbyte[1024];    
  57.             while((c=in.read(buffer))!=-1){    
  58.                 for(int i=0;i<c;i++)    
  59.                     out.write(buffer[i]);            
  60.             }    
  61.             in.close();    
  62.             out.close();    
  63.     }  
  64.     //剪下檔案
  65.     @Test
  66.     publicvoid copyFileDir() throws IOException{  
  67.          File oldfold=new File("D:/test/testfile/lala/asd.txt");    
  68.          File newfold=new File("D:/test/asd.txt");    
  69.          Boolean cover=true;//用於判斷是否覆蓋
  70.          if(newfold.exists()){   //若在待轉移目錄下,已經存在待轉移檔案  
  71.              if(cover){//覆蓋  
  72.                  oldfold.renameTo(newfold);    
  73.              }else
  74.                  System.out.println("在新目錄下已經存在");    
  75.          }else{    
  76.              oldfold.renameTo(newfold);    
  77.          }    
  78.     }  
  79.     //檔案重新命名
  80.     @Test
  81.     publicvoid renameFile(){  
  82.      File oldfile=new File("D:/test/filename.txt");    
  83.      File newfile=new File("D:/test/newfilename.txt");    
  84.       if(newfile.exists())//若在該目錄下已經有一個檔案和新檔名相同,則不允許重新命名  
  85.           System.out.println("已經存在!");    
  86.       else{    
  87.           oldfile.renameTo(newfile);    
  88.       }     
  89.     }  
  90.     //採用遞迴的方法遍歷某個資料夾下的所有檔案.
  91.     @Test
  92.     publicvoid listFile(){  
  93.         File f = new File("d:/test");  
  94.         fileList(f);  
  95.     }  
  96.     privatestaticvoid fileList(File f) {  
  97.         File[] childs = f.listFiles();  
  98.         for(int i=0; i<childs.length; i++) {  
  99.             if(childs[i].isDirectory()) {  
  100.                 fileList(childs[i]);  
  101.             }else{  
  102.                 System.out.println(childs[i].getAbsolutePath());  
  103.             }  
  104.         }  
  105.     }