文件輸入流java.io.FileInputStream類繼承自字節輸入流InputStream類,表示從文件中讀取二進制數據到程序中:html
public class FileInputStreamDemo01{ public static void main(String args[]) throws Exception{ //先向文件中寫入數據,以便下面進行讀取 File f1=new File("e:"+File.separator+"test.doc"); OutputStream out=new FileOutputStream(f1,true); String message2="\r\n浙江師範大學行知學院"; byte[] b2=message2.getBytes(); for(int i=0;i<b2.length;i++){ out.write(b2[i]); } out.close();//數據寫入完成,關閉輸出流。 //下面開始從文件中讀取數據 InputStream in=new FileInputStream(f1); byte[] b=new byte[1024];//開闢了1024個字節的內存空間,不足就用空格補足 in.read(b); System.out.println("讀取內容以下:"+new String(b)); in.close(); } }
由於開闢了1024字節的內存空間,可是寫入的數據量顯然沒有1024字節。所以要是將這個1024大小的字節數組從新構建成字符串,這個字符串的長度或者說大小也將是1024字節。那麼其中的多餘字節就是由空格佔位造成的。java
運行效果以下:數組
顯然咱們並不但願看到這樣的結果。那麼如何解決?url
修改以下:spa
public class FileInputStreamDemo02{ public static void main(String args[]) throws Exception{ File f1=new File("e:"+File.separator+"test.doc"); OutputStream out=new FileOutputStream(f1,true); String message2="\r\n浙江師範大學行知學院"; byte[] b2=message2.getBytes(); for(int i=0;i<b2.length;i++){ out.write(b2[i]); } out.close(); InputStream in=new FileInputStream(f1); byte[] b=new byte[1024];//開闢1024空間大小的內存空間 int len=in.read(b);//len存儲着返回讀入緩衝區的字節總數 System.out.println("讀取內容的字節總數:"+len); //根據字節數組,構造從0開始的長度爲len的新字符串 System.out.println("讀取內容以下:"+new String(b,0,len)); in.close(); } }
由於在從新構造字符串時是依據實際讀取的字節大小構建的,所以新的字符串將不會有空格佔位的狀況。設計
上面的程序雖然解決了部分的問題,但在構建字節數組用於存儲讀取內容是開闢的內存空間是固定不變的,這樣的設計極不合理。由於假如須要讀取的數據量大於1024字節,這樣1024字節以後的數據將沒法讀取。那麼能不能按照文件大小構建字節數組呢?能!code
實例3:htm
public class FileInputStreamDemo03{ public static void main(String args[]) throws Exception{ File f1=new File("e:"+File.separator+"test.doc"); OutputStream out=new FileOutputStream(f1,true); String message2="\r\n浙江師範大學行知學院"; byte[] b2=message2.getBytes(); for(int i=0;i<b2.length;i++){ out.write(b2[i]); } out.close(); InputStream in=new FileInputStream(f1); byte[] b=new byte[(int)f1.length()];//根據文件大小給字節數組分配內存空間 for(int i=0;i<b.length;i++){ b[i]=(byte)in.read();//每次只讀取1個字節 } System.out.println("讀取內容以下:"+new String(b)); in.close(); } }
這樣的修改就能使內存資源獲得最大限度的利用。blog
下面使用另外一種讀取數據的方式。繼承
實例4:
public class FileInputStreamDemo04{ public static void main(String args[]) throws Exception{ File f1=new File("e:"+File.separator+"test.doc"); OutputStream out=new FileOutputStream(f1,true); String message2="\r\n浙江師範大學行知學院"; byte[] b2=message2.getBytes(); for(int i=0;i<b2.length;i++){ out.write(b2[i]); } out.close(); InputStream in=new FileInputStream(f1); byte[] b=new byte[(int)f1.length()]; int index=0; int temp=0; while((temp=in.read()) != -1){//表示沒有讀取到文件末尾。 b[index]=(byte)temp; index++; } System.out.println("讀取的文件內容:"+new String(b)); in.close();//資源類操做的結尾必定要關閉。 } }