1. 程式人生 > 其它 >Java常用類庫(3)——IO流

Java常用類庫(3)——IO流

1.本章內容:

1)對於計算機資源的讀取和取出

2)對檔案的增刪改以及查詢的操作

3)對檔案位元組上的進行讀入或者寫出

4)對文字檔案進行字元上的讀入或者寫出

一:IO流中,File物件

1.File物件是檔案和目錄的抽象表示

2.File中常見的構造方法:

1)一參構造方法:File file = new File("檔案目錄名(如果該目錄下沒有該檔案,就建立,否則返回false)");

 1 import java.io.File;
 2 import java.io.IOException;
 3 
 4 public class Test {
 5     public static
void main(String[] args) throws IOException { 6 //建立File物件 7 File file = new File("D://Java"); 8 boolean newFile = file.createNewFile(); 9 System.out.println(newFile?"建立成功":"建立失敗"); 10 } 11 }

2)二參構造方法:File file = new File("資料夾名","檔名字")

 1 import java.io.File;
 2
import java.io.IOException; 3 4 public class Test { 5 public static void main(String[] args) throws IOException { 6 File file = new File("D://java"); 7 //建立資料夾 8 file.mkdir(); 9 //建立兩參的構造方法 10 File a = new File(file,"javaee"); 11 boolean newFile = a.createNewFile();
12 System.out.println(newFile); 13 } 14 }

3.File中常見的方法:

1)createNewFile();當檔案不存在時,建立檔案

2)delete();刪除檔案或者目錄

3)exists();判斷是否存在該檔案或者目錄

4)getAbsolutePath();獲取檔案或者目錄的絕對地址

5)getName();獲取檔案或者目錄的名稱

6)getParent();返回此路徑的父類檔名稱

7)length();返回路徑代表的檔案長度

8)list();返回一個字串陣列,表示抽象路徑下的檔案和目錄的名稱

listFiles();獲取抽象路徑名下的檔案的名字

9)mikdir();建立資料夾

10)minkdirs();建立多級資料夾

11)renameTo();複製檔案內容到另一個新建立的檔案下面

1 import java.io.IOException;
2 
3 public class Test {
4     public static void main(String[] args) throws IOException {
5        File file = new File("D://java");
6        File file2 = new File("D://python");
7        file.renameTo(file2);
8     }
9 }

12)判斷的方法:\

13)分隔符:pathSeparator表示分號,separator表示"\",都是用來表示檔案的分割的

4.遍歷檔案

 1 import java.io.File;
 2 import java.io.IOException;
 3 
 4 public class Test {
 5     public static void main(String[] args) throws IOException {
 6         //建立檔案物件
 7         File file = new File("e://");
 8         //呼叫方法,獲得該物件路徑下的檔案和目錄的陣列
 9         File[] files = file.listFiles();
10         listFile(files);
11 
12     }
13     public static void listFile(File [] file){
14         if(file!=null && file.length>0){
15             for(File files : file){
16                 if(files.isFile()) {
17                     if (files.getName().endsWith(".txt")) {
18                         if (files.length() > 200 * 1024 * 1024) {
19                             System.out.println("找到了檔案" + files.getAbsolutePath());
20                         }
21                     }
22                 }else{
23                     File[] files1 = files.listFiles();
24                     listFile(files1);
25                 }
26             }
27         }
28     }
29 }

5.檔案過濾器:

6.相對路徑和絕對路徑:

1)相對路徑:在Java程式碼中,是相對於專案路徑的路徑,這是一個不完整的便捷路徑

2)絕對路徑:從碟符開始,是一個完整的路徑

二:IO流:

1.IO流的概述:

1)可以將資料傳送這種操作看作是資料流動,按照流動的方向分為資料流入(input)和資料流出(output)

2)java中IO流的操作實際上是對Java.io包下的類的使用,利用這些常用類對資料進行讀取(input)和寫出(output)

2.IO流的分類:

1)按照資料的流動方向:輸入流(input)和輸出流(output)

2)按照流動的資料型別來分:字元流和位元組流

3)學習路徑:(一下都是頂級的父類)

位元組流:

—— 輸入流:InputStream

—— 輸出流:OutputStream

字元流:

——輸入流:Reader

——輸出流:Writer

4)一切物件皆字元:計算機中,一切的資料(視訊,音訊,文字等)都是以二進位制來儲存的,在資料傳輸時也是有二進位制來儲存的,後續學習的任何流都是通過二進位制 來傳輸的。

3.位元組輸出流:OutputSteam

1)將Java程式碼的檔案寫入記憶體中

2)位元組輸出流中常用的方法:

2.1)close();關閉流

2.2)flush();重新整理流(該父類的子類中,有些流具有緩衝的作用,要使用到重新整理)

