【Java中级】(三)IO
生活随笔
收集整理的這篇文章主要介紹了
【Java中级】(三)IO
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 流分為字節(jié)流和字符流2. 字節(jié)流下面常用的又有數(shù)據(jù)流和對(duì)象流3. 字符流下面常用的又有緩存流
文件對(duì)象文件和文件夾都用File表示//file path : 文件的絕對(duì)路徑或相對(duì)路徑File file=new File("file path");注:文件路徑可能不存在File的常用方法自行查閱API流什么是流(Stream),流就是一系列的數(shù)據(jù)當(dāng)不同的介質(zhì)之間有數(shù)據(jù)交互的時(shí)候,JAVA就使用流來實(shí)現(xiàn)。數(shù)據(jù)源可以是文件,還可以是數(shù)據(jù)庫(kù),網(wǎng)絡(luò)甚至是其他的程序比如讀取文件的數(shù)據(jù)到程序中,站在程序的角度來看,就叫做輸入流輸入流: InputStream輸出流:OutputStream3.1、字節(jié)流,關(guān)閉流的方式以字節(jié)的形式讀取和寫入數(shù)據(jù)所有的數(shù)據(jù)存放在計(jì)算機(jī)中都是以數(shù)字的形式存放的。 所以字母就需要轉(zhuǎn)換為數(shù)字才能夠存放。比如A就對(duì)應(yīng)的數(shù)字65,a對(duì)應(yīng)的數(shù)字97. 不同的字母和符號(hào)對(duì)應(yīng)不同的數(shù)字,就是一張碼表。ASCII是這樣的一種碼表。 字包含簡(jiǎn)單的英文字母,符號(hào),數(shù)字等等。 不包含中文,德文,俄語等復(fù)雜的。
3.1.1、輸入字節(jié)流InputStream是字節(jié)輸入流,同時(shí)也是抽象類,只提供方法的生命,不提供方法的實(shí)現(xiàn)。FileInputStream是InputStream的子類以FIleInputStream為例進(jìn)行文件讀取:package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {try {//準(zhǔn)備文件lol.txt其中的內(nèi)容是AB,對(duì)應(yīng)的ASCII分別是65 66File f =new File("d:/lol.txt");//創(chuàng)建基于文件的輸入流FileInputStream fis =new FileInputStream(f);//創(chuàng)建字節(jié)數(shù)組,其長(zhǎng)度就是文件的長(zhǎng)度byte[] all =new byte[(int) f.length()];//以字節(jié)流的形式讀取文件所有內(nèi)容fis.read(all);for (byte b : all) {//打印出來是65 66System.out.println(b);}//每次使用完流,都應(yīng)該進(jìn)行關(guān)閉fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.1.2、輸出字節(jié)流OutputStream是字節(jié)輸出流,同時(shí)也是抽象類,只提供方法聲明,不提供方法的具體實(shí)現(xiàn)。FileOutputStream 是OutputStream子類,以FileOutputStream 為例向文件寫出數(shù)據(jù)注: 如果文件d:/lol2.txt不存在,寫出操作會(huì)自動(dòng)創(chuàng)建該文件。但是如果是文件 d:/xyz/lol2.txt,而目錄xyz又不存在,會(huì)拋出異常package stream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {try {// 準(zhǔn)備文件lol2.txt其中的內(nèi)容是空的File f = new File("d:/lol2.txt");// 準(zhǔn)備長(zhǎng)度是2的字節(jié)數(shù)組,用88,89初始化,其對(duì)應(yīng)的字符分別是X,Ybyte data[] = { 88, 89 };// 創(chuàng)建基于文件的輸出流FileOutputStream fos = new FileOutputStream(f);// 把數(shù)據(jù)寫入到輸出流fos.write(data);// 關(guān)閉輸出流fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.1.3、在try中關(guān)閉在try的作用域里關(guān)閉文件輸入流,在前面的示例中都是使用這種方式,這樣做有一個(gè)弊端;如果文件不存在,或者讀取的時(shí)候出現(xiàn)問題而拋出異常,那么就不會(huì)執(zhí)行這一行關(guān)閉流的代碼,存在巨大的資源占用隱患。 不推薦使用package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {try {File f = new File("d:/lol.txt");FileInputStream fis = new FileInputStream(f);byte[] all = new byte[(int) f.length()];fis.read(all);for (byte b : all) {System.out.println(b);}// 在try 里關(guān)閉流fis.close();} catch (IOException e) {e.printStackTrace();}}}3.1.4、在finally中關(guān)閉這是標(biāo)準(zhǔn)的關(guān)閉流的方式1. 首先把流的引用聲明在try的外面,如果聲明在try里面,其作用域無法抵達(dá)finally.2. 在finally關(guān)閉之前,要先判斷該引用是否為空3. 關(guān)閉的時(shí)候,需要再一次進(jìn)行try catch處理這是標(biāo)準(zhǔn)的嚴(yán)謹(jǐn)?shù)年P(guān)閉流的方式,但是看上去很繁瑣,所以寫不重要的或者測(cè)試代碼的時(shí)候,都會(huì)采用上面的有隱患try的方式,因?yàn)椴宦闊﹡package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {File f = new File("d:/lol.txt");FileInputStream fis = null;try {fis = new FileInputStream(f);byte[] all = new byte[(int) f.length()];fis.read(all);for (byte b : all) {System.out.println(b);}} catch (IOException e) {e.printStackTrace();} finally {// 在finally 里關(guān)閉流if (null != fis)try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}3.1.5、使用try()的方式把流定義在try()里,try,catch或者finally結(jié)束的時(shí)候,會(huì)自動(dòng)關(guān)閉這種編寫代碼的方式叫做 try-with-resources, 這是從JDK7開始支持的技術(shù)所有的流,都實(shí)現(xiàn)了一個(gè)接口叫做 AutoCloseable,任何類實(shí)現(xiàn)了這個(gè)接口,都可以在try()中進(jìn)行實(shí)例化。 并且在try, catch, finally結(jié)束的時(shí)候自動(dòng)關(guān)閉,回收相關(guān)資源。package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {File f = new File("d:/lol.txt");//把流定義在try()里,try,catch或者finally結(jié)束的時(shí)候,會(huì)自動(dòng)關(guān)閉try (FileInputStream fis = new FileInputStream(f)) {byte[] all = new byte[(int) f.length()];fis.read(all);for (byte b : all) {System.out.println(b);}} catch (IOException e) {e.printStackTrace();}}}綜合實(shí)例
3.2、字符流,中文編碼問題Reader是字符輸入流Writer是字符輸出流專門用于字符形式讀取和寫入數(shù)據(jù)3.2.1、使用字符流讀取文件FileReader是Reader子類,以FileReader為例進(jìn)行文件讀取package stream;import java.io.File;import java.io.FileReader;import java.io.IOException;public class TestStream {public static void main(String[] args) {// 準(zhǔn)備文件lol.txt其中的內(nèi)容是ABFile f = new File("d:/lol.txt");// 創(chuàng)建基于文件的Readertry (FileReader fr = new FileReader(f)) {// 創(chuàng)建字符數(shù)組,其長(zhǎng)度就是文件的長(zhǎng)度char[] all = new char[(int) f.length()];// 以字符流的形式讀取文件所有內(nèi)容fr.read(all);for (char b : all) {// 打印出來是A BSystem.out.println(b);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.2.2、使用字符流把字符串寫到文件FileWriter是Writer的子類,以FileWriter為例把字符串寫到文件package stream;import java.io.File;import java.io.FileWriter;import java.io.IOException;public class TestStream {public static void main(String[] args) {// 準(zhǔn)備文件lol2.txtFile f = new File("d:/lol2.txt");// 創(chuàng)建基于文件的Writertry (FileWriter fr = new FileWriter(f)) {// 以字符流的形式把數(shù)據(jù)寫入到文件中String data="abcdefg1234567890";char[] cs = data.toCharArray();fr.write(cs);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.2.3、常見編碼工作后經(jīng)常接觸的編碼方式有如下幾種:ISO-8859-1 ASCII 數(shù)字和西歐字母GBK GB2312 BIG5 中文UNICODE (統(tǒng)一碼,萬國(guó)碼)
其中ISO-8859-1 包含 ASCIIGB2312 是簡(jiǎn)體中文,BIG5是繁體中文,GBK同時(shí)包含簡(jiǎn)體和繁體以及日文。UNICODE 包括了所有的文字,無論中文,英文,藏文,法文,世界所有的文字都包含其中3.2.4、UNICODE和UTFUNICODE因?yàn)橐娣潘械臄?shù)據(jù),所以完全按照UNICODE的方式來存儲(chǔ)數(shù)據(jù),就會(huì)有很大的浪費(fèi)在這種情況下,就出現(xiàn)了UNICODE的各種減肥子編碼,比如UTF-8對(duì)數(shù)字和字符就使用一個(gè)字節(jié),而對(duì)漢字就使用3個(gè)字節(jié),從而達(dá)到了減肥還能保證健康的效果
3.2.5、Java采用的Unicode寫在.java源代碼中的漢字,在執(zhí)行之后,都會(huì)變成JVM中的字符。而這些中文字符采用的編碼方式,都是使用UNICODE.3.3、緩存流以介質(zhì)是硬盤為例,字節(jié)流和字符流的弊端:在每一次讀寫的時(shí)候,都會(huì)訪問硬盤。 如果讀寫的頻率比較高的時(shí)候,其性能表現(xiàn)不佳。
為了解決以上弊端,采用緩存流。緩存流在讀取的時(shí)候,會(huì)一次性讀較多的數(shù)據(jù)到緩存中,以后每一次的讀取,都是在緩存中訪問,直到緩存中的數(shù)據(jù)讀取完畢,再到硬盤中區(qū)讀取。
就好比吃飯,不用緩存就是每吃一口都到鍋里去鏟。用緩存就是先把飯盛到碗里,碗里的吃完了,再到鍋里去鏟
緩存流在寫入數(shù)據(jù)的時(shí)候,會(huì)先把數(shù)據(jù)寫入到緩存區(qū),直到緩存區(qū)達(dá)到一定的量,才把這些數(shù)據(jù),一起寫入到硬盤中去。按照這種操作模式,就不會(huì)像字節(jié)流,字符流那樣每寫一個(gè)字節(jié)都訪問硬盤,從而減少了IO操作3.3.1、使用緩存流讀取數(shù)據(jù)緩存字符輸入流 BufferedReader 可以一次讀取一行數(shù)據(jù)package stream;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;public class TestStream {public static void main(String[] args) {// 準(zhǔn)備文件lol.txt其中的內(nèi)容是// garen kill teemo// teemo revive after 1 minutes// teemo try to garen, but killed againFile f = new File("d:/lol.txt");// 創(chuàng)建文件字符流// 緩存流必須建立在一個(gè)存在的流的基礎(chǔ)上try (FileReader fr = new FileReader(f);BufferedReader br = new BufferedReader(fr);){while (true) {// 一次讀一行String line = br.readLine();if (null == line)break;System.out.println(line);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.3.2、使用緩存流寫出數(shù)據(jù)PrintWriter 緩存字符輸出流, 可以一次寫出一行數(shù)據(jù)package stream;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class TestStream {public static void main(String[] args) {// 向文件lol2.txt中寫入三行語句File f = new File("d:/lol2.txt");try (// 創(chuàng)建文件字符流FileWriter fw = new FileWriter(f);// 緩存流必須建立在一個(gè)存在的流的基礎(chǔ)上 PrintWriter pw = new PrintWriter(fw); ) {pw.println("garen kill teemo");pw.println("teemo revive after 1 minutes");pw.println("teemo try to garen, but killed again");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.3.3、flush有的時(shí)候,需要立即把數(shù)據(jù)寫入到硬盤,而不是等緩存滿了才寫出去。 這時(shí)候就需要用到flushpackage stream;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class TestStream {public static void main(String[] args) {//向文件lol2.txt中寫入三行語句File f =new File("d:/lol2.txt");//創(chuàng)建文件字符流//緩存流必須建立在一個(gè)存在的流的基礎(chǔ)上try(FileWriter fr = new FileWriter(f);PrintWriter pw = new PrintWriter(fr);) {pw.println("garen kill teemo");//強(qiáng)制把緩存中的數(shù)據(jù)寫入硬盤,無論緩存是否已滿pw.flush(); pw.println("teemo revive after 1 minutes");pw.flush();pw.println("teemo try to garen, but killed again");pw.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
文件對(duì)象文件和文件夾都用File表示//file path : 文件的絕對(duì)路徑或相對(duì)路徑File file=new File("file path");注:文件路徑可能不存在File的常用方法自行查閱API流什么是流(Stream),流就是一系列的數(shù)據(jù)當(dāng)不同的介質(zhì)之間有數(shù)據(jù)交互的時(shí)候,JAVA就使用流來實(shí)現(xiàn)。數(shù)據(jù)源可以是文件,還可以是數(shù)據(jù)庫(kù),網(wǎng)絡(luò)甚至是其他的程序比如讀取文件的數(shù)據(jù)到程序中,站在程序的角度來看,就叫做輸入流輸入流: InputStream輸出流:OutputStream3.1、字節(jié)流,關(guān)閉流的方式以字節(jié)的形式讀取和寫入數(shù)據(jù)所有的數(shù)據(jù)存放在計(jì)算機(jī)中都是以數(shù)字的形式存放的。 所以字母就需要轉(zhuǎn)換為數(shù)字才能夠存放。比如A就對(duì)應(yīng)的數(shù)字65,a對(duì)應(yīng)的數(shù)字97. 不同的字母和符號(hào)對(duì)應(yīng)不同的數(shù)字,就是一張碼表。ASCII是這樣的一種碼表。 字包含簡(jiǎn)單的英文字母,符號(hào),數(shù)字等等。 不包含中文,德文,俄語等復(fù)雜的。
3.1.1、輸入字節(jié)流InputStream是字節(jié)輸入流,同時(shí)也是抽象類,只提供方法的生命,不提供方法的實(shí)現(xiàn)。FileInputStream是InputStream的子類以FIleInputStream為例進(jìn)行文件讀取:package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {try {//準(zhǔn)備文件lol.txt其中的內(nèi)容是AB,對(duì)應(yīng)的ASCII分別是65 66File f =new File("d:/lol.txt");//創(chuàng)建基于文件的輸入流FileInputStream fis =new FileInputStream(f);//創(chuàng)建字節(jié)數(shù)組,其長(zhǎng)度就是文件的長(zhǎng)度byte[] all =new byte[(int) f.length()];//以字節(jié)流的形式讀取文件所有內(nèi)容fis.read(all);for (byte b : all) {//打印出來是65 66System.out.println(b);}//每次使用完流,都應(yīng)該進(jìn)行關(guān)閉fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.1.2、輸出字節(jié)流OutputStream是字節(jié)輸出流,同時(shí)也是抽象類,只提供方法聲明,不提供方法的具體實(shí)現(xiàn)。FileOutputStream 是OutputStream子類,以FileOutputStream 為例向文件寫出數(shù)據(jù)注: 如果文件d:/lol2.txt不存在,寫出操作會(huì)自動(dòng)創(chuàng)建該文件。但是如果是文件 d:/xyz/lol2.txt,而目錄xyz又不存在,會(huì)拋出異常package stream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {try {// 準(zhǔn)備文件lol2.txt其中的內(nèi)容是空的File f = new File("d:/lol2.txt");// 準(zhǔn)備長(zhǎng)度是2的字節(jié)數(shù)組,用88,89初始化,其對(duì)應(yīng)的字符分別是X,Ybyte data[] = { 88, 89 };// 創(chuàng)建基于文件的輸出流FileOutputStream fos = new FileOutputStream(f);// 把數(shù)據(jù)寫入到輸出流fos.write(data);// 關(guān)閉輸出流fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.1.3、在try中關(guān)閉在try的作用域里關(guān)閉文件輸入流,在前面的示例中都是使用這種方式,這樣做有一個(gè)弊端;如果文件不存在,或者讀取的時(shí)候出現(xiàn)問題而拋出異常,那么就不會(huì)執(zhí)行這一行關(guān)閉流的代碼,存在巨大的資源占用隱患。 不推薦使用package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {try {File f = new File("d:/lol.txt");FileInputStream fis = new FileInputStream(f);byte[] all = new byte[(int) f.length()];fis.read(all);for (byte b : all) {System.out.println(b);}// 在try 里關(guān)閉流fis.close();} catch (IOException e) {e.printStackTrace();}}}3.1.4、在finally中關(guān)閉這是標(biāo)準(zhǔn)的關(guān)閉流的方式1. 首先把流的引用聲明在try的外面,如果聲明在try里面,其作用域無法抵達(dá)finally.2. 在finally關(guān)閉之前,要先判斷該引用是否為空3. 關(guān)閉的時(shí)候,需要再一次進(jìn)行try catch處理這是標(biāo)準(zhǔn)的嚴(yán)謹(jǐn)?shù)年P(guān)閉流的方式,但是看上去很繁瑣,所以寫不重要的或者測(cè)試代碼的時(shí)候,都會(huì)采用上面的有隱患try的方式,因?yàn)椴宦闊﹡package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {File f = new File("d:/lol.txt");FileInputStream fis = null;try {fis = new FileInputStream(f);byte[] all = new byte[(int) f.length()];fis.read(all);for (byte b : all) {System.out.println(b);}} catch (IOException e) {e.printStackTrace();} finally {// 在finally 里關(guān)閉流if (null != fis)try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}3.1.5、使用try()的方式把流定義在try()里,try,catch或者finally結(jié)束的時(shí)候,會(huì)自動(dòng)關(guān)閉這種編寫代碼的方式叫做 try-with-resources, 這是從JDK7開始支持的技術(shù)所有的流,都實(shí)現(xiàn)了一個(gè)接口叫做 AutoCloseable,任何類實(shí)現(xiàn)了這個(gè)接口,都可以在try()中進(jìn)行實(shí)例化。 并且在try, catch, finally結(jié)束的時(shí)候自動(dòng)關(guān)閉,回收相關(guān)資源。package stream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestStream {public static void main(String[] args) {File f = new File("d:/lol.txt");//把流定義在try()里,try,catch或者finally結(jié)束的時(shí)候,會(huì)自動(dòng)關(guān)閉try (FileInputStream fis = new FileInputStream(f)) {byte[] all = new byte[(int) f.length()];fis.read(all);for (byte b : all) {System.out.println(b);}} catch (IOException e) {e.printStackTrace();}}}綜合實(shí)例
3.2、字符流,中文編碼問題Reader是字符輸入流Writer是字符輸出流專門用于字符形式讀取和寫入數(shù)據(jù)3.2.1、使用字符流讀取文件FileReader是Reader子類,以FileReader為例進(jìn)行文件讀取package stream;import java.io.File;import java.io.FileReader;import java.io.IOException;public class TestStream {public static void main(String[] args) {// 準(zhǔn)備文件lol.txt其中的內(nèi)容是ABFile f = new File("d:/lol.txt");// 創(chuàng)建基于文件的Readertry (FileReader fr = new FileReader(f)) {// 創(chuàng)建字符數(shù)組,其長(zhǎng)度就是文件的長(zhǎng)度char[] all = new char[(int) f.length()];// 以字符流的形式讀取文件所有內(nèi)容fr.read(all);for (char b : all) {// 打印出來是A BSystem.out.println(b);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.2.2、使用字符流把字符串寫到文件FileWriter是Writer的子類,以FileWriter為例把字符串寫到文件package stream;import java.io.File;import java.io.FileWriter;import java.io.IOException;public class TestStream {public static void main(String[] args) {// 準(zhǔn)備文件lol2.txtFile f = new File("d:/lol2.txt");// 創(chuàng)建基于文件的Writertry (FileWriter fr = new FileWriter(f)) {// 以字符流的形式把數(shù)據(jù)寫入到文件中String data="abcdefg1234567890";char[] cs = data.toCharArray();fr.write(cs);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.2.3、常見編碼工作后經(jīng)常接觸的編碼方式有如下幾種:ISO-8859-1 ASCII 數(shù)字和西歐字母GBK GB2312 BIG5 中文UNICODE (統(tǒng)一碼,萬國(guó)碼)
其中ISO-8859-1 包含 ASCIIGB2312 是簡(jiǎn)體中文,BIG5是繁體中文,GBK同時(shí)包含簡(jiǎn)體和繁體以及日文。UNICODE 包括了所有的文字,無論中文,英文,藏文,法文,世界所有的文字都包含其中3.2.4、UNICODE和UTFUNICODE因?yàn)橐娣潘械臄?shù)據(jù),所以完全按照UNICODE的方式來存儲(chǔ)數(shù)據(jù),就會(huì)有很大的浪費(fèi)在這種情況下,就出現(xiàn)了UNICODE的各種減肥子編碼,比如UTF-8對(duì)數(shù)字和字符就使用一個(gè)字節(jié),而對(duì)漢字就使用3個(gè)字節(jié),從而達(dá)到了減肥還能保證健康的效果
3.2.5、Java采用的Unicode寫在.java源代碼中的漢字,在執(zhí)行之后,都會(huì)變成JVM中的字符。而這些中文字符采用的編碼方式,都是使用UNICODE.3.3、緩存流以介質(zhì)是硬盤為例,字節(jié)流和字符流的弊端:在每一次讀寫的時(shí)候,都會(huì)訪問硬盤。 如果讀寫的頻率比較高的時(shí)候,其性能表現(xiàn)不佳。
為了解決以上弊端,采用緩存流。緩存流在讀取的時(shí)候,會(huì)一次性讀較多的數(shù)據(jù)到緩存中,以后每一次的讀取,都是在緩存中訪問,直到緩存中的數(shù)據(jù)讀取完畢,再到硬盤中區(qū)讀取。
就好比吃飯,不用緩存就是每吃一口都到鍋里去鏟。用緩存就是先把飯盛到碗里,碗里的吃完了,再到鍋里去鏟
緩存流在寫入數(shù)據(jù)的時(shí)候,會(huì)先把數(shù)據(jù)寫入到緩存區(qū),直到緩存區(qū)達(dá)到一定的量,才把這些數(shù)據(jù),一起寫入到硬盤中去。按照這種操作模式,就不會(huì)像字節(jié)流,字符流那樣每寫一個(gè)字節(jié)都訪問硬盤,從而減少了IO操作3.3.1、使用緩存流讀取數(shù)據(jù)緩存字符輸入流 BufferedReader 可以一次讀取一行數(shù)據(jù)package stream;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;public class TestStream {public static void main(String[] args) {// 準(zhǔn)備文件lol.txt其中的內(nèi)容是// garen kill teemo// teemo revive after 1 minutes// teemo try to garen, but killed againFile f = new File("d:/lol.txt");// 創(chuàng)建文件字符流// 緩存流必須建立在一個(gè)存在的流的基礎(chǔ)上try (FileReader fr = new FileReader(f);BufferedReader br = new BufferedReader(fr);){while (true) {// 一次讀一行String line = br.readLine();if (null == line)break;System.out.println(line);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.3.2、使用緩存流寫出數(shù)據(jù)PrintWriter 緩存字符輸出流, 可以一次寫出一行數(shù)據(jù)package stream;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class TestStream {public static void main(String[] args) {// 向文件lol2.txt中寫入三行語句File f = new File("d:/lol2.txt");try (// 創(chuàng)建文件字符流FileWriter fw = new FileWriter(f);// 緩存流必須建立在一個(gè)存在的流的基礎(chǔ)上 PrintWriter pw = new PrintWriter(fw); ) {pw.println("garen kill teemo");pw.println("teemo revive after 1 minutes");pw.println("teemo try to garen, but killed again");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}3.3.3、flush有的時(shí)候,需要立即把數(shù)據(jù)寫入到硬盤,而不是等緩存滿了才寫出去。 這時(shí)候就需要用到flushpackage stream;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class TestStream {public static void main(String[] args) {//向文件lol2.txt中寫入三行語句File f =new File("d:/lol2.txt");//創(chuàng)建文件字符流//緩存流必須建立在一個(gè)存在的流的基礎(chǔ)上try(FileWriter fr = new FileWriter(f);PrintWriter pw = new PrintWriter(fr);) {pw.println("garen kill teemo");//強(qiáng)制把緩存中的數(shù)據(jù)寫入硬盤,無論緩存是否已滿pw.flush(); pw.println("teemo revive after 1 minutes");pw.flush();pw.println("teemo try to garen, but killed again");pw.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
轉(zhuǎn)載于:https://www.cnblogs.com/haxianhe/p/9271009.html
總結(jié)
以上是生活随笔為你收集整理的【Java中级】(三)IO的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS_arguments
- 下一篇: Java 403 forbidden错误