JavaIO流

 

IO流

IO流的分類:

1)按方向劃分:

a.輸入流:讀取數據

b.輸出流:寫輸出數

2)按數據類型分:

a.字節流(圖片文件,音頻,視頻等等....使用字節流)

字節輸入流 :InputStream          抽象類:FileInputStream

字節輸出流: OutputStream       抽象類:FileOutputStream

b.字符流:(針對是文本文件操作,優先採用字符流)

字符輸入流:Reader

字符輸出流:Writer

 

文件的字節輸入流

   public FileInputStream(String name)
  
 讀數據的兩種方式:
 
  1)public int read():一次讀取一個字節
  2)public int read(byte[] b):一次讀取一個字節數組

例:

 

public class FileInputStreamDemo {

	public static void main(String[] args) throws IOException {
		//創建文件輸入流對象
		FileInputStream fis = new FileInputStream("fis.txt");
		/*//方式一  public int read():一次讀取一個字節
		int by = 0;
		while((by = fis.read()) != -1) {
			System.out.print((char)by);
		}
		//釋放資源
		fis.close();*/
		//方式二   public int read(byte[] b):一次讀取一個字節數組
		
		byte[] bys = new byte [1024];
		int len = 0;
		while((len = fis.read(bys)) != -1) {
			System.out.println(new String(bys, 0, len));//從0開始,讀取實際長度
		}
		//釋放資源
		fis.close();
	}
}

(一個代碼中只能使用一種方式,不然會出錯)
 

 

將一個在D盤下a.txt文件的內容複製到E盤下b.txt文件中

1). 使用FileInputStream:輸入流------->讀數據(封裝數據源)
      FileOutputStream:輸出流------>寫數據(封裝目的地)

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

//FileInputStream:輸入流------->讀數據
//FileOutputStream:輸出流------>寫數據

public class CopyDemo1 {

	public static void main(String[] args) throws IOException {
		//封裝數據源:
		//創建一個文件字節輸入流對象
		FileInputStream fis= new FileInputStream("d:\\a.txt");
		//封裝目的地
		//創建文件輸出流對象
		FileOutputStream fos = new FileOutputStream("e:\\b.txt") ;

//		一次讀取一個字節
		int by = 0;
		while ((by = fis.read()) != -1) {
			//寫入數據
			fos.write(by);
		}
		//關閉資源
		fis.close();
		fos.close();
	}
}

2).一次讀取一個字節數組

 

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyDemo2 {

	public static void main(String[] args) throws IOException {

		// 封裝數據源:
		// 創建一個文件字節輸入流對象
		FileInputStream fis = new FileInputStream("d:\\a.txt");
		// 封裝目的地
		// 創建文件輸出流對象
		FileOutputStream fos = new FileOutputStream("e:\\b.txt");
		
		//一次讀取一個字節數組
		byte [] buffer = new byte [1024];
		int len = 0;
		while ((len = fis.read(buffer)) != -1) {
			
			fos.write(buffer, 0, len);
		}
		//關閉資源
		fis.close();
		fos.close();
		
	}
}


 引出:

 

  字節緩衝輸入流:BufferedInputStream

構造方法:
  public BufferedInputStream(InputStream in) :指定默認緩衝區大小創建字節緩衝輸入流對象

 字節緩衝輸出流:BufferedOutputStream

構造方式:
public BufferedOutputStream(OutputStream out):默認緩衝區大小

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 *  字節緩衝輸入流:BufferedInputStream
 *  構造方法:
 *	public BufferedInputStream(InputStream in) :指定默認緩衝區大小創建字節緩衝輸入流對象
 *
 * 字節緩衝輸出流:BufferedOutputStream
 * 構造方式:
 *	public BufferedOutputStream(OutputStream out):默認緩衝區大小
 * */
public class CopyDemo3 {

	public static void main(String[] args) throws IOException {
		
		//封裝數據源
		BufferedInputStream bis = new BufferedInputStream(
				new FileInputStream("d:\\a.txt"));
		//封裝目的地
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream("e:\\b.txt"));
		
		//一次讀取一個字節
		/*int by = 0;
		while ((by = bis.read()) != -1) {
			
			bos.write(by);
		}
		//關閉資源
		bis.close();
		bos.close();*/
		//一次讀取一個字節數組
		byte [] buffer = new byte[1024];
		int len = 0;
		while ((len = bis.read(buffer)) != -1) {
			
			bos.write(buffer, 0, len);
		}
		//關閉資源
		bis.close();
		bos.close();
	}
}

 

字符轉換流:可以將字節輸出流轉換字符流

字符輸入流InputStreamReader:繼承自Reader

 

字節輸入流+編碼格式(默認GBK)----->字符輸入流

構造方式:
  public InputStreamReader(InputStream in,charset sc) ;

 

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputSrteamReaderDemo {

	public static void main(String[] args) throws IOException {
		
		//創建字符輸入流對象
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream("isr.txt"),"GBK");
		//讀取
		char [] buffer = new char [1024];
		int len = 0;
		while ((len = isr.read(buffer)) != -1) {
			System.out.println(new String (buffer,0,len));
		}
		isr.close();
	}
}


字符輸出流OutputStreamWriter:繼承自Writer

 

 

 

    字節輸出流+編碼格式---->字符輸出流