2.3)write(byte[]);一次寫入一個字元

write(byte[] ,int begin,int len);寫入一個字元陣列的子陣列

write(int a);寫入一個int型別的數,該數不超過225,底層實際還是字元

3)常用的構造方法:

3.1)FileOutputSream(File file);建立檔案輸出流以寫入由指定的 File物件表示的檔案

3.2) FileOutputSream(File file,boolean append);

3.3) FileOutputStream(String name);建立檔案輸出流以寫入具有指定名稱的檔案。

3.4) FileOutputStream(String name,boolean append);

是否有append的區別:當append為true時,表示過載物件時,檔案追加在檔案內,如果為false或者不寫時,表示清空原始檔,從新寫入新的檔案

4)程式碼演示

 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 
 5 public class Test {
 6     public static void main(String[] args) throws IOException {
 7        //建立FileOutputStream物件
 8         FileOutputStream fos = new FileOutputStream("D://java");//如果沒有該檔案,就自動建立
 9         //寫入一個位元組字元
10         fos.write(65);
11         //關閉位元組流
12         fos.close();
13         System.out.println("已經寫出來了");
14 
15     }
16 }
 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 
 5 public class Test {
 6     public static void main(String[] args) throws IOException {
 7        //建立FileOutputStream物件
 8         FileOutputStream fos = new FileOutputStream("D://java",true);//如果沒有該檔案,就自動建立
 9         //寫入一組字元
10         byte [] bytes = {65,66,67,68,69};
11         fos.write(bytes);
12         //關閉位元組流
13         fos.close();
14         System.out.println("已經寫出來了");
15 
16     }
17 }
 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 
 5 public class Test {
 6     public static void main(String[] args) throws IOException {
 7        //建立FileOutputStream物件
 8         FileOutputStream fos = new FileOutputStream("D://java",true);//如果沒有該檔案,就自動建立
 9         //寫入一組字元
10         byte [] bytes ="ABCDEF".getBytes();//getBytes()該方法,將字串轉換為一個位元組陣列
11         fos.write(bytes,1,2);//從1下表開始,寫兩個長度
12         //關閉位元組流
13         fos.close();
14         System.out.println("已經寫出來了");
15 
16     }
17 }

4.位元組輸入流FileInoutStream

4.1)將檔案中的東西寫入Java程式碼中

4.2)FileInputOutput類中常用的方法:

1)close();關閉流

2)read(byte a);讀入一個位元組

3)read(byte [] a);讀入一組位元組陣列

4.3)FileInputSream類中常見的構造方法

1)FileInputStream(File file);

2)FileInputStream(String name);

4.4)程式碼演示:

 1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.IOException;
 4 
 5 public class Test {
 6     public static void main(String[] args) throws IOException {
 7         //建立FileInoutStream物件
 8         FileInputStream fis = new FileInputStream("D://java");
 9         //建立一個位元組陣列
10         byte [] bytes = new byte[10];
11         //呼叫方法,採用一次讀入一個位元組陣列的方式
12         int len = fis.read(bytes);
13         System.out.println(new String(bytes,0,len));
14         len = fis.read(bytes);
15         System.out.println(new String(bytes,0,len));
16         len = fis.read(bytes);
17         System.out.println(new String(bytes,0,len));
18         fis.close();
19     }
20 }

5.字元編碼:

5.1)UTF-8:unicode編碼,支援多個國家的編碼

5.2)亂碼的發生:輸入端和輸出端的編碼不匹配

6.字元輸出:

1)只能用來讀寫文字

2)常用的構造方法:

3)常用的方法:

4)程式碼:

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3 
 4 public class Test {
 5     public static void main(String[] args) throws IOException {
 6         FileWriter fw = new FileWriter("D://java",true);
 7         fw.append("鋤禾日當午").append("汗滴禾下土").append("誰知盤中餐");
 8         fw.write("粒粒皆辛苦");
 9         fw.close();
10     }
11 }

七:字元讀取:

1)常用的構造方法:同字元寫入相同

3)字元的寫入需要重新整理:flush();

2)程式碼演示(一次讀取一個字元)

 1 import java.io.FileReader;
 2 import java.io.IOException;
 3 
 4 public class Test {
 5     public static void main(String[] args) throws IOException {
 6         FileReader fr = new FileReader("D://java");
 7         while(true){
 8             int read = fr.read();
 9             if(read==-1){
10                 break;
11             }
fr.flush();
fr.close();
12 System.out.println((char)read); 13 } 14 15 } 16 }

