IO之字節流

字節流主要操作byte類型數據,以byte數組爲準,主要操作類是OutputStream類和InputStream類。

1、字節輸出流:OutputStream

OutputStrem類是一個抽象類,要使用必須通過子類實例化對象,要操作文件,則使用FileOutputStream類轉型,在實例化。

【OutputStream類常用方法】
 * public void close() throws IOException 關閉輸出流
 * public void flush() throws IOException 刷新緩衝區
 * public void write(byte[] b) throws IOException 將一個byte數組寫入數據流
 * public void write(byte[] b,int off,int len) throws IOException 將一個指定範圍的byte數組寫入數據流
 * public void write(int b) throws IOException 將一個字節數據寫入數據流
 

實例一、向文件中寫入數據

public class OutputStreamDemo {
	/*向文件中寫入字符串*/
	public static void main(String[] args) {
		//在file類中找到一個文件
		File f = new File("D:"+File.separator+"test.txt");
		try {
			//通過子類實例化父類對象
			OutputStream out = new FileOutputStream(f);
			String str = "Hello world !";
			//直接將字符串變爲byte數組,然後寫入文件
			byte b[] = str.getBytes();
			//數據寫入
			out.write(b);
			//關閉輸出流
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

耶可以通過循環把每一個字節一個個的寫入到文件

public class OutputStreamDemo {
	/*向文件中寫入字符串*/
	public static void main(String[] args) {
		//在file類中找到一個文件
		File f = new File("D:"+File.separator+"test.txt");
		try {
			//通過子類實例化父類對象
			OutputStream out = new FileOutputStream(f);
			String str = "Hello world !";
			//將字符串變爲byte數組
			byte b[] = str.getBytes();
			//數據寫入
			for (int i = 0; i < b.length; i++) {
				out.write(b[i]);
			}		
			//關閉輸出流
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

實例二:向文件中追加新的數據

通過FileOutputStream向文件中追加新內容。通過構造方法實現:

    public FileOutputStream(File file,boolean append)  throws FileFoundException,在構造方法中獎append的值設置爲true,則表示在文件的末尾追加內容。

public class OutputStreamDemo {
	/*向文件中寫入字符串*/
	public static void main(String[] args) {
		//在file類中找到一個文件
		File f = new File("D:"+File.separator+"test.txt");
		try {
			//通過子類實例化父類對象
			OutputStream out = new FileOutputStream(f,true);
			String str = "\r\nHello world !";
			//將字符串變爲byte數組
			byte b[] = str.getBytes();
			//數據寫入
			for (int i = 0; i < b.length; i++) {
				out.write(b[i]);
			}		
			//關閉輸出流
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

2、字節輸入流:InputStream

也是一個抽象類,需要通過FileInputStream子類進行實例化

 * 【InputStream類的常用方法】
 * public int available() throws IOException  可以取得輸入文件的大小
 * public void close() throws IOException 關閉輸入流
 * public abstract int read() throws IOExcrption 讀取內容,以數組方式讀取
 * public int read(byte[] b) throws IOExcrption 將內容讀到byte數組中同時返回讀入的個數

實例:讀取文件數據

 

public class InputStream {
	public static void main(String[] args) {
		/*1、使用File找到一個文件*/
		File  f = new File("D:"+File.separator+"test.txt");
		/*2、通過子類實例化對象*/
		try {
			FileInputStream input = new FileInputStream(f);
		/*3、開始讀取操作*/
			byte b[] = new byte[1024]; //將所有內容讀取到數組
			input.read(b);
		/*關閉輸入流*/
			input.close();		
			/*把byte數字當做字符串輸出*/
			System.out.println("讀取內容:"+new String(b));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
上述代碼在讀取數據的時候會帶有很多空格的,我們可以指定byte數組範圍,如下修正

public class InputStream {
	public static void main(String[] args) {
		/*1、使用File找到一個文件*/
		File  f = new File("D:"+File.separator+"test.txt");
		/*2、通過子類實例化對象*/
		try {
			FileInputStream input = new FileInputStream(f);
		/*3、開始讀取操作*/
			byte b[] = new byte[1024]; //將所有內容讀取到數組
			int len = input.read(b);
		/*關閉輸入流*/
			input.close();		
			/*把byte數字當做字符串輸出*/
			System.out.println("讀取內容:"+new String(b,0,len));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

雖然不在出現空格,但是在數組中開闢了過多的無效內存,佔用很多空間。我們可以根據文件的數量來開闢相應的內容空間。

public class InputStream {
	public static void main(String[] args) {
		/*1、使用File找到一個文件*/
		File  f = new File("D:"+File.separator+"test.txt");
		/*2、通過子類實例化對象*/
		try {
			FileInputStream input = new FileInputStream(f);
		/*3、開始讀取操作*/
			//將所有內容讀取到數組,數組大小由文件內容大小決定
			byte b[] = new byte[(int) f.length()]; 
			input.read(b);
		/*關閉輸入流*/
			input.close();		
			/*把byte數字當做字符串輸出*/
			System.out.println("讀取內容:"+new String(b));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

上面代碼是一次性讀取出文件中的所有內容,我們也可以一個字節一個字節的來讀取,修改如下代碼:

在知曉數組具體大小的情況下:

public class InputStream {
	public static void main(String[] args) {
		/*1、使用File找到一個文件*/
		File  f = new File("D:"+File.separator+"test.txt");
		/*2、通過子類實例化對象*/
		try {
			FileInputStream input = new FileInputStream(f);
		/*3、開始讀取操作*/
			//將所有內容讀取到數組,數組大小由文件內容大小決定
			byte b[] = new byte[(int) f.length()]; 
			for (int i = 0; i < b.length; i++) {
				b[i]=(byte) input.read();
			}
			
		/*關閉輸入流*/
			input.close();		
			/*把byte數字當做字符串輸出*/
			System.out.println("讀取內容:"+new String(b));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

在不知曉數組具體大小的情況下,只能通過判斷是否讀取到文件末尾來進行內容讀取:

public class InputStream {
	public static void main(String[] args) {
		/*1、使用File找到一個文件*/
		File  f = new File("D:"+File.separator+"test.txt");
		/*2、通過子類實例化對象*/
		try {
			FileInputStream input = new FileInputStream(f);
		/*3、開始讀取操作*/
			//將所有內容讀取到數組,數組大小由文件內容大小決定
			byte b[] = new byte[1024]; 
			int temp = 0; //接收讀取的內容
			int len = 0; //記錄讀取的數據個數
			while ((temp=input.read())!=-1) {
				//將每次讀取的內容給temp變量,如過temp不等於-1.表示還沒讀取完
				b[len]=(byte)temp;
				len++;
			}
			
		/*關閉輸入流*/
			input.close();		
			/*把byte數字當做字符串輸出*/
			System.out.println("讀取內容:"+new String(b,0,len));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}






發佈了20 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章