Java InputStream的多種使用詳解
阿新 • • 發佈:2020-01-07
以前寫東西,尤其是網路傳輸方面總會碰到將某種格式的文字或者圖片等轉幻成資料流的方式來傳輸,那時候用的就直接網上找點就貼上,也沒什麼搞懂到底是怎麼個機理。後來抽點空就死啃了點這方面的文章,稍微懂了點,特意分享一下。
InputStream FileInputStream BufferInputStream InputStreamreader ByteArrayInputStream這些東西到底什麼關係呢?
一、首先我先理解InputStream是老大,剩下的這些都是為其服務的,先建立一個標準,而FileInputStream是其子類。他可以對檔案進行資料流的轉換。
String fileName = "E:\\電影\\[高清電影]"; InputStream inputstream = new FileInputStream("fileName");//然後對InputStream 進行讀操作,為啥是讀呢?可以把記憶體當作主體,這是某個網友說的,你從硬碟往記憶體裡Input 東西就是讀取資料咯。 另外這裡因為FileInputStream繼承InputStream 類//所以可以這樣用 byte[] by = new byte[8192];//此數字不唯一哦; int len ; while( (len=inputStream.read(by))!=-1 ){ //len就是得出的位元組流了。 } inputStream.close();//最後別忘記關閉,當然應該還有個if判斷是否為空和try catch 的語句。 File f = new File("F:\\……"); if (!f.exists()) { System.out.println("creat " + f.toString()); f.createNewFile(); } FileOutputStream fos = new FileOutputStream(f);//InputStream和OutputStream 一般辯證的來看,一個讀,一個寫,兩者差不多的用法。 fos.write(b,len); fos.flush(); fos.close();
二、在接下來說BufferInputStream,他是資料流快取的東西,不帶緩衝的操作,每讀一個位元組就要寫入一個位元組,由於涉及磁碟的IO操作相比記憶體的操作要慢很多,所以不帶緩衝的流效率很低。帶緩衝的流,可以一次讀很多位元組,但不向磁碟中寫入,只是先放到記憶體裡。等湊夠了緩衝區大小的時候一次性寫入磁碟,這種方式可以減少磁碟操作次數,速度就會提高很多!這就是兩者的區別。
public class InputStreamTest { private static final String FILENAME="E:\\電影\\[高清電影]阿甘正傳.1994.美國.中文字幕.1280x720.rmvb"; public static void main(String[] args) throws IOException { long l1 = readByBufferedInputStream(); long l2 = readByInputStream(); System.out.println("通過BufferedInputStream讀取用時:"+l1+";通過InputStream讀取用時:"+l2); } public static long readByInputStream() throws IOException { InputStream in=new FileInputStream(FILENAME); byte[] b=new byte[8192]; int l=0; long start=System.currentTimeMillis(); while(in.read(b,8192)!=-1){ } long end=System.currentTimeMillis(); return end-start; } public static long readByBufferedInputStream() throws IOException { BufferedInputStream in=new BufferedInputStream(new FileInputStream(FILENAME)); byte[] b=new byte[8192]; int l=0; long start=System.currentTimeMillis(); while(in.read(b,8192)!=-1){ } long end=System.currentTimeMillis(); return end-start; } }
三、InputStreamreader其實就是將位元組流轉成字元流。
import java.io.*; class InputStreamReaderDemo { public static void transReadNoBuf() throws IOException { /** * 沒有緩衝區,只能使用read()方法。 */ //讀取位元組流 //InputStream in = System.in;//讀取鍵盤的輸入。 InputStream in = new FileInputStream("D:\\demo.txt");//讀取檔案的資料。 //將位元組流向字元流的轉換。要啟用從位元組到字元的有效轉換, //可以提前從底層流讀取更多的位元組. InputStreamReader isr = new InputStreamReader(in);//讀取 //綜合到一句。 //InputStreamReader isr = new InputStreamReader( //new FileInputStream("D:\\demo.txt")); char []cha = new char[1024]; int len = isr.read(cha); System.out.println(new String(cha,len)); isr.close(); } public static void transReadByBuf() throws IOException { /** * 使用緩衝區 可以使用緩衝區物件的 read() 和 readLine()方法。 */ //讀取位元組流 //InputStream in = System.in;//讀取鍵盤上的資料 InputStream in = new FileInputStream("D:\\demo.txt");//讀取檔案上的資料。 //將位元組流向字元流的轉換。 InputStreamReader isr = new InputStreamReader(in);//讀取 //建立字元流緩衝區 BufferedReader bufr = new BufferedReader(isr);//從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的 //高效讀取。 可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值足夠大。類似於BufferInputStream //只是兩者緩衝的物件不一樣。 //BufferedReader bufr = new BufferedReader( //new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以綜合到一句。 /*int ch =0; ch = bufr.read(); System.out.println((char)ch); */ String line; while((line = bufr.readLine())!=null){ System.out.println(line); } isr.close(); } }
四、最後一個ByteArrayInputStream 這個其實用的的不多,但是ByteArrayOutputStream還是用的多點,所以拿ByteArrayOutputStream來上程式碼。他的作用就是把位元組流轉成字元。其實我感覺沒啥用,可能是我知道的不多
從檔案中讀取二進位制資料,全部儲存到ByteArrayOutputStream中。
FileInputStream fis=new FileInputStream("test"); BufferedInputStream bis=new BufferedInputStream(fis); ByteArrayOutputStream baos=new ByteArrayOutputStream(); int c=bis.read();//讀取bis流中的下一個位元組 while(c!=-1){ baos.write(c); c=bis.read(); } bis.close(); byte retArr[]=baos.toByteArray();
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。