天天看點

Java的I/O系統FilenameFilter輸入輸出存儲和恢複資料随機存儲通路資料

該文章來自我的個人部落格:

Java的I/O系統

FilenameFilter

檔案過濾器,擷取指定的檔案
import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
public class Filenamer {
    public static void main(String...args){
        File path=new File(".");
        String[] files;
        if(args.length==){
            files=path.list();
        }else{
            files=path.list(new DirFilter(args[]));
        }
        if(files==null){
            return;
        }
        for(String file:files){
            System.out.println("file:"+file);
        }
    }
}
class DirFilter implements FilenameFilter {
    private Pattern pattern;
    public DirFilter(String regex){
        pattern=Pattern.compile(regex);
    }
    @Override
    public boolean accept(File pathname,String name) {
        return pattern.matcher(name).matches();
    }
}
           

DirFilter重寫了FilenameFilter的accept方法根據傳入的正則判斷出符合條件的檔案名,符合傳回true,不符合傳回false

accept方法供list方法調用,list方法源碼如下:

public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
        return names;
    }
    List<String> v = new ArrayList<>();
    for (int i =  ; i < names.length ; i++) {
        if (filter.accept(this, names[i])) {
            v.add(names[i]);
        }
    }
    return v.toArray(new String[v.size()]);
}
           

輸入

讀取檔案到緩存

BufferedReader in=new BufferedReader(new FileReader(fileName));
while((str=in.readLine())!=null){
  strs.append(str);
}
           

讀取字元串到記憶體

StringReader in=new StringReader(str);
//in。read傳回字元的Ascall碼,内容讀取完則傳回-1
while((c=in.read())!=-){
  System.out.println((char)c);
}
           

讀取位元組到記憶體

//new ByteArrayInputStream()将位元組數組轉換成位元組流
DataInputStream in=new DataInputStream(new ByteArrayInputStream(str.getBytes());
//in.readByte()傳回下一個位元組,當已經到達末尾,會抛出EOFException異常
while(in.available()!=){
  System.out.println((char)in.readByte())
}
           

輸出

寫内容到檔案

PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
out.println(str);
           

存儲和恢複資料

try {
    DataOutputStream out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("test.txt")));
    out.writeChar('c');
    out.writeBoolean(true);
    out.writeDouble();
    out.writeUTF("str");
    out.close();
    DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream("test.txt")));
    //注意讀取有順序區分
    System.out.println(in.readChar()+" "+in.readBoolean()+" "+in.readDouble()+" "+in.readUTF());
    in.close();
} catch (IOException e) {
    e.printStackTrace();
}
           
c true 12.3222222 str

随機存儲通路資料

String fileName="test.txt";
try {
    RandomAccessFile out=new RandomAccessFile(fileName,"rw");
    out.writeDouble();
    out.writeDouble();
    out.writeDouble();
    out.writeDouble();
    out.writeDouble();
    out.close();
    RandomAccessFile in=new RandomAccessFile(fileName,"rw");
    System.out.println(in.readDouble()+" "+in.readDouble()+" "+in.readDouble()+" "+in.readDouble()+" "+in.readDouble()+" ");
    //in.close();
    out=new RandomAccessFile(fileName,"rw");
    //一個double數值為位元組
    out.seek();
    out.writeDouble();
    out.close();
    //in=new RandomAccessFile(fileName,"r");
    //回到開始位置,重新讀取資料
    in.seek();
    System.out.println(in.readDouble()+" "+in.readDouble()+" "+in.readDouble()+" "+in.readDouble()+" "+in.readDouble()+" ");
    in.close();
}catch (IOException e){
    e.printStackTrace();
}
           

0.0 0.1 0.2 0.3 0.4

0.0 1.0 0.2 0.3 0.4