Java API —— IO流( FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream )...
生活随笔
收集整理的這篇文章主要介紹了
Java API —— IO流( FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream )...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、IO流概述 ·?IO流用來處理設備之間的數據傳輸? ??? ? ·?上傳文件和下載文件? ??? ? ·?Java對數據的操作是通過流的方式 ·?Java用于操作流的對象都在IO包中 2、IO流分類 1)按照數據流向 輸入流 ? ??讀入數據 輸出流 ? ??寫出數據 2) 按照數據類型 字節流: 字節輸入流 讀取數據 InputStream 字節輸出流 寫出數據 OutputStream 字符流: 字符輸入流 讀取數據 Reader 字符輸出流 寫出數據 Writer? ??? ? 3)什么情況下使用哪種流呢? 如果數據所在的文件通過windows自帶的記事本打開并能讀懂里面的內容,就用字符流。其他用字節流。 如果你什么都不知道,就用字節流 3、IO流常用基類 1) 字節流的抽象基類:? ??? ??? ?? InputStream ,OutputStream。? ??? ? 2) 字符流的抽象基類:? ??? ??? ?? Reader , Writer。 ? ? ? ? 注:由這四個類派生出來的子類名稱都是以其父類名作為子類名的后綴。? ??? ??? ?? 如:InputStream的子類FileInputStream。 如:Reader的子類FileReader。 4、字節流寫數據 ? ? ? 1)OutputStream ? -> ?FileOutputStream ? ? ?? 分析發現其實更適合用字符流,但是由于字節流先出現,所以,我們考慮先使用字節流后面再講會什么出現字符流。? ??? ? 2)?FileOutputStream的構造方法? ??? ??? ?? FileOutputStream(File file) FileOutputStream(String name) 3)字節流寫數據的方式 ·?public void write(int b)? ??? ? ·?public void write(byte[] b)? ??? ? ·?public void write(byte[] b,int off,int len) 例子1: package iodemos;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*** Created by gao on 15-12-27.*/
/*
* 需求:我要往一個文本文件中輸入一句話:"hello,io"
*
* 分析:
* A:這個操作最好是采用字符流來做,但是呢,字符流是在字節流之后才出現的,所以,今天我先講解字節流如何操作。
* B:由于我是要往文件中寫一句話,所以我們要采用字節輸出流。
*
* 通過上面的分析后我們知道要使用:OutputStream
* 但是通過查看API,我們發現該流對象是一個抽象類,不能實例化。
* 所以,我們要找一個具體的子類。
* 而我們要找的子類是什么名字的呢?這個時候,很簡單,我們回想一下,我們是不是要往文件中寫東西。
* 文件是哪個單詞:File
* 然后用的是字節輸出流,聯起來就是:FileOutputStream
* 注意:每種基類的子類都是以父類名作為后綴名。
* XxxOutputStream
* XxxInputStream
* XxxReader
* XxxWriter
* 查看FileOutputStream的構造方法:
* FileOutputStream(File file)
* FileOutputStream(String name)
*
* 字節輸出流操作步驟:
* A:創建字節輸出流對象
* B:寫數據
* C:釋放資源
*/
public class IODemo01 {public static void main(String[] args) throws IOException {// 創建字節輸出流對象// FileOutputStream(File file)
// File file = new File("fos.txt");
// FileOutputStream fos = new FileOutputStream(file);// FileOutputStream(String name)FileOutputStream fos = new FileOutputStream("fos.txt");/** 創建字節輸出流對象了做了幾件事情:* A:調用系統功能去創建文件* B:創建fos對象* C:把fos對象指向這個文件*///寫數據fos.write("hello,IO".getBytes());fos.write("java".getBytes());//釋放資源//關閉此文件輸出流并釋放與此流有關的所有系統資源。
fos.close();/** 為什么一定要close()呢?* A:讓流對象變成垃圾,這樣就可以被垃圾回收器回收了* B:通知系統去釋放跟該文件相關的資源*///java.io.IOException: Stream Closed//fos.write("java".getBytes());
}
}
例子2:
package iodemos; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 字節輸出流操作步驟:* A:創建字節輸出流對象* B:調用write()方法* C:釋放資源** public void write(int b):寫一個字節* public void write(byte[] b):寫一個字節數組* public void write(byte[] b,int off,int len):寫一個字節數組的一部分*/ public class IODemo02 {public static void main(String[] args) throws IOException {// 創建字節輸出流對象// OutputStream os = new FileOutputStream("fos2.txt"); // 多態FileOutputStream fos = new FileOutputStream("fos2.txt");// 調用write()方法//fos.write(97); //97 -- 底層二進制數據 -- 通過記事本打開 -- 找97對應的字符值 -- a// fos.write(57);// fos.write(55);//public void write(byte[] b):寫一個字節數組byte[] bys = {97,98,99,100,101};fos.write(bys);//public void write(byte[] b,int off,int len):寫一個字節數組的一部分fos.write(bys,1,3);//釋放資源 fos.close();} }輸出到文件fos2.txt:
abcdebcd 例子3: package iodemos; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 如何實現數據的換行?* 為什么現在沒有換行呢?因為你值寫了字節數據,并沒有寫入換行符號。* 如何實現呢?寫入換行符號即可。* 有些文本文件打開是可以的,通過windows自帶的那個不行,為什么呢?* 因為不同的系統針對不同的換行符號識別是不一樣的?* windows:\r\n* linux:\n* Mac:\r* 而一些常見的個高級記事本,是可以識別任意換行符號的。** 如何實現數據的追加寫入?* 用構造方法帶第二個參數是true的情況即可*/ public class IODemo03 {public static void main(String[] args) throws IOException {// 創建字節輸出流對象//FileOutputStream fos = new FileOutputStream("fos3.txt");// 創建一個向具有指定 name 的文件中寫入數據的輸出文件流。// 如果第二個參數為 true,則將字節寫入文件末尾處,而不是寫入文件開始處。FileOutputStream fos = new FileOutputStream("fos3.txt",true);// 寫數據for (int x = 0; x < 10; x++) {fos.write(("hello"+x).getBytes());fos.write("\r\n".getBytes());}// 釋放資源 fos.close();} }?
4)加入異常處理的IO流操作? package iodemos; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 加入異常處理的字節輸出流操作*/ public class IODemo04 {public static void main(String[] args) {// 分開做異常處理 // FileOutputStream fos = null; // try { // fos = new FileOutputStream("fos04.txt"); // } catch (FileNotFoundException e) { // e.printStackTrace(); // } // try { // fos.write("java".getBytes()); // } catch (IOException e) { // e.printStackTrace(); // } // try { // fos.close(); // } catch (IOException e) { // e.printStackTrace(); // }// 一起做異常處理 // try { // FileOutputStream fos = new FileOutputStream("fos04.txt"); // fos.write("java".getBytes()); // fos.close(); // }catch (FileNotFoundException e){ // e.printStackTrace(); // }catch (IOException e){ // e.printStackTrace(); // }// 改進版// 為了在finally里面能夠看到該對象就必須定義到外面,為了訪問不出問題,還必須給初始化值FileOutputStream fos = null;try{fos = new FileOutputStream("fos04.txt");fos.write("java".getBytes());}catch (FileNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}finally {// 如果fos不是null,才需要close()if(fos != null){// 為了保證close()一定會執行,就放到這里了try {fos.close();} catch (IOException e) {e.printStackTrace();}}}} }?
5)字節流讀取數據 ·?InputStream FileInputStream ·?FileInputStream的構造方法 FileInputStream(File file) FileInputStream(String name) ·?FileInputStream的成員方法 public int read() public int read(byte[] b) 例子1: package inputstream; import java.io.FileInputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 字節輸入流操作步驟:* A:創建字節輸入流對象* B:調用read()方法讀取數據,并把數據顯示在控制臺* C:釋放資源** 讀取數據的方式:* A:int read():一次讀取一個字節* B:int read(byte[] b):一次讀取一個字節數組*/ public class FileInputStreamDemo01 {public static void main(String[] args) throws IOException {// FileInputStream(String name)FileInputStream fis = new FileInputStream("fis.txt");// 調用read()方法讀取數據,并把數據顯示在控制臺// 用循環改進 // int by = fis.read(); // while (by != -1) { // System.out.print((char) by); // by = fis.read(); // }// 最終版代碼int b = 0;// 讀取,賦值,判斷while ((b = fis.read()) != -1) {System.out.print((char) b);}//釋放資源 fis.close();} }例子2:計算機如何識別兩個字節拼接成一個中文
package iodemos; import java.util.Arrays; /** 計算機是如何識別什么時候該把兩個字節轉換為一個中文呢?* 在計算機中中文的存儲分兩個字節:* 第一個字節肯定是負數。* 第二個字節常見的是負數,可能有正數。但是沒影響。*/ public class IODemo06 {public static void main(String[] args) {//String s = "abcde";//[97, 98, 99, 100, 101]String s = "我愛你中國";//[-50, -46, -80, -82, -60, -29, -42, -48, -71, -6]byte[] bys = s.getBytes();System.out.println(Arrays.toString(bys));} }例子3:一次讀取一個字節數組
? ??read(byte[] b) 和 new String(b,0,len)一起用? package iodemos; import java.io.FileInputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ public class IODemo10 {public static void main(String[] args) throws IOException {// 創建字節輸入流對象FileInputStream fis = new FileInputStream("fis2.txt");// 數組的長度一般是1024或者1024的整數倍byte[] bys = new byte[1024];int len = 0;while ((len = fis.read(bys)) != -1) {System.out.print(new String(bys, 0, len)); //千萬要帶上len的使用 }// 釋放資源 fis.close();} }?
? ? 6)字節流復制數據練習 ? ??? ? ·?把當前項目目錄下的a.txt內容復制到當前項目目錄下的b.txt中 package iodemos; import inputstream.FileInputStreamDemo01; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 復制文本文件。** 數據源:從哪里來* a.txt -- 讀取數據 -- FileInputStream** 目的地:到哪里去* b.txt -- 寫數據 -- FileOutputStream** java.io.FileNotFoundException: a.txt (系統找不到指定的文件。)** 這一次復制中文沒有出現任何問題,為什么呢?* 上一次我們出現問題的原因在于我們每次獲取到一個字節數據,就把該字節數據轉換為了字符數據,然后輸出到控制臺。* 而這一次呢?確實通過IO流讀取數據,寫到文本文件,你讀取一個字節,我就寫入一個字節,你沒有做任何的轉換。* 它會自己做轉換。*/ public class IODemo05 {public static void main(String[] args) throws IOException {// 封裝數據源FileInputStream fis = new FileInputStream("a.txt");// 封裝目的地FileOutputStream fos = new FileOutputStream("b.txt");int by = 0;while ((by = fis.read()) != -1) {fos.write(by);}// 釋放資源(先關誰都行) fis.close();fos.close();} }?
·?把c:\a\a.txt內容復制到c:\b\b.txt中
方式一: package iodemos; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 需求:把c盤下的a.txt的內容復制到c盤下的b.txt中** 數據源:* c:\a\a.txt -- 讀取數據-- FileInputStream* 目的地:* c:\b\b.txt -- 寫出數據 -- FileOutputStream*/ public class IODemo07 {public static void main(String[] args) throws IOException {// 封裝數據源FileInputStream fis = new FileInputStream("c:\\a\\a.txt");// 封裝目的地FileOutputStream fos = new FileOutputStream("c:\\b\\b.txt");// 復制數據int by = 0;while ((by = fis.read()) != -1){fos.write(by);}// 釋放資源 fos.close();fis.close();} }方式二:
package iodemos; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ public class IODemo11 {public static void main(String[] args) throws IOException {// 封裝數據源FileInputStream fis = new FileInputStream("c:\\a\\a.txt");// 封裝目的地FileOutputStream fos = new FileOutputStream("c:\\b\\b.txt");// 復制數據byte[] bys = new byte[1024];int len = 0;while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}// 釋放資源 fos.close();fis.close();} }?
·?把c:\aa.jpg內容復制到當前項目目錄下的mn.jpg中 package iodemos; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 需求:把c:\\aa.jpg內容復制到當前項目目錄下的mn.jpg中** 數據源:* c:\\aa.jpg --讀取數據--FileInputStream* 目的地:* mn.jpg--寫出數據--FileOutputStream*/ public class IODemo08 {public static void main(String[] args) throws IOException {// 封裝數據源FileInputStream fis = new FileInputStream("c:\\aa.jpg");// 封裝目的地FileOutputStream fos = new FileOutputStream("mn.jpg");// 復制數據int by = 0;while ((by = fis.read()) != -1){fos.write(by);}// 釋放資源 fos.close();fis.close();} } ·?把c:\abc.mp4復制到當前項目目錄下的copy.mp4中(效率低) ?方式一: ? package iodemos; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 需求:把c:\\abc.mp4復制到當前項目目錄下的copy.mp4中** 數據源:* c:\\abc.mp4--讀取數據--FileInputStream* 目的地:* copy.mp4--寫出數據--FileOutputStream*/ public class IODemo09 {public static void main(String[] args) throws IOException {// 封裝數據源FileInputStream fis = new FileInputStream("c:\\abc.mp4");// 封裝目的地FileOutputStream fos = new FileOutputStream("copy.mp4");// 復制數據int by = 0;while ((by = fis.read()) != -1) {fos.write(by);}// 釋放資源 fos.close();fis.close();} }方式二:
package iodemos; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ public class IODemo12 {public static void main(String[] args) throws IOException {// 封裝數據源FileInputStream fis = new FileInputStream("c:\\abc.mp4");// 封裝目的地FileOutputStream fos = new FileOutputStream("copy.mp4");// 復制數據byte[] bys = new byte[1024];int len = 0;while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}// 釋放資源 fos.close();fis.close();} }?
5、字節緩沖流
1)字節流一次讀寫一個數組的速度明顯比一次讀寫一個字節的速度快很多,這是加入了數組這樣的緩沖區效果,java本身在設計的時候,也考慮到了這樣的設計思想(裝飾設計模式后面講解),所以提供了字節緩沖區流 2)字節緩沖輸出流:BufferedOutputStream 3)字節緩沖輸入流:BufferedInputStream 例子1: package iodemos; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 通過定義數組的方式確實比以前一次讀取一個字節的方式快很多,所以,看來有一個緩沖區還是非常好的。* 既然是這樣的話,那么,java開始在設計的時候,它也考慮到了這個問題,就專門提供了帶緩沖區的字節類。* 這種類被稱為:緩沖區類(高效類)* 寫數據:BufferedOutputStream* 讀數據:BufferedInputStream** 構造方法可以指定緩沖區的大小,但是我們一般用不上,因為默認緩沖區大小就足夠了。** 為什么不傳遞一個具體的文件或者文件路徑,而是傳遞一個OutputStream對象呢?* 原因很簡單,字節緩沖區流僅僅提供緩沖區,為高效而設計的。但是呢,真正的讀寫操作還得靠基本的流對象實現。*/ public class IODemo13 {public static void main(String[] args) throws IOException {// BufferedOutputStream(OutputStream out) // FileOutputStream fos = new FileOutputStream("bos.txt"); // BufferedOutputStream bos = new BufferedOutputStream(fos);// 簡單寫法BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));// 寫數據bos.write("hello".getBytes());// 釋放資源 bos.close();} }例子2:
package iodemos; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; /*** Created by gao on 15-12-27.*/ /** 注意:雖然我們有兩種方式可以讀取,但是,請注意,這兩種方式針對同一個對象在一個代碼中只能使用一個。*/ public class IODemo14 {public static void main(String[] args) throws IOException {// BufferedInputStream(InputStream in)BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bos.txt"));// 讀取數據 // int by = 0; // while ((by = bis.read()) != -1) { // System.out.print((char) by); // }int len = 0;byte[] bys = new byte[1024];while ((len = bis.read(bys)) != -1) {System.out.print(new String(bys, 0, len));}// 釋放資源 bis.close();} }例子3:四種方式復制mp4
package cn.itcast_06; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** 需求:把e:\\哥有老婆.mp4復制到當前項目目錄下的copy.mp4中* * 字節流四種方式復制文件:* 基本字節流一次讀寫一個字節: 共耗時:117235毫秒* 基本字節流一次讀寫一個字節數組: 共耗時:156毫秒* 高效字節流一次讀寫一個字節: 共耗時:1141毫秒* 高效字節流一次讀寫一個字節數組: 共耗時:47毫秒*/ public class CopyMp4Demo {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();// method1("e:\\哥有老婆.mp4", "copy1.mp4");// method2("e:\\哥有老婆.mp4", "copy2.mp4");// method3("e:\\哥有老婆.mp4", "copy3.mp4");method4("e:\\哥有老婆.mp4", "copy4.mp4");long end = System.currentTimeMillis();System.out.println("共耗時:" + (end - start) + "毫秒");}// 高效字節流一次讀寫一個字節數組:public static void method4(String srcString, String destString)throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString));byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}bos.close();bis.close();}// 高效字節流一次讀寫一個字節:public static void method3(String srcString, String destString)throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcString));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destString));int by = 0;while ((by = bis.read()) != -1) {bos.write(by);}bos.close();bis.close();}// 基本字節流一次讀寫一個字節數組public static void method2(String srcString, String destString)throws IOException {FileInputStream fis = new FileInputStream(srcString);FileOutputStream fos = new FileOutputStream(destString);byte[] bys = new byte[1024];int len = 0;while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}fos.close();fis.close();}// 基本字節流一次讀寫一個字節public static void method1(String srcString, String destString)throws IOException {FileInputStream fis = new FileInputStream(srcString);FileOutputStream fos = new FileOutputStream(destString);int by = 0;while ((by = fis.read()) != -1) {fos.write(by);}fos.close();fis.close();} }?
轉載于:https://www.cnblogs.com/yangyquin/p/5080549.html
總結
以上是生活随笔為你收集整理的Java API —— IO流( FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream )...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uniDBGrid导入数据库(转红鱼儿)
- 下一篇: 性能测试工具集锦(上)