Java的IO
一.File類:
1.File類的作用:
代表一個特定文件的名稱。
代表一個目錄下的一組文件的名稱。此時可以使用list()方法,返回一個字符數組。
2.目錄查看器:
如果想查看一個目錄列表,可以使用兩種方法來使用File對象。
一,調用不帶參數的list()方法,便可以獲得此File對象包含的全部列表。
二,如果想得到一個受限列表,就要用到“目錄過濾器”。顯示符合條件的File對象。
FilenameFilter
接口中的accept()
方法是關鍵,對文件進行篩選。
public interface FilenameFilter {
boolean accept(File dir, String name);
//接受文件所在目錄的File對象,以及包含文件名的String
}
DirFilter
類爲幫助list()
調用accept()
方法而服務,accept()
會使用正則表達式的matcher
對象,來看正則表達式是否匹配這個名字。
class DirFilter implements FilenameFilter{
private Pattern pattern;
public DirFilter(String regex) {
pattern = Pattern.compile(regex);//正則表達式
}
public boolean accept(File dir, String name){
return pattern.matcher(name).matches();
}
}
公共類中list()
方法的用法:list()
方法會爲此目錄對象下的每一個文件調用accept()
,來判斷文件的名字,最後會返回一個數組。
File path = new File(".");
if(args.length == 0)
list = path.list();
else
list = path.list(new DirFilter(args[0]));
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
//嚴格按照字母表排序
如果用更簡潔的方式將兩個類合在一起表示:用一個作爲list參數的匿名內部類。
list = path.list(new FilenameFilter(){
private Pattern pattern = Pattern.compile(args[0]);
public boolean accept(File Dir, String name){
return pattern.matcher(name).matches();
}
});
3.目錄的檢查和創建
File f;
f.isFile();//判斷是否爲文件
f.isDirectory();//是否爲路徑
old.renameTo(rname);//將一個文件重命名或移動到由參數指示的完全不同路徑
f.mkdirs();//創建此抽象路徑指定的目錄,包括不存在的父目錄
f.mkdir();//只能創建一級,並且需要父目錄
f.getAbsolutePath();//完整的目錄
f.getPath();//最後一級目錄
f.canRead();f.canWrite();
f.getName();//獲取文件名
二. 輸入和輸出
InputStream
和OutputStream
是面向字節的。
Reader
和Writer
是面向字符的,兼容了Unicode。
1.緩衝輸入文件:
try{
String filename;
BufferedReader in = new BufferedReader(new FileReader(filename));
String s;
while((s = in.readLine()) != null){}
}catch(IOException e){
e.printStackTrace();
}
2.控制檯輸入:
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));//省略異常處理
3.一次一個字節讀取文件:
DataInputStream in = new DataInputSream(new BufferedInputStream(new FileInputStream("testEOF.java")));
4.自我獨立的類 RandomAccessFile
是一種特殊的文件流,可以用它在文件的任何地方查找或者插入數據。
同時實現了DataInput
和DataOutput
接口,所以可以用來讀寫文件。
構造器及方法:
RandomAccessFile(File f, String mode);
RandomAccessFile(String f, String mode);//mode爲r或rw
readInt() readLine() writeChar() writeDouble()
void seek(long pos)//將指針調到所需位置
int skipBytes(int n)//將指針向下移動若干字節
long getFilePointer()//返回指針當前位置