1. 程式人生 > >java I/O總結(一)

java I/O總結(一)

roc rec blob term interface new 數據源 回調 acc

File類:

即能代表一個特定文件的名稱,又能代表一個目錄下的一組文件的名稱。File類也可以用來創建新的目錄。

File file = new File( "D:/test.txt");

file.exists();

File file2 = new File( "D:/mkdir");

file2.mkdir();

File2.mkdirs();

file.length();

file.renameTo( new File("d:/test2.txt"));

file.delete();

file.isDirectory();

String[] fileNames = file.list(); 返回一個文件名的字符數組

File[] files = file.listFiles(); 返回一個file類型的數組

其中List()參數可以為一個實現了FilenameFilter接口的對象,通過回調accept方法實現返回值的過濾:
public interface FilenameFilter{

boolean accept(File dir,String name);

}

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

}

}

如何產生一個文件集?

1. local()產生本地目錄中的文件構成的File對象數組

2. Walk()產生給定目錄下的由整個目錄樹中所有文件構成的List<File>

區別:local使用file.listFiles方法(是File.list的變體),產生File數組;Walk通過遞歸調用

recurseDirs()返回treeinfo對象,分為treeInfo.files 保存當前目錄下的所有文件, treeInfo.dirs 保存所有目錄。

stream:代表任何有能力產出數據的數據源或者是有能力接收數據的接收端對象。

Inputstream:常見數據源包括:字節數組,string對象,文件。

每一種數據源都有相應的inputstream子類,

FileInputstreamStringBufferInputStreamByteArrayInputStream,FilterInputStream...

其中FilterInputStream是一個子類,抽象類,為裝飾器提供基類。

子類:DataInputStream讀取基本數據類型,bufferedInputStream使用緩沖區...

OutputStream:決定了輸出要去的目標,包括字節數組,文件,管道。

FileOutputStream,ByteArrayOutputStream,FilterOutputStream

FilterOutputStream是一個outputstream的子類,抽象類,為裝飾器提供基類。

子類:DataOutputStream寫入基本數據類型,bufferedOutputStream使用緩沖區,printStream格式化輸出。

通過繼承,任何自inputstreamreader派生而來的類都含有名為read的基本方法,任何自outputstreamwriter派生而來的類都含有名為write的基本方法。

我們通常通過疊加多個對象來提供所期望的功能(裝飾器模式)。對於InputstreamOutputStream,我們會使用FilterInputStreamFilterOutputStream的裝飾器子類來修改流以滿足特殊需要。IO流之間可以組合,組合的目的是把多種類的特性融合在一起以實現更多的功能。組合使用的方式通過把一個流放入另一個流的構造器中即可實現。

如:InputStream is = new BufferedInputStream( new FileInputStream(file));

ReaderWriter

提供兼容unicode和面向字符的I/O功能,而inputStreamoutputStream是面向字節。

數據來源去處對應關系:

InputStream Reader 適配器:InputStreamReader

OutputStream Writer 適配器: OutputStreamWriter

FileInputStream FileReader

FileOutputStream FileWriter

StringBufferInputStream (已棄用) StringReader

ByteArrayInputStream CharArrayReader

ByteArrayOutputStream CharArrayWriter

更改流的行為Filter對應關系:

FilterInputStream FilterReader

FilterOutputStream FilterWriter(抽象類,沒有子類)

BufferedInputStream BufferedReader

BufferedOutputStream BufferedWriter

DataInputStream DataInputStream(除了使用readline()時,使用BufferedReader)

圖表示:

技術分享圖片

字節流可以轉換為字符流:

File file= new File( "d:/test.txt");

InputStream is= new FileInputStream( file);

Reader reader= new InputStreamReader( is);

為了簡化對文件的讀寫操作,可以使用TextFile類:public class TextFile extends ArrayList<String>

類中有兩個靜態方法: public static String read(String fileName)

public static void write (String fileName, String text)

構造方法: public TextFile(String fileName, String splitter){

super(Arrays.asList(read(fileName).split(splitter)));

if(get(0).equals("")) remove(0);

} 將我們創建的textfile對象用arraylist保存文件的若幹行

public TextFile(String fileName){

this(fileName,"\n"); 默認按照行讀取

}

非靜態方法:public void write(String fileName)可以將一個已經存在的文件寫入到另一個文件。

與之對應的二進制文件類:BinaryFile

另一種方式為java.util.Scanner類,但只能用於讀取文件,不能用於寫入文件。

標準I/O:
意義在於我們可以很容易的把程序串聯起來,一個程序的標準輸出可以作為另一個程序的標準輸入。

重點在於提供程序與用戶之間,程序與程序之間,數據傳輸的標準。

Java提供了System.inSystem.outSystem.err.

其中System.outSystem.err已經被包裝成PrintStream

System.in是一個未包裝的inputStream,使用之前對其進行包裝:

BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

Javasystem類提供了一些靜態方法調用,以實現對標準輸入,輸出,和錯誤流進行重定向:

setIn(InputStream)使輸入不再只是通過鍵盤,可以定義為一個文件

setOut(PrintStream)是輸出不再只是控制臺,可以輸出到一個文件

setErr(PrintStream)


java I/O總結(一)