構造方式:
public OutputStreamWriter(OutputStream out,Charset cs):創建一字符輸出轉換流對象,指定編碼格式
 

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class OutputStreamWriterDemo {
	
	public static void main(String[] args) throws IOException {
		
		//創建一個字符輸出流對象
		//public OutputStreamWriter(OutputStream out,Charset cs)

		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
				"osw.txt"));//默認GBK
		
		
		//寫數據
		osw.write("乖女兒,馬二蛋...") ;
		
		//釋放資源
		osw.close() ;
		
		
	}
}

 

 

便捷類:

由於使用字符轉換流進行操作數據的時候書寫代碼名稱非常長,於是Java提供了一種更簡單的類:

  字符轉換輸入流:InputStreamReader----->FileReader
  FileReder(String fileName) 
  字符轉換輸出流:OutputStreamWriter---->FileWriter
  FileWriter(String fileName) 

 

需求:使用便捷類複製文件

 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyDemo {

	public static void main(String[] args) throws IOException {
		//封裝數據源和目的地
		FileReader fr = new FileReader("D:\\a.txt"); 
		FileWriter fw = new FileWriter("E:\\b.txt");	
		
		//讀取
		int by = 0;
		while((by = fr.read()) != -1) {
			fw.write((char)by);
		}
		//釋放資源
		fr.close();
		fw.close();
	}
}


 字符緩衝輸入流 :BufferedReader

 

 

 

 

public class BufferedReader

extends Reader

 

 

從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {

	public static void main(String[] args) throws IOException {
		
		//創建字符緩衝輸入流對象
		BufferedReader br = new BufferedReader(new FileReader("bw.txt")) ;
		
		//一次讀取一個字符
		/*int ch = 0 ;
		while((ch=br.read())!=-1){
			System.out.print((char)ch);
		}*/
		
		//一次讀取一個字符數組
		char[] chs = new char[1024] ;
		int len = 0 ;
		while((len = br.read(chs))!=-1){
			System.out.println(new String(chs, 0, len));
		}
		
		//關閉資源
		br.close() ;
	}
}


 字符緩衝輸出流 :BufferedWriter

 

 

 

 

public class BufferedWriter

extends Writer

 

 

將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class BufferedWriterDemo {
	
	public static void main(String[] args) throws IOException {
		
		//創建字符緩衝輸出流對象
		//public BufferedWriter(Writer out)
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")) ;
		
		//寫數據
		bw.write("hello") ;
		bw.write("world") ;
		bw.write("java") ;	
		
		//刷新流
		bw.flush() ;
		
		//關閉資源
		bw.close() ;
	}
}


注意:可以指定緩衝區的大小,或者默認緩衝區的大小,一般情況下,默認的已經足夠大了!

 

關於字符緩衝流的特有功能:
  BufferedWriter:
   public void newLine():寫入一個換行符號
  BufferReader:
   public String readLine():一次讀取一行

 

 

public class BufferedDemo {
	
	public static void main(String[] args) throws IOException {
		
		write();
		
		read();
	}

	private static void read() throws FileNotFoundException, IOException {
		//創建一個字符緩衝輸入流對象
		BufferedReader br = new BufferedReader(new FileReader("bw.txt")) ;
		
		//讀數據
		//public String readLine():一次讀取一行
		
		String line = null ;
		while((line=br.readLine())!=null){
			System.out.println(line);
		}
		//釋放資源
		br.close() ;
	}

	private static void write() throws IOException {
	
		//創建一個字符緩衝輸出流對象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")) ;
		
		//寫數據
		for(int x = 0 ; x <10 ; x ++){
			bw.write("hello"+x) ;
			//使用特有功能
			bw.newLine() ;
						
			//刷新該流
			bw.flush() ;
		}
		
		//釋放資源
		bw.close() ;
	}
}
	bw.write("hello"+x) ;
			//使用特有功能
			bw.newLine() ;
						
			//刷新該流
			bw.flush() ;
		}
		
		//釋放資源
		bw.close() ;
	}
}

 

 

 

關於字符流和字節流的使用:

   當我們操作的是一個文本文件,優先採用字符流,如果是視頻,音頻,動畫,圖片資源文件這些記事本讀不懂,那麼使用字節流

關於複製文件:

將D盤下 喵.jpg圖片複製到當前項目下copy.jpg

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyImageDemo {
	
	public static void main(String[] args) throws IOException {
		
		//封裝數據源和目的地
		FileInputStream fis = new FileInputStream("D:\\喵.jpg") ;
		FileOutputStream fos = new FileOutputStream("copy.jpg") ;
		
		//一次讀取一個字節數組
		byte[] bys = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bys))!=-1){
			//寫數據的
			fos.write(bys, 0, len) ;
		}
		
		//釋放資源
		fis.close() ;
		fos.close() ;
	}
}


複製視頻文件同理

 

關於速度問題:

高效字節流比基本字節流快,一次讀取一個字節數組比一次讀取一個字節快

 

遞歸:

三個條件:
1)定義一個方法
2)必須有規律
3)要有出口條件

例:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問
第二十個月的兔子對數爲多少?

 

public class Test {
	public static void main(String[] args) {
		int i = 20;
		for(i=1;i <=20 ;i++) {
			System.out.println("兔子第"+i+"個月的總數爲:"+f(i));
		}
	}
	public static int f(int x) {
		//第一月和第二月都是1對
		if(x == 1 || x == 2) {
			return 1;
		}else {//第三個月開始是之前兩個月的數量之和
			return f(x-1)+f(x-2);
		}
		
	}
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章