1. 程式人生 > >Thinking in java 第18章 Java I/O系統

Thinking in java 第18章 Java I/O系統

一.Java操作檔案/目錄的File類
File類既能代表一個特定檔案的名稱,又能代表目錄下的一組檔案的名稱。如果指的是一個檔案集,我們就可以對此集合呼叫list方法,這個方法會返回一個字元陣列。
下面是一個例子,如何得到符合條件的File物件。

import java.io.File;
import java.util.Arrays;

public class DirList {
    public static void main(String[] args) {
        File path = new File(".");
        String[] List;
        if(args.length == 0){
            List = path.list();
        }else{
            List = path.list(new DirFilter(args[0]));
        }
        Arrays.sort(List,String.CASE_INSENSITIVE_ORDER);
    }
}

public class DirFilter implements FilenameFilter {

    private Pattern pattern;

    public DirFilter(String regex) {
        pattern = Pattern.compile(regex);
    }

    @Override
    public boolean accept(File dir, String name) {
        return pattern.matcher(name).matches();
    }
}

這裡DirFIilter實現了FilenameFilter介面。
DirFilter這個類存在的唯一原因就是將accept方法提供給list使用,使list可以回撥accept()。注意,此Java經典的輸入輸出流 處用了策略模式。
**二,Java經典的輸入輸出流 **
(1).輸入流和輸出流
輸入流指的是隻能從中讀取資料,而不能向裡面寫資料。:包括InputStream和Reader兩個基本介面
輸出流是指只能向裡面寫資料而不能向其中讀資料:包括OutputStream和Writer兩個基本介面
(2).位元組流和字元流
位元組流和字元流唯一的區別就是操作單元不同而已。位元組流操作的資料單元是位元組,而字元流操作的資料單元是字元。所有從Writer,Reader派生來的類都是字元流的類。而所有從InputStream和OutputStream派生出來的類都是位元組流的類。
(3)節點流和處理流
所謂的節點流指的是:可以向/從一個特定的IO裝置(如磁碟,網路,陣列,字串)讀/寫的流;節點流也被成為低階流。
所謂的處理流指的是:對一個已存在的流進行連線或封裝,然後通過封裝以後的流來實現資料的讀寫功能。處理流也叫做高階流。
下面幾個例項瞭解一下Io類具體用法

//開啟一個檔案進行操作時,為了提高速度,對檔案進行緩衝
//使用BufferedReader,這個I/O流包括一個可以整行讀取的ReadLine()方法
//BufferdReader 屬於包裝流,需要在構造器中傳入一個FileInputReader節點流

 BufferedReader br = new BufferedReader(new FileReader("/Test/test.txt"));
                LinkedList<String> read = new LinkedList<>();
                String s;
                StringBuilder sb = new StringBuilder();
                while((s=br.readLine())!=null){ ///按行讀取
                    s=s.toUpperCase();
                    read.add(s);
                    //sb.append(s+"\n"); ///採用append()方法比“+”要快
                }
                br.close();
                for(int i=read.size()-1;i>=0;i--){
                    System.out.println((String)read.get(i));
                }

**三.Java的標準輸入輸出 **
Java的標準輸入輸出流指的是System.in,System.out
System.err分別是標準輸入流,標準輸出流,標準錯誤輸出流
System.out,System.err都是已經經過包裝的PrintStream物件,而System.in是未經包裝過的InputStream,所以在使用System.in之前我們需要進行包裝

 ///將System.in包裝成BufferedReader
      //  BufferedInputStream in = new BufferedInputStream(System.in);
        ///要先轉成Reader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String content="";
        String str;
        while((str=br.readLine())!=null&&str.length()!=0){
            content+=str;
        }
        br.close();
        ///將System.out包裝成PrintWriter
        ///System.out是一個PrintStream但是PrintWriter有一個構造器可以接受OutputSteam
        ///作為引數,所以可以直接使用那個構造器將System.out轉成PrintWriter
        PrintWriter out =new PrintWriter(System.out,true); ///注意設定第二個引數
        out.println(content);