Java中IO流,輸入輸出資料流概述與總結

來源:互聯網
上載者:User

標籤:unicode編碼   list   string   案例   return   modified   ges   緩衝   大小   

總結的很粗糙,以後時間富裕了好好修改一下。

1:Java語言定義了許多類專門負責各種方式的輸入或者輸出,這些類都被放在java.io包中。其中,

所有輸入資料流類都是抽象類別InputStream(位元組輸入資料流),或者抽象類別Reader(字元輸入資料流)的子類;

而所有輸出資料流都是抽象類別OutputStream(位元組輸出資料流)或者Writer(字元輸出資料流)的子類。

【首先需要明白的是:流是幹什麼的???(為了永久性的儲存資料)

  根據資料流向的不同分為輸入資料流和輸出資料流;

  根據處理資料類型的不同分為字元流和位元組流;

】

【然後需要明白的是輸入模式和輸出模式是誰流向誰:

InputStream(位元組輸入資料流)和Reader(字元輸入資料流)通俗的理解都是讀(read)的。

OutputStream(位元組輸出資料流)和Writer(字元輸出資料流)通俗的理解都是寫(writer)的。

】

最後下面搞清楚各種流的類型的該怎麼用,誰包含誰,理清思路。

2:InputStream類是位元組輸入資料流的抽象類別,是所有位元組輸入資料流的父類,InputStream類具有階層如所示;

3:java中的字元是Unicode編碼的,是雙位元組的。InputStream是用來處理位元組的,在處理字元文本時很不方便。Java為字元文本的輸入提供了專門的一套類Reader。Reader類是字元輸入資料流的抽象類別,所有字元輸入資料流的實現都是它的子類。

4:輸出資料流OutputStream類是位元組輸入資料流的抽象類別,此抽象類別表示輸出位元組流的所有類的超類。

5:Writer類是字元輸出資料流的抽象類別,所有字元輸出類的實現都是它的子類。

6:File類是IO包中唯一代表磁碟檔案本身的對象。通過File來建立,刪除,重新命名檔案。File類對象的主要作用就是用來擷取文本本身的一些資訊。如文本的所在的目錄,檔案的長度,讀寫權限等等。(有的需要記憶,比如isFile(),isDirectory(),exits();有的瞭解即可。使用的時候查看API)

詳細如下:File類(File類的概述和構造方法)A:File類的概述  File更應該叫做一個路徑  檔案路徑或者檔案夾路徑  路徑分為絕對路徑和相對路徑    絕對路徑是一個固定的路徑,從盤符開始    相對路徑相對於某個位置,在eclipse下是指當前項目下,在dos下  查看API指的是當前路徑  檔案和目錄路徑名的抽象表示形式B:構造方法  File(String pathname):根據一個路徑得到File對象  File(String parent, String child):根據一個目錄和一個子檔案/目錄得到File對象  File(File parent, String child):根據一個父File對象和一個子檔案/目錄得到File對象 File類(File類的建立功能)  A:建立功能    public boolean createNewFile():建立檔案 如果存在這樣的檔案,就不建立了    public boolean mkdir():建立檔案夾 如果存在這樣的檔案夾,就不建立了    public boolean mkdirs():建立檔案夾,如果父資料夾不存在,會幫你建立出來(使用createNewFile()檔案建立的時候不加.txt或者其他尾碼也是檔案,不是檔案夾;使用mkdir()建立檔案夾的時候,如果起的名字是比如aaa.txt也是檔案夾不是檔案;)注意事項:如果你建立檔案或者檔案夾忘了寫盤符路徑,那麼,預設在項目路徑下。 File類(File類的重新命名和刪除功能)  A:重新命名和刪除功能    public boolean renameTo(File dest):把檔案重新命名為指定的檔案路徑    public boolean delete():刪除檔案或者檔案夾  B:重新命名注意事項    如果路徑名相同,就是改名。    如果路徑名不同,就是改名並剪下。  C:刪除注意事項:    Java中的刪除不走資源回收筒。    要刪除一個檔案夾,請注意該檔案夾內不能包含檔案或者檔案夾 File類(File類的判斷功能)  A:判斷功能    public boolean isDirectory():判斷是否是目錄    public boolean isFile():判斷是否是檔案    public boolean exists():判斷是否存在    public boolean canRead():判斷是否可讀    public boolean canWrite():判斷是否可寫    public boolean isHidden():判斷是否隱藏

 

