文件操作
Java流簡介
文件File的使用
FileOutputStream和FileInputStream的使用
FileWriter和FileReader的使用
ObjectOutputStream和ObjectInputStream的使用
BufferedOutputStream和BufferedInputStream的使用
BufferedWriter和BufferedReader的使用
PrintStream和PrintWriter的使用
一.Java流(Stream)
Java.io 包幾乎包含了所有操作輸入挺份、輸出需要的類赖草。所有這些流類代表了輸入源和輸出目標(biāo)滑燃。
流Stream,封裝數(shù)據(jù)的寫入寫出虚汛,統(tǒng)一管理數(shù)據(jù)的寫入和讀取
一個(gè)流可以理解為一個(gè)數(shù)據(jù)的序列。流的方向裕便,參考的是自己的內(nèi)存空間-代碼的位置是內(nèi)存空間暑椰。
輸出流:從內(nèi)存空間將數(shù)據(jù)寫到外部。
輸入流:將外部數(shù)據(jù)寫到內(nèi)存中现使。
字節(jié)流類型通過byte[]數(shù)組碳锈,接受數(shù)據(jù)或者保存數(shù)據(jù)顽冶。
字符流類型通過char[]數(shù)組,接受數(shù)據(jù)或者保存數(shù)據(jù)售碳。
二.文件File
1.構(gòu)造方法
//通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建 File(String pathname) //從父抽象路徑名和子路徑名字符串創(chuàng)建 File(File parent, String child) //從父路徑名字符串和子路徑名字符串創(chuàng)建 File(String parent, String child) //通過將給定的 file: URI轉(zhuǎn)換為抽象路徑名來創(chuàng)建 File(URL uri)
2.具體的方法
- 測試此抽象路徑名表示的文件或目錄是否存在强重。
public boolean exists()
- 當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí),原子地創(chuàng)建一個(gè)由該抽象路徑名命名的新的空文件贸人。
public boolean createNewFile() throws IOException
- 測試此抽象路徑名表示的文件是否為目錄间景。
public boolean isDirectory()
- 測試此抽象路徑名表示的文件是否為普通文件。
public boolean isFile()
- 刪除由此抽象路徑名表示的文件或目錄艺智。 如果此路徑名表示目錄倘要,則目錄必須為空才能刪除。
public boolean delete()
- 創(chuàng)建由此抽象路徑名命名的目錄十拣。
public boolean mkdir()
- 創(chuàng)建由此抽象路徑名命名的目錄封拧,包括任何必需但不存在的父目錄。請注意夭问,如果此操作失敗泽西,它可能已成功創(chuàng)建一些必需的父目錄。
public boolean mkdirs()
- 返回一個(gè)抽象路徑名數(shù)組缰趋,表示由該抽象路徑名表示的目錄中的文件捧杉。如果此抽象路徑名不表示目錄唇撬,則此方法返回null 足绅。
public File[] listFiles()
- 返回一個(gè)抽象路徑名數(shù)組族购,表示由此抽象路徑名表示的滿足指定過濾器的目錄中的文件和目錄旁瘫。
public File[] listFiles(FilenameFilter filter)
- 創(chuàng)建例子
String path = "G:/Android_Studio"; //方式1 File file = new File(path.concat("/1.txt")); //方式2 File file = new File(path,"1.txt"); //判斷是否存在 if (file.exists() == false){ //不存在就創(chuàng)建 file.createNewFile(); }
三.FileOutputStream和FileInputStream的使用
FileOutputStream
1.構(gòu)造方法
第二個(gè)參數(shù)默認(rèn)是false直撤,寫入是覆蓋寫入非竿;true表示追加方式寫入。
//創(chuàng)建文件輸出流以指定的名稱寫入文件谋竖。 FileOutputStream(String name) //創(chuàng)建文件輸出流以指定的名稱寫入文件红柱。 FileOutputStream(String name, boolean append) // 創(chuàng)建文件輸出流以寫入由指定的 File對象表示的文件。 FileOutputStream(File file) //創(chuàng)建文件輸出流以寫入由指定的 File對象表示的文件 FileOutputStream(File file, boolean append)
2.寫入數(shù)據(jù)方法
//將 b.length字節(jié)從指定的字節(jié)數(shù)組寫入此文件輸出流蓖乘。 public void write(byte[] b) throws IOException //從位于偏移量 off的指定字節(jié)數(shù)組寫入 len字節(jié)到該文件輸出流锤悄。 public void write(byte[] b int off, int len) throws IOException
3.關(guān)閉連接方法
//關(guān)閉此文件輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。 此文件輸出流可能不再用于寫入字節(jié)嘉抒。 public void close() throws IOException
4.清空流零聚,把緩沖區(qū)的內(nèi)容強(qiáng)制的寫出
flush
FileInputStream
1.構(gòu)造方法
//通過打開與實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream //該文件由文件系統(tǒng)中的路徑名 name命名。 FileInputStream(String name) // 通過打開與實(shí)際文件的連接創(chuàng)建一個(gè) FileInputStream //該文件由文件系統(tǒng)中的 File對象 file命名些侍。 FileIntputStream(File file)
2.讀取數(shù)據(jù)方法
//返回值是讀取到緩沖區(qū)的總字節(jié)數(shù)隶症;如果為-1,達(dá)到文件末尾 //從該輸入流讀取最多b.length字節(jié)的數(shù)據(jù)到字節(jié)數(shù)組岗宣。 public int read(byte[] b) throws IOException //從該輸入流讀取最多l(xiāng)en字節(jié)的數(shù)據(jù)到字節(jié)數(shù)組蚂会,起始索引從off開始。 public int read(byte[] b int off,int len) throws IOException
3.關(guān)閉連接方法
//關(guān)閉此文件輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源耗式。 // 如果該流具有相關(guān)聯(lián)的信道胁住,則該信道也被關(guān)閉。 public void close() throws IOException
FileOutputStream和FileInputStream的具體使用
String path = "G:/Android_Studio/AndroidStudioProjects/JavaCode/Java/src/main/java/swu/xl/day8/Base"; File file = new File(path.concat("/1.txt")); //判斷是否存在 if (file.exists() == false){ //不存在就創(chuàng)建 file.createNewFile(); } //1.創(chuàng)建文件輸出流對象 FileOutputStream fos = new FileOutputStream(file); //2.調(diào)用write方法寫入 byte[] bytes = {'a','b','c'}; fos.write(bytes); //3.把緩沖區(qū)的內(nèi)容強(qiáng)制寫出刊咳,確保緩沖區(qū)沒有東西 fos.flush(); //4.操作完畢需要關(guān)閉Stream對象 fos.close(); FileInputStream fis = new FileInputStream(file); //2.調(diào)用read方法寫入 byte[] names = new byte[12]; int count = fis.read(names); fis.close(); System.out.println(count+" "+(new String(names)));
四.FileWriter和FileReader的使用
FileWriter
1.構(gòu)造方法
第二個(gè)參數(shù)默認(rèn)是false彪见,寫入是覆蓋寫入;true表示追加方式寫入娱挨。
//構(gòu)造一個(gè)給定文件名的FileWriter對象余指。 FileWriter(String fileName) //構(gòu)造一個(gè)給定文件名的FileWriter對象。 FileWriter(String fileName, boolean append) //給一個(gè)File對象構(gòu)造一個(gè)FileWriter對象让蕾。 FileWriter(File file) //給一個(gè)File對象構(gòu)造一個(gè)FileWriter對象浪规。 FileWriter(File file, boolean append)
2.寫入數(shù)據(jù)方法
//寫入字符數(shù)組 public void write(char[] cbuf) throws IOException //寫入字符數(shù)組的一部分。 public void write(char[] cbuf,int off,int len) throws IOException // 寫一個(gè)字符串 public void write(String str) throws IOException // 寫一個(gè)字符串的一部分探孝。 public void write(String str, int off, int len) throws IOException
3.關(guān)閉連接方法
//關(guān)閉此文件輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源笋婿。 此文件輸出流可能不再用于寫入字節(jié)。 public void close() throws IOException
4.清空流顿颅,緩沖區(qū)的內(nèi)容強(qiáng)制的寫出
flush
FileReader
1.構(gòu)造方法
//創(chuàng)建一個(gè)新的 FileReader 缸濒,給定要讀取的文件的名稱。 FileReader(String name) //創(chuàng)建一個(gè)新的 FileReader ,給出 File讀取庇配。 FileIReader(File file)
2.讀取數(shù)據(jù)方法
//將字符讀入數(shù)組 public int read(char[] cbuf) throws IOException //將字符讀入數(shù)組的一部分斩跌。 public int read(char[] cbuf, int offset, int length) throws IOException
3.關(guān)閉連接方法
//關(guān)閉此文件輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源。 // 如果該流具有相關(guān)聯(lián)的信道捞慌,則該信道也被關(guān)閉耀鸦。 public void close() throws IOException
FileWriter和FileReader的具體使用
String path = "G:/Android_Studio/AndroidStudioProjects/JavaCode/Java/src/main/java/swu/xl/day8/Base"; File file = new File(path.concat("/1.txt")); //判斷是否存在 if (file.exists() == false){ //不存在就創(chuàng)建 file.createNewFile(); } //1.創(chuàng)建文件輸出流對象 FileWriter fw = new FileWriter(file); //2.調(diào)用write方法寫入 char[] name = {'安','桌','開','發(fā)'}; fw.write(name); //String string = new String("sac"); //fw.write(string); //3.把緩沖區(qū)的內(nèi)容強(qiáng)制寫出,確保緩沖區(qū)沒有東西 fw.flush(); //4.操作完畢需要關(guān)閉Stream對象 fw.close(); FileReader fr = new FileReader(file); char[] book = new char[4]; count = fr.read(book); fr.close(); System.out.println(count+" "+(new String(book)));
五.ObjectOutputStream和ObjectInputStream
ObjectOutputStream
和ObjectInputStream
用于向文件中寫入對象啸澡,類似于iOS的NSKeyedArchiver
和NSKeyedUnarchiver
對數(shù)據(jù)的歸檔和解檔袖订。類比iOS對自定義的類創(chuàng)建出來的對象進(jìn)行歸檔,我們需要先實(shí)現(xiàn)
NSCoding協(xié)議
嗅虏。Java里面需要對自定義的類實(shí)現(xiàn)
serializable接口
實(shí)現(xiàn)序列化洛姑,該接口沒有任何方法。如果自定義的類內(nèi)部還有屬性變量是其他自定義的類的對象皮服,這個(gè)類也必須實(shí)現(xiàn)
Seriablizable
接口
ObjectOutputStream
和ObjectInputStream
都需要傳入一個(gè)OutputStream
和InputStream
類型的對象楞艾,它們是抽象類,所以使用子類FileOutputStream
和FileInputStream
來實(shí)現(xiàn)初始化龄广。具體使用
//序列化好的類 import java.io.Serializable; public class Person implements Serializable { String name; int age; } //file和之前的例子相同 //具體寫入 Person xw = new Person(); xw.name = "小王"; xw.age = 18; OutputStream os = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(xw); oos.close(); //具體讀取 InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is); Person xw = (Person) ois.readObject(); System.out.println(xw.name+" "+xw.age); ois.close();
六.BufferedOutputStream和BufferedInputStream
BufferedOutputStream
和BufferedInputStream
類的構(gòu)造函數(shù)都需要傳入一個(gè)OutputStream
或InputStream
類型的對象硫眯,它們是抽象類,所以使用子類FileOutputStream
或FileInputStream
來實(shí)現(xiàn)初始化蜀细。數(shù)據(jù)覆蓋寫入的意思是下一次運(yùn)行寫入是覆蓋寫入舟铜,
RandomAccessFile
有類似于C語言文件操作中seek
,如果你想要可以讀取文件的任意位置可以使用它奠衔。具體使用:將圖片復(fù)制到指定位置谆刨。
//1.源文件的路徑 String sourcePath = "C:/Users/a2867/Desktop/壁紙/1.jpg"; //2.目標(biāo)文件的路徑 String desPath = "C:/Users/a2867/Desktop/1.jpg"; FileInputStream fis = new FileInputStream(sourcePath); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(desPath); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] in = new byte[1024]; int count = 0; while((count = bis.read(in)) != -1){ bos.write(in,0,count); } bis.close(); bos.flush(); bos.close();
七.BufferedWriter和BufferedReader的使用
BufferedWriter
和BufferedReader
類的構(gòu)造函數(shù)都需要傳入一個(gè)OutputStreamWriter
或InputStreamReader
類型的對象。
OutputStreamWriter
和InputStreamReader
類的構(gòu)造函數(shù)都需要傳入一個(gè)OutputStream
或InputStream
類型的對象归斤。
public readLine() throws IOException
讀一行文字痊夭。 一行被視為由換行符('\ n'),回車符('\ r')中的任何一個(gè)或隨后的換行符終止脏里。具體使用:將圖片復(fù)制到指定位置她我。
//1.源文件的路徑 String sourcePath = "C:/Users/a2867/Desktop/壁紙/1.jpg"; //2.目標(biāo)文件的路徑 String desPath = "C:/Users/a2867/Desktop/1.jpg"; FileInputStream fis = new FileInputStream(sourcePath); BufferedReader bis = new BufferedReader(new InputStreamReader(fis)); FileOutputStream fos = new FileOutputStream(desPath); BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(fos)); char[] in = new char[1024]; int count = 0; while((count = bis.read(in)) != -1){ bos.write(in,0,count); } bis.close(); bos.flush(); bos.close(); //結(jié)果不對,對于這種圖片迫横,視頻等操作建議使用字節(jié)流方式番舆,不然很可能出錯(cuò)
具體使用:讀取控制臺輸入(Java 的控制臺輸入由 System.in 完成)
public class BRReadLines { public static void main(String args[]) throws IOException { // 使用 System.in 創(chuàng)建 BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; System.out.println("Enter lines of text."); System.out.println("Enter 'end' to quit."); do { str = br.readLine(); System.out.println(str); } while (!str.equals("end")); } } 輸出: Enter lines of text. Enter 'end' to quit. This is line one This is line one This is line two This is line two end end
八.PrintStream和PrintWriter的使用
PrintStream
Java的控制臺的輸出由
print()
和println()
完成。這些方法都由類PrintStream
定義矾踱,System.out
是該類對象的一個(gè)引用恨狈。
PrintStream
繼承了OutputStream
類,并且實(shí)現(xiàn)了方法write()
呛讲。這樣禾怠,write()
也可以用來往控制臺寫操作返奉。
write()
方法不經(jīng)常使用,因?yàn)?code>print()和println()
方法用起來更為方便吗氏。
format()
使用指定的格式字符串和參數(shù)將格式化的字符串寫入此輸出流芽偏。
append()
將指定的字符或者字符序列附加到此輸出流。
checkError()
刷新流并檢查其錯(cuò)誤狀弦讽,因?yàn)樵撦敵隽鞑粫伄惓污尉!?/strong>
clearError()
清除此流的內(nèi)部錯(cuò)誤狀態(tài)。坦袍。
flush()
刷新流十厢。
close()
關(guān)閉流等太。具體使用:向控制臺輸出
public class WriteDemo { public static void main(String args[]) { int b; b = 'A'; System.out.write(b); System.out.write('\n'); } } 輸出: A
PrintWriter
構(gòu)造方法:
public PrintWriter(Writer out,boolean autoFlush)
其他方法和PrintStream類似
PrintStream和PrintWriter的區(qū)別
PrintStream操縱的是字節(jié)流捂齐,PrintWriter操縱的是字符流。
PrintStream在遇到換行符的時(shí)候就會自動(dòng)刷新缩抡,即在調(diào)用了println()方法奠宜,或者文本中出現(xiàn)“\n”,就會自動(dòng)flush。
PrintWriter需要在構(gòu)造方法中設(shè)置自動(dòng)刷新瞻想,或者手動(dòng)flush压真。