java IO 字節(jié)流詳解 1. 如何理解輸入輸出流? 這是我當(dāng)初在學(xué)習(xí)Java IO這一塊很難理解的一塊,輸入輸出流我們可必須以一個(gè)為參照物:我們以內(nèi)存為參照物,凡是寫入內(nèi)存的我們叫輸入流,從內(nèi)存中寫出的我們叫輸出流??聪旅娴氖纠龍D 有了這樣的一個(gè)概念對(duì)于我們?cè)賹W(xué)習(xí)Java中的IO流我相信就會(huì)變得特別簡(jiǎn)單了。 2. 再看流的分類 流的分類,Java的流分類比較豐富,剛接觸的人看了后會(huì)感覺(jué)很暈。流分類的方式很多: 1、按照輸入的方向分,輸入流和輸出流,輸入輸出的參照對(duì)象是Java程序。(InputStream OutPutStream) 3. 字節(jié)流: 字節(jié)流主要操作byte類型數(shù)據(jù),以byte數(shù)組為準(zhǔn),主要操作類有InputStream(字節(jié)輸入流)、OutputSteam(字節(jié)輸出流)由于IputStream和OutputStream都是抽象類,所要要用這兩個(gè)類的話,則首先要通過(guò)子類實(shí)例化對(duì)象。下面就是這兩個(gè)類的一些子類結(jié)構(gòu)圖 1) 字節(jié)輸出流:OutputStream OutputStream是一個(gè)抽象類,要想使用它,必須通過(guò)子類來(lái)實(shí)例化它。 OutputStream類的常用方法
實(shí)例1:Helloworld從HelloWorld開始 功能:(向一個(gè)名為”hello.txt”的文本文件中寫一個(gè)“HelloWorld”) public static void main(String[] args) throws Exception { // 創(chuàng)建一個(gè)以當(dāng)前工程目錄下的名為“helloworld.txt”的文本文件 File file = new File('hellowolrd.txt'); OutputStream outputStream = null; // 通過(guò)FileOutPutStream的子類實(shí)例化OutputStream對(duì)象 outputStream = new FileOutputStream(file); // 聲明一個(gè)字符串 String str = 'hello,world'; // 將字符串轉(zhuǎn)換成字節(jié)數(shù)組 byte[] b = str.getBytes(); // 寫入數(shù)據(jù) outputStream.write(b); // 關(guān)閉輸出流 outputStream.close(); outputStream.flush(); } 我們可以看到當(dāng)前工程目錄下已經(jīng)有一個(gè)helloworld.txt且里面已經(jīng)有數(shù)據(jù),如果我們把str的值改變的話,文本文件里的數(shù)據(jù)也會(huì)改變,所以我們想是不是可以不刪除原來(lái)的數(shù)據(jù),在追尾上追加上。 我們只要在構(gòu)造FileOutputStream對(duì)象的時(shí)候選擇另一種構(gòu)造方法就可以了 FileOutputStream(File file,boolean append) 第二個(gè)參數(shù)就是是否采用追加的方式寫入到文本文件中 把上面的代碼修改下就可以了 outputStream = new FileOutputStream(file,true); 再?gòu)睦?我們理解我們對(duì)輸入輸出流的理解,在這個(gè)例子里,我們聲明的字符串肯定是在內(nèi)存中的,現(xiàn)在我們要從內(nèi)存中把數(shù)據(jù)寫到文本中,所以我們用到輸出流。這也正符合了我對(duì)輸入輸出流的理解,當(dāng)然大家肯定還有其他的理解方式。 2) 字節(jié)輸入流:InputStream InputStream類的常用方法
與OutputStream類一樣,InputStream本身也是一個(gè)抽象類,要想使用它,也必須依靠其子類。 實(shí)例2:還是HelloWorld 在上一個(gè)例子的基礎(chǔ)上我們從文本中讀取數(shù)據(jù)并且把它顯示在控制臺(tái)上 public static void main(String[] args) throws Exception { // 創(chuàng)建一個(gè)以當(dāng)前工程目錄下的名為“helloworld.txt”的文本文件 // 這個(gè)文件在上一個(gè)例子里已經(jīng)創(chuàng)建,并且里面已有數(shù)據(jù) File file = new File('hellowolrd.txt'); // 聲明InputStream對(duì)象 InputStream inputStream = null; // 通過(guò)FileInputStream子類實(shí)例化InputStream對(duì)象 inputStream = new FileInputStream(file); // 聲明一個(gè)字節(jié)數(shù)組用以接收讀入的數(shù)據(jù) byte[] b = new byte[1024]; // 開始讀入數(shù)據(jù),將數(shù)據(jù)內(nèi)容讀到此數(shù)組中 inputStream.read(b); // 關(guān)閉輸入流 inputStream.close(); // 在控制臺(tái)打印 System.out.println(new String(b)); } 如果以這種方式打印,我們可以看到雖然控制臺(tái)里是打印出了文本文件中的內(nèi)容,但是后面跟了很多空格,這是我們不需要的,對(duì)于這種情況我們有兩種解決方式 方式一:聲明字節(jié)數(shù)組的時(shí)候指定字節(jié)數(shù)組的長(zhǎng)度為文本內(nèi)容的長(zhǎng)度 byte[] b=new byte[(int)file.length()]; 方式二:在將字節(jié)數(shù)組轉(zhuǎn)換成字符串的調(diào)用String(byte b,int off,int len)這個(gè)構(gòu)造函數(shù) System.out.println(new String(b,0,(int)file.length())); 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持! |
|