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);
}
}
}