Java 文件操作

文件操作

  • 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

  • ObjectOutputStreamObjectInputStream用于向文件中寫入對象啸澡,類似于iOS的NSKeyedArchiverNSKeyedUnarchiver對數(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接口

  • ObjectOutputStreamObjectInputStream都需要傳入一個(gè)OutputStreamInputStream類型的對象楞艾,它們是抽象類,所以使用子類FileOutputStreamFileInputStream來實(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

  • BufferedOutputStreamBufferedInputStream類的構(gòu)造函數(shù)都需要傳入一個(gè)OutputStreamInputStream類型的對象硫眯,它們是抽象類,所以使用子類FileOutputStreamFileInputStream來實(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的使用

  • BufferedWriterBufferedReader類的構(gòu)造函數(shù)都需要傳入一個(gè)OutputStreamWriterInputStreamReader類型的對象。

  • OutputStreamWriterInputStreamReader類的構(gòu)造函數(shù)都需要傳入一個(gè)OutputStreamInputStream類型的對象归斤。

  • 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压真。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蘑险,隨后出現(xiàn)的幾起案子滴肿,更是在濱河造成了極大的恐慌,老刑警劉巖佃迄,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泼差,死亡現(xiàn)場離奇詭異,居然都是意外死亡呵俏,警方通過查閱死者的電腦和手機(jī)堆缘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來普碎,“玉大人吼肥,你說我怎么就攤上這事÷槌担” “怎么了缀皱?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長动猬。 經(jīng)常有香客問我啤斗,道長,這世上最難降的妖魔是什么枣察? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任争占,我火速辦了婚禮燃逻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臂痕。我一直安慰自己伯襟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布握童。 她就那樣靜靜地躺著姆怪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澡绩。 梳的紋絲不亂的頭發(fā)上稽揭,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音肥卡,去河邊找鬼溪掀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛步鉴,可吹牛的內(nèi)容都是我干的揪胃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼氛琢,長吁一口氣:“原來是場噩夢啊……” “哼喊递!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阳似,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤骚勘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后撮奏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俏讹,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年挽荡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了藐石。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡定拟,死狀恐怖于微,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情青自,我是刑警寧澤株依,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站延窜,受9級特大地震影響恋腕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逆瑞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一荠藤、第九天 我趴在偏房一處隱蔽的房頂上張望伙单。 院中可真熱鬧,春花似錦哈肖、人聲如沸吻育。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽布疼。三九已至,卻和暖如春币狠,著一層夾襖步出監(jiān)牢的瞬間游两,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工漩绵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贱案,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓渐行,卻偏偏與公主長得像轰坊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子祟印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容