3)程式碼演示(一次讀取一個字元陣列)

 1 import java.io.FileReader;
 2 import java.io.IOException;
 3 
 4 public class Test {
 5     public static void main(String[] args) throws IOException {
 6         FileReader fr = new FileReader("D://java");
 7         //建立一個字元陣列
 8         char [] chars = new char[100];
 9         int len = fr.read(chars);
10         String str = new String(chars,0,len);
11         System.out.println(str);
12     }
13 }

8.位元組轉換流(位元組轉換為字元)

8.1)位元組輸入流的轉換:InputStreamReader();

8.1.1) 程式碼演示:

 1 import java.io.*;
 2 
 3 public class Test {
 4     public static void main(String[] args) throws IOException {
 5         //建立位元組輸入流
 6         FileInputStream fis = new FileInputStream("D://java");
 7         //建立轉換流
 8         InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
 9         while(true){
10             int read = isr.read();
11             if(read==-1){
12                 break;
13             }
14             System.out.println((char)read);
15         }
16     }
17 }

8.2)位元組輸出流轉換:OutputStreamWriter;

8.2.1) 程式碼演示:

 1 import java.io.*;
 2 
 3 public class Test {
 4     public static void main(String[] args) throws IOException {
 5         //建立位元組輸出流物件
 6         FileOutputStream fos = new FileOutputStream("D://java");
 7         //建立位元組轉換流
 8         OutputStreamWriter osw = new OutputStreamWriter(fos);
 9         //寫入資料
10         osw.write("床前明月光,地上鞋一堆");
11         osw.flush();
12         osw.close();
13     }
14 }

8.列印流:

 1 import java.io.*;
 2 
 3 public class Test {
 4     /**
 5      * 字元輸出流(列印流)
 6      * @param args
 7      * @throws IOException
 8      */
 9     public static void main(String[] args) throws IOException {
10 //        //建立列印流物件
11 //        PrintStream ps = new PrintStream("D://java");
12 //        //寫入資料
13 //        ps.println("唧唧復唧唧,木蘭當戶織");
14 //        ps.println("不聞機杼聲,唯聞女嘆息");
15 //        ps.println("問女何所思,問女何所憶");
16 
17 
18 //        //建立列印流物件
19 //        PrintWriter ps = new PrintWriter("D://java");
20 //        //寫入資料
21 //        ps.println("唧唧復唧唧,木蘭當戶織");
22 //        ps.println("不聞機杼聲,唯聞女嘆息");
23 //        ps.println("問女何所思,問女何所憶");
24 
25         /**
26          * 在位元組轉換為字元的時候,建議採用一下方法,將位元組流轉換為列印流
27          */
28         //建立位元組輸出流
29         FileOutputStream fos = new FileOutputStream("D://java");
30         //建立列印流物件
31         PrintWriter pw = new PrintWriter(fos);
32         pw.println("唧唧復唧唧,木蘭當戶織");
33         pw.println("不聞機杼聲,唯聞女嘆息");
34         pw.println("問女何所思,問女何所憶");
35         pw.flush();
36         pw.close();
37     }
38 }

9.快取讀取流:

9.1)將字元輸入流,轉換為可以快取,可以一次性讀取一行的字元緩衝流

9.2)程式碼演示:

 1 import java.io.*;
 2 
 3 public class Test {
 4     /**
 5      * 字元輸出流(列印流)
 6      * @param args
 7      * @throws IOException
 8      */
 9     public static void main(String[] args) throws IOException {
10         //建立字元輸入流物件
11         FileReader fw = new FileReader("D://java");
12         //將字元輸入流轉換為字元緩衝流
13         BufferedReader br = new BufferedReader(fw);
14         String text = br.readLine();
15         System.out.println(text);
16     }
17 }

三:收集異常日誌:

 1 import java.io.*;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4 
 5 public class Test {
 6     /**
 7      * 日誌異常收集
 8      * @param args
 9      * @throws IOException
10      */
11     public static void main(String[] args) throws IOException {
12        try{
13            String s = null;
14            System.out.println(s.toString());
15        }catch (Exception e){
16            //建立寫入流
17            PrintWriter fw = new PrintWriter("D://java");
18            //建立日期格式化物件
19            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
20            //建立當前日期物件
21            Date date = new Date();
22            fw.println(sdf.format(date));
23            e.printStackTrace(fw);
24            fw.close();
25        }
26     }
27 }

四:properties配置檔案

1.properties既屬於集合類的知識,又涉及到IO流

2.Properties為他的類,properties是他的檔案

3.程式碼演示:將檔案寫入磁碟

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3 import java.util.Properties;
 4 
 5 public class Test {
 6     /**
 7      * Properties類和properties檔案
 8      * 將檔案寫入磁碟
 9      * @param args
10      */
11     public static void main(String[] args) throws IOException {
12         //建立Properties類物件
13         Properties pro = new Properties();
14         //因為他底層使用Map集合,鍵值對的形式,呼叫方法,傳入引數
15         pro.put("name","金蘋果");
16         pro.put("info","講訴了農夫種植金蘋果的心酸過程");
17         //建立一個字元輸入流,將該檔案寫入磁碟
18         FileWriter fw = new FileWriter("D://java.properties");
19         pro.store(fw,"圖書儲存");
20         fw.close();
21     }
22 }

