1.文件讀寫相關(guān)的類
(1) java.io.InputStream: 抽象類,輸入字節(jié)流,可以將本輸入流中的字節(jié)讀取出來。
主要方法: void read(byte[] b):從輸入流中讀取一定數(shù)量的字節(jié),將其存儲(chǔ)在緩沖區(qū)數(shù)組b中。
(2) java.io.OutputStream: 抽象類,輸出字節(jié)流,可以接收待輸出的字節(jié)并將這些字節(jié)發(fā)送到某個(gè)接收器。
主要方法: void write(byte[] b):接收byte數(shù)組中的字節(jié),將byte數(shù)組中的字節(jié)寫入此輸出流。
(3) FileInputStream: 是InputStream的子類,文件輸入流,可以從文件系統(tǒng)中的某個(gè)文件中獲得輸入字節(jié)。
主要方法: FileInputStream FileInputStream(File file):通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè)文件輸入流,該文件通過File對(duì)象指定。
void read(byte[] b):將此文件輸入流中將最多b.length個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè)byte數(shù)組b中。
(4) FileOutputStream: 是OutputStream的子類,文件輸出流,可以從byte數(shù)組中接收數(shù)據(jù)并將數(shù)據(jù)寫入某個(gè)文件。
主要方法: FileOutputStream FileOutputStream(File file):創(chuàng)建一個(gè)準(zhǔn)備向file所表示的文件中寫入數(shù)據(jù)的文件輸出流。
void write(byte[] b):將byte數(shù)組b中的字節(jié)寫入此文件輸出流。
(5) File: 文件或目錄路徑名的抽象表示形式,此類的實(shí)例可能表示實(shí)際的文件系統(tǒng)對(duì)象(一個(gè)文件或一個(gè)目錄),也可能不表示實(shí)際的文件系統(tǒng)對(duì)象。File類的實(shí)例時(shí)不可變的,一旦創(chuàng)建,其對(duì)象表示的抽象路徑名將永不改變。
主要方法: File File(String pathname):通過將給定的路徑名字符串pathname轉(zhuǎn)換為抽象路徑來創(chuàng)建一個(gè)新的File實(shí)例。
boolean delete():刪除此抽象路徑名表示的文件或目錄。
boolean exists():測(cè)試此抽象路徑名表示的文件或目錄是否實(shí)際存在。
String getAbsolutePath():返回此抽象路徑名的絕對(duì)路徑名字符串(帶盤符)。
String getPath():將此抽象路徑名轉(zhuǎn)換成一個(gè)路徑名字符串。
String getParent():返回此抽象路徑名的父目錄的路徑名字符串,如果沒有父目錄則返回null。
boolean isDirectory():測(cè)試此抽象路徑名表示的文件是否是一個(gè)目錄,只有是目錄且實(shí)際存在才會(huì)返回true。
boolean isFile():測(cè)試此抽象路徑名表示的文件是否是一個(gè)標(biāo)準(zhǔn)文件,只有是標(biāo)準(zhǔn)文件且實(shí)際存在才會(huì)返回true。
String[] list():返回一個(gè)字符串?dāng)?shù)組,這些字符串指定此抽象路徑名所表示的目錄中的文件了目錄,即返回一個(gè)文件夾下所有的文件名和文件夾名。
boolean mkdir():創(chuàng)建此抽象路徑名指定的目錄,即創(chuàng)建文件夾。如果此路徑中有不存在的父文件夾,則創(chuàng)建失敗,返回false。
boolean mkdirs():創(chuàng)建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
boolean createNewFile():當(dāng)且僅當(dāng)不存在此抽象路徑名指定的文件時(shí),不可分地創(chuàng)建一個(gè)新的空文件。
(6) DataInputStream: java.io.FilterInputStream的子類,數(shù)據(jù)輸入流,允許應(yīng)用程序以與機(jī)器無關(guān)的方式從底層輸入流中讀取基本Java數(shù)據(jù)類型。
主要方法: DataInputStream DataInputStream(InputStream in):使用指定的底層InputStream創(chuàng)建一個(gè)DataInputStream。
String readUTF():讀入一個(gè)使用UTF-8格式編碼的字符串,以String形式返回此字符串。
(7) DataOutputStream: java.io.FilterOutputStream的子類,數(shù)據(jù)輸出流,允許應(yīng)用程序以適當(dāng)?shù)姆绞綄ava基本數(shù)據(jù)類型的數(shù)據(jù)寫入輸出流中。
主要方法: DataOutputStream DataOutputStream(OutputStream out):使用指定的底層OutputStream創(chuàng)建一個(gè)新的數(shù)據(jù)輸出流。
void writeUTF(String str):以與機(jī)器無關(guān)的方式使用UTF-8編碼將一個(gè)字符串寫入基礎(chǔ)輸出流。
(8) InputStreamReader: java.io.Reader的子類,是字節(jié)流(文件)通向字符流的橋梁,可以使用指定的字符集讀取字節(jié),并將其解碼為字符。
主要方法: InputStreamReader InputStreamReader(InputStream in,CharSet c s):由輸入流對(duì)象創(chuàng)建使用指定字符集的InputStreamReader。
int read():讀取單個(gè)字符。
(9) OutputStreamWriter: java.io.Writer的子類,是字符流通向字節(jié)流(文件)的的橋梁,可使用指定的字符集將要寫入流中的字符編碼成字節(jié)。
主要方法: OutputStreamWriter OutputStreamWriter(OutputStream out,Charset cs):由輸出流對(duì)象創(chuàng)建使用指定符集的OutputStreamWriter。
void write(int c):寫入單個(gè)字符。
void write(String str,int off,int len):寫入字符串的一部分到文件中。
(10) BufferedReader: java.io.Reader的子類,從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取。
主要方法: BufferedReader BufferedReader(Reader in):創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。
int read():讀取單個(gè)字符。
String readLine():讀取一行文本。
(11) BufferedWriter: java.io.Writer的子類,將文本寫入字符輸出流,緩沖各個(gè)字符,提供單個(gè)字符、數(shù)組和字符串的高效寫入。
主要方法: BufferedWriter BufferedWriter(Writer out):創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流。
void write(int c):寫入單個(gè)字符。
void write(String s,int off,int len):寫入字符串的某一部分到文件中。
void newLine():寫入一個(gè)行分隔符。
(12) FileReader: java.io.InputStreamReader的子類,是用來讀取字符文件的便捷類,用于讀取字符流。此類的構(gòu)造方法默認(rèn)的字符編碼和默認(rèn)字節(jié)緩沖區(qū)大小都是適當(dāng)?shù)摹?div style="height:15px;">
主要方法: FileReader FileReader(File file):為給定的File對(duì)象創(chuàng)建一個(gè)新的FileReader。
(13) FileWriter: java.io.OutputStreamWriter的子類,是用來寫入字符文件的便捷類,用于寫入字節(jié)流。如果要寫入原始字節(jié)流,則考慮使用FileOutputStream。
主要方法: FileWriter FileWriter(File file):為給定的FIle對(duì)象創(chuàng)建一個(gè)新的FileWriter。
(14) PrintWriter: java.io.Writer的子類,向文本輸出流打印對(duì)象的格式化表示形式,不包含用于寫入原始字節(jié)的方法。
主要方法: PrintWriter PrintWriter(File file,String csn): 使用指定文件和字符集創(chuàng)建一個(gè)不具有自動(dòng)行刷新的新PrintWriter對(duì)象。
PrintWriter PrintWriter(OutputStream out,boolean autoFlush):根據(jù)現(xiàn)有的OutputStream創(chuàng)建新的PrintWriter對(duì)象。
PrintWriter PrintWriter(Writer out,boolean autoFlush):根據(jù)Writer創(chuàng)建新的PrintWriter。
PrintWriter append(CharSequence):將指定的字符序列添加到此writer。
void println(String x):打印字符串到文件中,然后終止該行。
void write(String s):寫入字符串道文件中。
(15) PrintStream: java.io.FilterOutputStream的子類,為其他的輸出流添加了功能,使他們能夠方便地打印各種數(shù)據(jù)值表示形式。與其他輸出流不同,PrintStream永遠(yuǎn)不會(huì)拋出IOException。
主要方法:PrintStream PrintStream(File file,String csn):創(chuàng)建具有指定名稱和字符集且不帶自動(dòng)行刷新的打印流。
PrintStream PrintStream(OutputStream out,boolean autoFlush):根據(jù)已有的OutputStream對(duì)象創(chuàng)建新的打印流。
PrintStream append(CharSequence csq):將指定字符序列添加到此輸出流。
void println(String x):打印一行字符串。
void write(byte[] buf,int off,int len):將len字節(jié)從知道那個(gè)的初始偏移量為off的byte數(shù)組中寫入此流。
2. 讀取文件byte內(nèi)容并輸出到控制臺(tái)
讀取文件byte內(nèi)容的處理流程:由文件的File對(duì)象生成FileInputStream對(duì)象 --> FileInputStream對(duì)象調(diào)用read函數(shù)將文件內(nèi)容讀入byte數(shù)組 --> 輸出byte數(shù)組中的內(nèi)容到控制臺(tái)。其實(shí)現(xiàn)源代碼如下所示,
1 import java.io.FileInputStream; 2 import java.io.IOException; 3 import java.util.Arrays; 4 5 import org.dom4j.DocumentException; 6 7 public class FileIO 8 { 9 void readFile(String filepath)throws IOException10 {11 File f=new File(filepath);12 if(!f.exists())13 {14 System.out.println("文件"+f.getAbsolutePath()+"不存在!");15 return;16 }17 else18 {19 FileInputStream fis=new FileInputStream(f);//創(chuàng)建對(duì)應(yīng)f的文件輸入流20 byte[] b=new byte[(int)f.length()];//創(chuàng)建一個(gè)長度等于文件f長度的byte數(shù)組,用于存放從文件中讀出的數(shù)據(jù)21 fis.read(b);22 String str=Arrays.toString(b);23 System.out.println(str);24 fis.close(); 25 }26 }27 28 public static void main(String args[])throws IOException, DocumentException29 {30 FileIO fio=new FileIO();31 fio.readFile("WebRoot\\accessed_files\\test.txt"); 33 }34 }
其中test.txt中只有一行內(nèi)容:“你好,我是chloe”,運(yùn)行程序輸出的byte數(shù)組內(nèi)容為
[-60, -29, -70, -61, -93, -84, -50, -46, -54, -57, 99, 104, 108, 111, 101]
3. 向文件中寫入byte數(shù)據(jù)
向文件中輸入byte數(shù)據(jù)的處理過程:由文件的File對(duì)象生成FileOutputStream對(duì)象 --> FileOutputStream對(duì)象調(diào)用write函數(shù)將byte數(shù)組中的內(nèi)容寫入文件。其實(shí)現(xiàn)源代碼如下
1 package chloe.fileio; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.util.Arrays; 7 8 import org.dom4j.DocumentException; 9 10 public class FileIO 11 { 12 void writeToFile(String filepath,byte b[])throws IOException13 {14 File f=new File(filepath);15 if(!f.exists())16 {17 f.createNewFile();18 System.out.println("文件"+f.getPath()+"已創(chuàng)建");19 }20 FileOutputStream fos=new FileOutputStream(f);21 fos.write(b);22 System.out.println("文件內(nèi)容寫入完畢");23 }24 25 public static void main(String args[])throws IOException, DocumentException26 {27 FileIO fio=new FileIO();28 byte[] b=new byte[15];29 b[0]=(byte)-60;30 b[1]=(byte)-29;31 b[2]=(byte)-70;32 b[3]=(byte)-61;33 b[4]=(byte)-93;34 b[5]=(byte)-84;35 b[6]=(byte)-50;36 b[7]=(byte)-46;37 b[8]=(byte)-54;38 b[9]=(byte)-57;39 b[10]=(byte)99;40 b[11]=(byte)104;41 b[12]=(byte)108;42 b[13]=(byte)111;43 b[14]=(byte)101;44 fio.writeToFile("WebRoot\\accessed_files\\test1.txt", b);45 46 }47 48 }
運(yùn)行后打開生成的文件test1.txt,其中的內(nèi)容為“你好,我是chloe”。
以上是從文件中讀取byte數(shù)組數(shù)據(jù)和向?qū)懭隻yte數(shù)組,如果需要直接從文件中讀取字符串或者向文件中寫入字符串,則要使用類型DataInputStream和DataOutputStream.
4. 使用DataOutputStream和DataInputStream寫入和讀取字符串
寫入處理流程:由文件的File對(duì)象生成FileOutputStream對(duì)象 --> 由FileOutputStream對(duì)象生成DataOutputStream對(duì)象 --> DataOutputStream對(duì)象調(diào)用writeUTF函數(shù)將字符串寫入文件
讀取處理流程:由文件的File對(duì)象生成FileInputStream對(duì)象 --> 由FileInputStream對(duì)象生成DataInputStream對(duì)象 --> DataInputStream對(duì)象調(diào)用readUTF函數(shù)將文件內(nèi)容讀入字符串 --> 輸出字符串內(nèi)容到控制臺(tái)
其實(shí)現(xiàn)代碼如下所示,
1 void writeStrToFile(String filepath,String str)throws IOException 2 { 3 File f=new File(filepath); 4 if(!f.exists()) 5 { 6 f.createNewFile(); 7 System.out.println("文件"+f.getPath()+"已創(chuàng)建"); 8 } 9 FileOutputStream fos=new FileOutputStream(f);10 DataOutputStream dos=new DataOutputStream(fos);11 dos.writeUTF(str);12 System.out.println("文件內(nèi)容寫入完畢");13 dos.close();14 fos.close();15 }16 17 String readStrFromFile(String filepath)throws IOException18 {19 String result;20 File f=new File(filepath);21 if(!f.exists())22 {23 System.out.println("文件"+f.getAbsolutePath()+"不存在!");24 return "";25 }26 else27 {28 FileInputStream fis=new FileInputStream(f);//創(chuàng)建對(duì)應(yīng)f的文件輸入流29 DataInputStream dis=new DataInputStream(fis);30 result=dis.readUTF();//只有先用DataOutputStream的write方法寫入合規(guī)則的數(shù)據(jù)后才能正常讀出內(nèi)容31 dis.close();32 fis.close();33 if (result!=null)34 return result;35 else 36 return "";37 38 }39 }40 41 public static void main(String args[])throws IOException, DocumentException42 {43 FileIO fio=new FileIO();44 fio.writeStrToFile("WebRoot\\accessed_files\\test.txt", "你好,我是Chloe~");45 System.out.println("讀取的文件內(nèi)容為:"+fio.readStrFromFile("WebRoot\\accessed_files\\test.txt"));46 47 48 }49 50 }
運(yùn)行后輸出如下結(jié)果,
1 文件內(nèi)容寫入完畢2 讀取的文件內(nèi)容為:你好,我是Chloe~
注意,使用DataInputStream讀取文件內(nèi)容時(shí),只有讀取由DataOutputStream寫入的數(shù)據(jù)才會(huì)正常,否則會(huì)報(bào)EOFException,所以我感覺這兩個(gè)類不是很好用。
5. 使用BufferedReader和BufferedWriter寫入和讀取字符串
讀取字符串時(shí),只要在創(chuàng)建InputStreamReader時(shí)指定正確的編碼方式,即其編碼方式與文件本身的編碼方式一致就可以正確讀取文件內(nèi)容,代碼如下,
1 String readLinesFromFile(String filepath) throws IOException 2 { 3 String result=""; 4 String line; 5 File f=new File(filepath); 6 if(!f.exists()) 7 { 8 System.out.println("文件"+f.getAbsolutePath()+"不存在!"); 9 return "";10 }11 else12 {13 FileInputStream fis=new FileInputStream(f);//創(chuàng)建對(duì)應(yīng)f的文件輸入流14 InputStreamReader isr=new InputStreamReader(fis,"UTF-8");15 BufferedReader br=new BufferedReader(isr);16 while((line=br.readLine())!=null)17 {18 result=result+line+"\n";19 }20 return result; 21 }22 }23 public static void main(String args[])throws IOException, DocumentException24 {25 FileIO fio=new FileIO();26 System.out.print(fio.readLinesFromFile("WebRoot\\accessed_files\\test.txt"));27 }
另外,還可以利用更加便捷的寫入字符文件的類FileReader實(shí)現(xiàn)上述功能,只用將上面的第13~15行改為:
FileReader fr=new FileReader(f);BufferedReader br=new BufferedReader(fr);
向文件中寫入字符串時(shí),創(chuàng)建OutputStreamWriter也盡量要指明編碼方式,方便之后正確讀取。
1 void writeLinesToFile(String filepath,String[]strs)throws IOException 2 { 3 File f=new File(filepath); 4 if(!f.exists()) 5 { 6 f.createNewFile(); 7 System.out.println("文件"+f.getPath()+"已創(chuàng)建"); 8 } 9 FileOutputStream fos=new FileOutputStream(f);10 OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");11 BufferedWriter bw=new BufferedWriter(osw);12 for(int i=0;i<strs.length;i++)13 {14 bw.write(strs[i]);15 bw.newLine();16 }17 System.out.println("文件內(nèi)容寫入完畢");18 bw.close();19 osw.close();20 fos.close();21 }22 public static void main(String args[])throws IOException, DocumentException23 {24 FileIO fio=new FileIO();25 String[] s={"第一行","第二行"," 最后一行"};26 fio.writeLinesToFile("WebRoot\\accessed_files\\test.txt", s);27 }v