1. 程式人生 > 其它 >java成神之路——IO流

java成神之路——IO流

技術標籤:javajava

File類

  • java.io.File類:檔案和目錄路徑的抽象表現形式,與平臺無關
  • File能新建、刪除、重新命名檔案和目錄,但File不能訪問檔案內容本身,如果需要訪問檔案內容本身,則需要使用輸入輸出流。
  • File物件可以作為引數傳遞給流的物件。

File類的常見構造方法

  • public File(String Pathname)
    以pathname為路徑建立File物件,可以是絕對路徑也可以是相對路徑,如果pathname是相對路徑,則預設當前路徑在系統屬性user.dir中儲存。
  • public File(String parent,String Child)
    以parent為父路徑,childe為子路徑建立File物件
    *File的靜態屬性String Separator儲存了當前系統的路徑分割符號。
public void test(){
	//File fine = new File("D:\\io\\helloword.txt");//絕對路徑
	//以helloword.txt為路徑建立File物件
	File fiel = new File("helloword.txt");//相對路徑
//判斷物件是否存在,不存在建立物件
	if(!file.exists()){
	boolean b1 = file.createNewFile();
}
File file3 = new File("hello");
//建立資料夾
if(file3.exists){
	file3.mkdir();
}
}

java IO原理

  • IO流用來處理裝置之間的資料傳輸
  • java程式中,對於資料的輸入、輸出操作類似以“流(stream)的方式進行。
  • java.io包下提供了各類”流“類和介面,用以獲取不同的資料,並通過標準的方法輸入/輸入資料。
  • 輸入:讀取外部資料(磁碟、光碟等儲存等儲存裝置的資料)到程式(記憶體)中。
  • 輸出:將程式(記憶體)資料輸出到磁碟、光碟等儲存裝置中。

流的分類

  • 按資料單位分為:位元組流和字元流
  • 按資料流的流向不同分為:輸入流和輸出流
  • 按角色的不同分為:節點流和處理流
  • 在這裡插入圖片描述
  • java的IO流設計40多個類,實際上都是從如上四個類上派生出來的
  • 這四個類派生出來的子類名都是以父類名作為字尾
    這裡我們主要對訪問檔案和緩衝流做詳細說明
    在這裡插入圖片描述
  1. FileInPutStream
//從檔案中讀取內容到控制檯上
public void test(){
//1. 建立File物件
	File file = new File("hello.txt");
	FileInPutStream fis = null;
	try{
	// 2. 將File物件作為形參傳遞給InPutStream的實現類FileInPutStream的構造器中
		fis = new FileInPutStream(file);
			int i;
	//這裡是因為read()是從輸入的流中讀取的是位元組資料,且這個方法在沒有輸入的時候會堵塞,這個方法的返回值是下一個位元組,在沒有輸入的時候返回為-1
	// 3. 通過呼叫Reader方法讀取檔案中的內容
	while(i = fis.read()!=-1){//判斷是否還有輸入
		System.out.println((char)i);//這裡是因為返回的是位元組轉型為字元
}catch(Exception e){
e.printStackTrace();
}finally{
	try{
	//4. 關閉現有的流
		fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
]

  1. FileOutPutStream
// 從指定的檔案中讀取內容
public void test1(){
	File src = new File("hello.txt");
	File des = new File("helloword.txt");

FIleInPutStream fis = null;
FileOutPutStream fos = null;
try{
		fis = new FileInPutStream(src);
		fos = new FileOutPutStream(des);
		byte[] b = new byte[10];
		int len;
		while(len = fis.read(b)!=-1){
			fos.write(b,0,len);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
	if(fos!=null){
		fos.close();
		}catch(IOException e){
e.printStackTrace();
}
try{
	if(fis!=null){
		fis.close();
		}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
}

3 . FileReader

public void test(){
//1. 建立File物件
	File file = new File("hello.txt");
	FIleReader fis = null;
	try{
	// 2. 將File物件作為形參傳遞給InPutStream的實現類FileInPutStream的構造器中
		fis = new FIleReader (file);
			int i;
	while(i = fis.read()!=-1){//判斷是否還有輸入
		System.out.println(i);
}catch(Exception e){
e.printStackTrace();
}finally{
	try{
	//4. 關閉現有的流
		fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
]

  1. FileWirte
public void test1(){
	File src = new File("hello.txt");
	File des = new File("helloword.txt");

FIleReader fis = null;
FileWriter  fos = null;
try{
		fis = new FIleReader (src);
		fos = new FileWriter  (des);
		char[] c= new char[10];
		int len;
		while(len = fis.read(c)!=-1){
			fos.write(c,0,len);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
	if(fos!=null){
		fos.close();
		}catch(IOException e){
e.printStackTrace();
}
try{
	if(fis!=null){
		fis.close();
		}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
}
  1. BufferedInPutStream 、BufferedOutPutStream
public void test1(){
	File src = new File("hello.txt");
	File des = new File("helloword.txt");

FIleInPutStream fis = null;
FileOutPutStream fos = null;
BufferedInPutStream bis = null;
BufferedOutPutStream bos = null;

try{
		fis = new FileInPutStream(src);
		fos = new FileOutPutStream(des);

		bis = new BufferedInPutStram(fis);
		bos = new BufferedOutPutStream(fos);
		
		byte[] b = new byte[1024];
		int len;
		while(len = bis.read(b)!=-1){
			bos.write(b,0,len);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
	if(fos!=null){
		bos.close();
		}catch(IOException e){
e.printStackTrace();
}
try{
	if(fis!=null){
		bis.close();
		}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
}

總結:傳輸文字使用Reader 和 Writer比較快,圖片和視訊則是InputStream和UotPutStream比較快
想提升傳輸速度可以使用緩衝流bufferedInputStram和BufferedOutPutStram還可以在建立位元組陣列的時候自定位元組數多一點如 byte[] b = new byte[10] 改為byte[] b = new byte[1024] 這樣就是以10位元組讀取或則寫入提升到1024 位元組讀取或者寫入。