4.程式碼演示:將檔案內容從磁盤裡面讀出來

 1 import java.io.FileReader;
 2 import java.io.IOException;
 3 import java.util.Properties;
 4 
 5 public class Test {
 6     /**
 7      * Properties類和properties檔案
 8      * 將檔案寫入磁碟
 9      * @param args
10      */
11     public static void main(String[] args) throws IOException {
12         //建立Properties類物件
13         Properties pro = new Properties();
14         //建立一個字元輸出流
15         FileReader fr = new FileReader("D://java.properties");
16         //呼叫方法,將檔案從磁碟中讀取出來
17         pro.load(fr);
18         System.out.println(pro.get("name"));
19         System.out.println(pro.get("info"));
20         fr.close();
21     }
22 }

五:序列化和反序列化:

1.序列化是將Java編寫的類儲存到檔案中,他是一些看不懂得東西,反序列化就是將檔案裡面的東西寫到程式中來

2.序列化技術:

 1 import java.io.FileOutputStream;
 2 import java.io.ObjectOutputStream;
 3 import java.io.Serializable;
 4 
 5 public class Test {
 6     /**
 7      * 序列化技術,將類儲存到檔案中,以便永久儲存
 8      * @param args
 9      */
10     public static void main(String[] args) throws Exception {
11         //建立圖書物件
12         Book book = new Book("金蘋果","講訴了農夫種植蘋果的心酸過程");
13         //建立序列化物件
14         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://java01"));
15         oos.writeObject(book);
16         oos.close();
17     }
18     //implements Serializable 用於標記該類將要序列化
19     static class Book implements Serializable {
20         String name;
21         String info;
22         public Book(){};
23 
24         public Book(String name, String info) {
25             this.name = name;
26             this.info = info;
27         }
28 
29         @Override
30         public String toString() {
31             return "Book{" +
32                     "name='" + name + '\'' +
33                     ", info='" + info + '\'' +
34                     '}';
35         }
36     }
37 }

3.反序列化技術:

 1 import java.io.FileInputStream;
 2 import java.io.ObjectInputStream;
 3 import java.io.Serializable;
 4 
 5 public class Test {
 6     /**
 7      * 反序列化技術,檔案中儲存的類,寫到程式中
 8      *
 9      * @param args
10      */
11     public static void main(String[] args) throws Exception {
12         //建立反序列化物件
13         ObjectInputStream obs = new ObjectInputStream(new FileInputStream("D://java01"));
14 //        Object o = obs.readObject();
15 //        System.out.println(o);
16         Book o = (Book)obs.readObject();
17         System.out.println(o);
18     }
19 
20     //implements Serializable 用於標記該類將要序列化
21     static class Book implements Serializable {
22         String name;
23         String info;
24 
25         public Book() {
26         }
27 
28         public Book(String name, String info) {
29             this.name = name;
30             this.info = info;
31         }
32 
33         @Override
34         public String toString() {
35             return "Book{" +
36                     "name='" + name + '\'' +
37                     ", info='" + info + '\'' +
38                     '}';
39         }
40     }
41 }

(如果反序列化中的類中有其他的引用資料型別,那麼那個引用資料型別也要實現標記介面)

4.序列化和反序列化是用來資料傳輸或者本地儲存的

5.

六:try-with-resources:

1.簡化了程式碼的異常處理,他是自動進行了close()操作

2.程式碼演示:

 1 import java.io.FileNotFoundException;
 2 import java.io.FileReader;
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 public class Test {
 7     /**
 8      *try-with-resource既是異常中的知識點,也是IO流中的知識點
 9      * @param args
10      */
11     public static void main(String [] args)throws FileNotFoundException{
12 //        //1.7版本:
13 //        try(FileReader fr = new FileReader("D://java01")) {
14 //            int num = fr.read();
15 //            System.out.println((char)num);
16 //
17 //        } catch (IOException e) {
18 //            e.printStackTrace();
19 //        }
20 
21         //1.9版本
22         FileReader fr = new FileReader("D://java01");
23         PrintWriter fw = new PrintWriter("D://java01");
24         try(fr;fw){
25             int c = fr.read();
26             System.out.println((char)c);
27 
28         }catch (IOException e){
29             e.printStackTrace();
30         }
31     }
32 }

3.使用try-with-resources的類必須實現Closeable()或者AutoCloseable()介面。