File類(File類的擷取功能)  A:擷取功能    public String getAbsolutePath():擷取絕對路徑    public String getPath():擷取路徑    public String getName():擷取名稱    public long length():擷取長度。位元組數    public long lastModified():擷取最後一次的修改時間,毫秒值    public String[] list():擷取指定目錄下的所有檔案或者檔案夾的名稱數組    public File[] listFiles():擷取指定目錄下的所有檔案或者檔案夾的File數組 File類(檔案名稱過濾器的概述及使用)  A:檔案名稱過濾器的概述    public String[] list(FilenameFilter filter)    public File[] listFiles(FileFilter filter)
 1 package com.ningmeng; 2  3 import java.io.File; 4  5 public class Test { 6  7     public static void main(String[] args) throws Exception{ 8         // TODO Auto-generated method stub 9         File file=new File("aa.txt");//檔案預設就建立在你建立的項目下面,重新整理即可看到10         System.out.println(file.exists());//判斷檔案是否存在11         file.createNewFile();//建立檔案,不是檔案夾12         System.out.println(file.exists());//再次判斷是否存在13         System.out.println(file.getName());//擷取檔案的名字14         System.out.println(file.getAbsolutePath());//擷取檔案的絕對路徑15         System.out.println(file.getPath());//擷取檔案的相對路徑16         System.out.println(file.getParent());//擷取檔案的父路徑17         System.out.println(file.canRead());//檔案是否可讀18         System.out.println(file.canWrite());//檔案是否可寫19         System.out.println(file.length());//檔案的長度20         System.out.println(file.lastModified());//檔案最後一次修改的時間21         System.out.println(file.isDirectory());//判斷檔案是否是一個目錄22         System.out.println(file.isHidden());//檔案是否隱藏23         System.out.println(file.isFile());//判斷檔案是否存在24     }25 26 }

  public String[] list():擷取指定目錄下的所有檔案或者檔案夾的名稱數組

  public File[] listFiles():擷取指定目錄下的所有檔案或者檔案夾的File數組

list()擷取某個目錄下所有的檔案或者檔案夾:

 1 package com.ningmeng; 2  3 import java.io.File; 4  5 public class FileTest { 6  7     public static void main(String[] args){ 8         File file=new File("D:/");//指定檔案目錄 9         String[] str=file.list();//擷取指定目錄下的所有檔案或者檔案夾的名稱數組10         for(String s : str){//加強for迴圈遍曆輸出11             System.out.println(s);12  }13 14  }15 }
 1 package com.ningmeng; 2  3 import java.io.File; 4  5 public class FileTest { 6  7     public static void main(String[] args){ 8         File file=new File("D:/");//指定檔案路徑 9         File[] f=file.listFiles();//擷取指定目錄下的所有檔案或者檔案夾的File數組10         for(File fi : f){//加強for迴圈遍曆輸出11             System.out.println(fi);12  }13 14  }15 }

案例示範:

擷取某種格式的檔案比如擷取某種尾碼的圖片,並輸出檔案名:

 1 package com.ningmeng; 2  3 import java.io.File; 4  5 public class FileTest { 6  7     public static void main(String[] args){ 8         File file=new File("C:\\Users\\biehongli\\Pictures\\xuniji"); 9         String[] str=file.list();10 11 for(String s : str){12 if(s.endsWith(".jpg") || s.endsWith(".png")){//如果尾碼是這種格式的就輸出13  System.out.println(s);14  }15  }16 17 18  }19 }

下面示範擷取檔案夾下面子目錄裡面的檔案擷取(並沒有完全擷取子目錄的子目錄等等,僅僅擷取了子一級目錄):

 1 package com.ningmeng; 2  3 import java.io.File; 4  5 public class FileTest { 6  7     public static void main(String[] args){ 8         File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll"); 9         10         File[] f=file.listFiles();11 12 for(File fi : f){13 if(fi.isDirectory()){//判斷如果是一個目錄14 String[] s=fi.list();15 for(String str : s){16 if(str.endsWith(".jpg")){17  System.out.println(str);18  }19  }20  }21  }22  }23 }

A:檔案名稱過濾器的概述

    public String[] list(FilenameFilter filter)    public File[] listFiles(FileFilter filter)
 1 package com.ningmeng; 2  3 import java.io.File; 4 import java.io.FilenameFilter; 5  6 public class FileTest { 7  8     public static void main(String[] args){ 9         File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll");10 11 String[] str=file.list(new FilenameFilter() {//過濾器,匿名內部類12 13  @Override14 public boolean accept(File dir, String name) {15 // TODO Auto-generated method stub16 //System.out.println(dir);//擷取檔案的路徑17 //System.out.println(name);//擷取檔案的名字18 File f=new File(dir,name);19 return f.isFile() && f.getName().endsWith(".jpg");20  }21  });22 for(String s : str){23  System.out.println(s);24  }25 26  }27 }

7:下面以一些位元組輸入輸出資料流具體的案例操作(操作的時候認清自己使用的是位元組流還是字元流):

注意:read()方法讀取的是一個位元組,為什麼返回是int,而不是byte位元組輸入資料流可以操作任意類型的檔案,比片音頻等,這些檔案底層都是以二進位形式的儲存的,如果每次讀取都返回byte,有可能在讀到中間的時候遇到111111111;那麼這11111111是byte類型的-1,我們的程式是遇到-1就會停止不讀了,後面的資料就讀不到了,所以在讀取的時候用int類型接收,如果11111111會在其前面補上;24個0湊足4個位元組,那麼byte類型的-1就變成int類型的255了這樣可以保證整個資料讀完,而結束標記的-1就是int類型

FileInputStream的單個位元組讀取:

FileOutputStream的單個位元組寫入:

 1 package com.ningmeng; 2  3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5  6 public class FileTest { 7  8     public static void main(String[] args) throws Exception{ 9         FileInputStream fis=new FileInputStream("aaa.txt");10 FileOutputStream fos=new FileOutputStream("bbb.txt",true);11 //FileOutputStream()後面加true指檔案後面可追加12 13 int a=fis.read();//read()一次讀取一個位元組14 System.out.println(a);//讀取的一個位元組輸出15 16 fos.write(101);//write()一次寫一個位元組17 fis.close();//一定記得關閉流,養成好習慣18  fos.close();19  }20 }

FileInputStream和FileOutputStream進行拷貝文本或者圖片或者歌曲:

 1 package com.ningmeng; 2  3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5  6 public class FileTest { 7  8     public static void main(String[] args) throws Exception{ 9         FileInputStream fis=new FileInputStream("aaa.txt");10 FileOutputStream fos=new FileOutputStream("bbb.txt");11 //如果沒有bbb.txt,會建立出一個12 13 int b;14 while((b=fis.read())!=-1){15  fos.write(b);16  }17  fis.close();18  fos.close();19  }20 }

FileInputStream和FileOutputStream定義小數組進行讀寫操作:

 1 package com.ningmeng; 2  3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5  6 public class FileTest { 7  8     public static void main(String[] args) throws Exception{ 9         FileInputStream fis = new FileInputStream("aaa.txt");10 FileOutputStream fos = new FileOutputStream("bbb.txt");11 int len;12 byte[] arr = new byte[1024 * 8];//自訂位元組數組13 14 while((len = fis.read(arr)) != -1) {15 //fos.write(arr);16 fos.write(arr, 0, len);//寫出位元組數組寫出有效個位元組個數17  }18 //IO流(定義小數組)19 //write(byte[] b)20 //write(byte[] b, int off, int len)寫出有效位元組個數21 22  fis.close();23  fos.close();24  }25 }

 IO流(BufferedInputStream和BufferOutputStream拷貝)

* A:緩衝思想  * 位元組流一次讀寫一個數組的速度明顯比一次讀寫一個位元組的速度快很多,  * 這是加入了數組這樣的緩衝區效果,java本身在設計的時候,  * 也考慮到了這樣的設計思想,所以提供了位元組緩衝區流* B.BufferedInputStream  * BufferedInputStream內建了一個緩衝區(數組)  * 從BufferedInputStream中讀取一個位元組時  * BufferedInputStream會一次性從檔案中讀取8192個, 存在緩衝區中, 返回給程式一個  * 程式再次讀取時, 就不用找檔案了, 直接從緩衝區中擷取  * 直到緩衝區中所有的都被使用過, 才重新從檔案中讀取8192個* C.BufferedOutputStream  * BufferedOutputStream也內建了一個緩衝區(數組)  * 程式向流中寫出位元組時, 不會直接寫到檔案, 先寫到緩衝區中  * 直到緩衝區寫滿, BufferedOutputStream才會把緩衝區中的資料一次性寫到檔案裡
 1 package com.ningmeng; 2  3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7  8 public class FileTest { 9 10 public static void main(String[] args) throws Exception{11 FileInputStream fis = new FileInputStream("aaa.txt");12 FileOutputStream fos = new FileOutputStream("bbb.txt");13 14 BufferedInputStream bis=new BufferedInputStream(fis);15 //使用裝飾模式,把fis裝飾進去bis中。使用緩衝讀取速度變快16 BufferedOutputStream bos=new BufferedOutputStream(fos);17 18 int b;19 while((b=bis.read())!=-1){20  bos.write(b);21  }22  bis.close();23  bos.close();24  }25 }

 面試題:小數組的讀寫和帶Buffered的讀取哪個更快?

  * 定義小數組如果是8192個位元組大小和Buffered比較的話  * 定義小數組會略勝一籌,因為讀和寫操作的是同一個數組  * 而Buffered操作的是兩個數組IO流(flush和close方法的區別) flush()方法: 用來重新整理緩衝區的,重新整理後可以再次寫出(位元組緩衝流內建緩衝區,如果沒有讀取出來,可以使用flush()重新整理來)close()方法:用來關閉流釋放資源的的,如果是帶緩衝區的流對象的close()方法,不但會關閉流,還會再關閉流之前重新整理緩衝區,關閉後不能再寫出8:字元流FileReader和FileWriter字元流是什麼  * 字元流是可以直接讀寫字元的IO流  * 字元流讀取字元, 就要先讀取到位元組資料, 然後轉為字元. 如果要寫出字元, 需要把字元轉為位元組再寫出.    IO流(什麼情況下使用字元流)* 字元流也可以拷貝文字檔, 但不推薦使用. 因為讀取時會把位元組轉為字元, 寫出時還要把字元轉回位元組.* 程式需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字元流* 讀取的時候是按照字元的大小讀取的,不會出現半個中文* 寫出的時候可以直接將字串寫出,不用轉換為位元組數組 IO流(字元流是否可以拷貝非純文字的檔案)* 不可以拷貝非純文字的檔案* 因為在讀的時候會將位元組轉換為字元,在轉換過程中,可能找不到對應的字元,就會用?代替,寫出的時候會將字元轉換成位元組寫出去* 如果是?,直接寫出,這樣寫出之後的檔案就亂了,看不了了
 1 package com.ningmeng; 2  3 import java.io.FileReader; 4 import java.io.FileWriter; 5  6 public class FileTest { 7  8     public static void main(String[] args) throws Exception{ 9         //FileReader類的read()方法可以按照字元大小讀取10         FileReader fr=new FileReader("aaa.txt");11 int b;12 while((b=fr.read())!=-1){13 System.out.println((char)b);//int類型轉為字元型14  }15  fr.close();16 17 //FileWriter類的write()方法可以自動把字元轉為位元組寫出18 FileWriter fw = new FileWriter("aaa.txt",true);19 fw.write("aaa");20  fw.close();21 22 //字元流的拷貝23 FileReader fr2 = new FileReader("aaa.txt");24 FileWriter fw2 = new FileWriter("bbb.txt");25 26 int ch;27 while((ch = fr2.read()) != -1) {28  fw2.write(ch);29  }30 31  fr2.close();32  fw2.close();33  }34 }
 1 package com.ningmeng; 2  3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileReader; 6 import java.io.FileWriter; 7  8 public class FileTest { 9 10 public static void main(String[] args) throws Exception{11 BufferedReader br=new BufferedReader(new FileReader("aaa.txt"));12 BufferedWriter bw=new BufferedWriter(new FileWriter("bbb.txt"));13 //BufferedReader和BufferedWriter的使用:14 int b;15 while((b=br.read())!=-1){16 bw.write((char)b);17  }18  br.close();19  bw.close();20  }21 }

 先寫到這裡吧,內容比較多,以後有時間再總結,也方便自己腦補                                         

Java中IO流,輸入輸出資料流概述與總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.