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);