緩衝流&記憶體流
阿新 • • 發佈:2021-07-24
緩衝位元組流
緩衝區:計算機訪問外部裝置或檔案,要比直接訪問記憶體慢的多。如果我們每次呼叫read()方法或者writer()方法訪問外部的裝置或檔案,CPU就要花上最多的時間是在等外部裝置響應,而不是資料處理。為此,我們開闢一個記憶體緩衝區的記憶體區域,程式每次調read()方法或writer()方法都是讀寫在這個緩衝區中。當這個緩衝區被裝滿後,系統才將這個緩衝區的內容一次集中寫到外部裝置或讀取進來給CPU。使用緩衝區可以有效的提高CPU的使用率,能提高整個計算機系統的效率。在字元流操作中,所有的字元都是在記憶體中形成的,在字元流輸出前都將儲存在記憶體中的緩衝區內。
緩衝流:再讀寫資料時,讓資料在緩緩衝區能減少系統實際對原始資料來源的存取次數,因為一次能做多個數據單位的操作,相較而言,對於從檔案讀取資料或將資料寫入檔案,比起緩衝區的讀寫要慢多了。所以使用緩衝區的 流,一般都會比沒有緩衝區的流效率更高,擁有緩衝區的流別稱為緩衝流,包括BufferedInputStream、BufferedOutputStream類和BufferedReader、BufferedWriter類。緩衝流把資料從原始流成塊讀入或把資料積累到一個大資料塊後再成批寫出,通過減少通過資源的讀寫次數來加快程式的執行
緩衝位元組輸入流BufferedInputStream:
public class Demo01 { /* * BufferedInputStream(InputStream in,int size) * size: 指定緩衝區的大小,預設是8kb * */ public static void main(String[] args) { BufferedInputStream bis = null; try { // 1、真正去檔案中讀取位元組資料的位元組流 FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\test.txt"); // 2、建立緩衝流物件,並且規定緩衝區為4kb bis = new BufferedInputStream(fis,4*1024); // 3、通過緩衝流讀資料 byte [] bytes = new byte[1024]; int len; while((len=bis.read(bytes))!=-1){ System.out.println(len); System.out.println(new String(bytes,0,len)); } } catch (IOException e) { e.printStackTrace(); } finally { if(bis!=null) { try { bis.close();// 4、釋放資源, 關閉流 } catch (IOException e) { e.printStackTrace(); } } } } }
緩衝位元組輸出流BufferedOutputStream:
/* * 緩衝位元組輸出流 * BufferedOutputStream: * 1、BufferedOutputStream(OutputStream out) * 2、BufferedOutputStream(OutputStream out,int size) * * 以stream結尾是位元組流, 操作位元組陣列. 位元組流的所有核心方法都被定義在了InputStream/OutputStream * 所以凡是涉及到位元組流的輸入/輸出,程式碼基本上是一摸一樣的。 * * 以reader/writer結尾是字元流, 操作字元陣列 * */ public class Demo05 { public static void main(String[] args) { BufferedOutputStream bos = null; try { FileOutputStream fos = new FileOutputStream("C:\\Users\\GzhAnkh\\Desktop\\456.txt"); bos = new BufferedOutputStream(fos); String s = "xxaaxa!"; int len; byte [] data = s.getBytes(); // 通過"utf-8"編碼將s字串轉為位元組陣列 bos.write(data,0,data.length); } catch (IOException e) { e.printStackTrace(); } finally { if(bos!=null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
緩衝字元輸入流BufferedReade:
/*
* 字元緩衝流:
* BufferedReader(Reader reader)
* BufferedWriter(Writer writer)
* */
public class Demo06 {
public static void main(String[] args) {
BufferedReader br = null;
try {
FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\test.txt");
Reader reader = new InputStreamReader(fis);
br = new BufferedReader(reader);
char [] chars = new char[1024];
int len;
while((len=br.read(chars))!=-1){
System.out.println(chars);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(br!=null)
// 會用到一個設計模式(寫程式碼的套路): 裝飾者模式
{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 可以寫,但是沒必要,因為BufferedReader的close方法底層會去呼叫下面的方法
* reader.close();
* fis.close();
* */
}
}
}
public class Demo07 {
public static void main(String[] args) {
/*
* BufferedReader中有一個方法: readLine(), 一次讀取一行
* 如果呼叫該方法返回為null,表示讀完。
*
* 注意: readLine()方法是在BufferedReader中定義的,所以
* 在宣告型別時候要宣告為BufferedReader而不是Reader
*
* 凡是以Buffered開頭的流,都有一個構造方法來指定緩衝區的大小,
* 預設緩衝區的大小是8KB.
*
* */
BufferedReader br = null;
try {
FileInputStream fis = new FileInputStream("C:\\Users\\000\\Desktop\\test.txt");
Reader reader = new InputStreamReader(fis);
br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字元緩衝輸出流BufferedWriter:
public class Demo09 {
public static void main(String[] args) {
BufferedWriter bw = null;
try {
FileWriter fw = new FileWriter("C:\\Users\\000\\Desktop\\789.txt");
bw = new BufferedWriter(fw);
bw.write("abcabcabc");
/*
* newLine(): 在檔案中換行
* */
bw.newLine(); // 等價於bw.writer("\r\n")
bw.write("徐卓韓也喜歡去");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
if(bw!=null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字元流,緩衝流實現檔案複製:
public class Demo01 {
public static void main(String[] args) {
buffererReaderTest("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code04.java",
"C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code03.java");
}
private static void buffererReaderTest(String s,String s1) {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
File file = new File(s);
FileReader fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
File file1 = new File(s1);
FileWriter fileWriter = new FileWriter(file1);
bufferedWriter = new BufferedWriter(fileWriter);
String lenght;
while ((lenght = bufferedReader.readLine()) != null) {
System.out.println(lenght);
bufferedWriter.write(lenght+"\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
記憶體流ByteArrayOutputStream、ByteArrayInputStream
public class Demo01 {
public static void main(String[] args) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] bytes = {1,2,3,4,5,6};
baos.write(bytes);
byte[] target = baos.toByteArray();
for (byte b : target) {
System.out.println(b);
}
}
}