Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】
- 視頻+資料(工程源碼、筆記)【鏈接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg? ?提取碼:zjxs】
- Java基礎--學習筆記(零起點打開java世界的大門)--博客匯總表
? ??
目? ?錄
01_字節緩沖流
2.7、字節緩沖流
02_字節流復制視頻
案例:復制視頻
03_為什么出現字符流
3.1、為什么出現字符流
3.2、編碼表
05_字符串中的編碼解碼問題
3.3、字符串中的編碼解碼問題
06_字符流中的編碼解碼問題
3.4、字符流中的編碼解碼問題?
07_字符流寫數據的5種方式
3.5、字符流寫數據的5種方式
08_字符流讀數據的2種方式
3.6、字符流讀數據的2種方式
09_字符流復制Java文件
案例:復制Java文件
10_字符流復制Java文件改進版
案例:復制Java文件(改進版)
1、API——FileWriter
2、API——FileReader
11_字符緩沖流
3.7、字符緩沖流
1、API——BufferedReader
2、API——BufferedWriter
12_字符緩沖流復制Java文件
案例:復制Java文件(字符緩沖流改進版)
13_字符緩沖流特有功能
3.8、字符緩沖流特有功能
14_字符緩沖流特有功能復制Java文件
案例:復制Java文件(字符緩沖流特有功能改進版)
15_IO流小結
3.9、IO流小結
1、字節流
2、字符流
16_集合到文件
案例:集合到文件
17_文件到集合
案例:文件到集合
18_點名器
案例:點名器
19_集合到文件改進版
案例:集合到文件(改進版)
1、Student.java
2、ArrayListToFileDemo.java
20_文件到集合改進版
案例:文件到集合(改進版)
01_字節緩沖流
2.7、字節緩沖流
字節緩沖流(提高數據讀寫效率)介紹
- BufferOutputStream:該類實現緩沖輸出流。通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必為寫入的每個字節導致底層系統的調用。
- BufferedInputStream:創建BufferedInputStream將創建一個內部緩沖區數組。當從流中讀取或跳過字節時,內部緩沖區將根據需要從所包含的輸入流中重新填充,一次很多字節。
構造方法:
- BufferedOutputStream(OutputStream out):創建字節緩沖輸出流對象
- BufferedInputStream(InputStream in):創建字節緩沖輸入流對象
為什么構造方法需要的是字節流,而不是具體的文件或者路徑呢?
- 字節緩沖流僅僅提供緩沖區,而真正的讀寫數據還得依靠基本的字節流對象進行操作。
Class BufferedOutputStream:該類實現緩沖輸出流。 通過設置這樣的輸出流,應用程序可以向底層輸出流寫入字節,而不必為寫入的每個字節導致底層系統的調用。BufferedOutputStream是具體類;FileOutputStream寫字節數據時,會導致底層系統的調用;BufferedOutputStream可以向FileOutputStream寫數據,通過設置緩沖區,以后可以一次性把數據寫到文件中,底層調用次數減少,效率提高。
Class BufferedInputStream:提高讀取數據的效率。
?
02_字節流復制視頻
案例:復制視頻
?
package com.itheima_03;import java.io.*;/*需求:把E:\\itcast\\字節流復制圖片.avi 復制到模塊目錄下的 字節流復制圖片.avi思路:1:根據數據源創建字節輸入流對象2:根據目的地創建字節輸出流對象3:讀寫數據,復制圖片(一次讀取一個字節數組,一次寫入一個字節數組)4:釋放資源四種方式實現復制視頻,并記錄每種方式復制視頻的時間1:基本字節流一次讀寫一個字節 共耗時:64565毫秒2:基本字節流一次讀寫一個字節數組 共耗時:107毫秒3:字節緩沖流一次讀寫一個字節 共耗時:405毫秒4:字節緩沖流一次讀寫一個字節數組 共耗時:60毫秒*/ public class CopyAviDemo {public static void main(String[] args) throws IOException {//記錄開始時間long startTime = System.currentTimeMillis();//復制視頻method1();//記錄結束時間long endTime = System.currentTimeMillis();System.out.println("(1)共耗時:" + (endTime - startTime) + "毫秒");startTime = System.currentTimeMillis();method2();endTime = System.currentTimeMillis();System.out.println("(2)共耗時:" + (endTime - startTime) + "毫秒");startTime = System.currentTimeMillis();method3();endTime = System.currentTimeMillis();System.out.println("(3)共耗時:" + (endTime - startTime) + "毫秒");startTime = System.currentTimeMillis();method4();endTime = System.currentTimeMillis();System.out.println("(4)共耗時:" + (endTime - startTime) + "毫秒");}//字節緩沖流一次讀寫一個字節數組public static void method4() throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字節流復制圖片.avi"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("字節流復制圖片4.avi"));byte[] bys = new byte[1024];int len;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}bos.close();bis.close();}//字節緩沖流一次讀寫一個字節public static void method3() throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字節流復制圖片.avi"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("字節流復制圖片3.avi"));int by;while ((by = bis.read()) != -1) {bos.write(by);}bos.close();bis.close();}//基本字節流一次讀寫一個字節數組public static void method2() throws IOException {//E:\\itcast\\字節流復制圖片.avi//模塊目錄下的 字節流復制圖片.aviFileInputStream fis = new FileInputStream("E:\\itcast\\字節流復制圖片.avi");FileOutputStream fos = new FileOutputStream("字節流復制圖片2.avi");byte[] bys = new byte[1024];int len;while ((len = fis.read(bys)) != -1) {fos.write(bys, 0, len);}fos.close();fis.close();}//基本字節流一次讀寫一個字節public static void method1() throws IOException {//E:\\itcast\\字節流復制圖片.avi//模塊目錄下的 字節流復制圖片.aviFileInputStream fis = new FileInputStream("E:\\itcast\\字節流復制圖片.avi");FileOutputStream fos = new FileOutputStream("字節流復制圖片1.avi");int by;while ((by = fis.read()) != -1) {fos.write(by);}fos.close();fis.close();} }03_為什么出現字符流
3.1、為什么出現字符流
字符流的介紹
由于字節流操作中文不是特別的方便,所以Java就提供字符流。
- 字符流 = 字節流 + 編碼表
中文的字節存儲方式
用字節流復制文本文件時,文本文件也會有中文,但是沒有問題,原因是最終底層操作會自動進行字節拼接成中文,如何識別是中文的呢?
- 漢字在存儲的時候,無論選擇哪種編碼存儲,第一個字節都是負數。
04_編碼表
3.2、編碼表
基礎知識:
- 計算機中儲存的信息都是用二進制數表示的;我們在屏幕上看到的英文、漢字等字符是二進制數轉換之后的結果。
- 按照某種規則,將字符存儲到計算機中,稱為編碼。反之,將存儲在計算機中的二進制數按照某種規則解析顯示出來,稱為解碼。這里強調一下:按照A編碼存儲,必須按照A編碼解析,這樣才能顯示正確的文本符號。否則就會導致亂碼現象。
? ? ? 字符編碼:就是一套自然語言的字符與二進制數之間的對應規則(A, 65)
字符集:
- 是一個系統支持的所有字符的集合,包括各國家文字、標點符號、圖形符號、數字等。
- 計算機要準確的存儲和識別各種字符集符號,就需要進行字符編碼,一套字符集必然至少有一套字符編碼。
? ? ? 常見字符集有ASCII字符集、GBXXX字符集、Unicode字符集等。
? ?
05_字符串中的編碼解碼問題
3.3、字符串中的編碼解碼問題
06_字符流中的編碼解碼問題
3.4、字符流中的編碼解碼問題?
字符流抽象基類
- Reader:字符輸入流的抽象類
- Writer:字符輸出流的抽象類
字符流中和編碼解碼問題相關的兩個類:
- InputStreamReader:是從字節流到字符流的橋梁
? ? 它讀取字節,并使用指定的編碼將其解碼為字符
? ? 它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平臺的默認字符集
- OutputStreamWriter:是從字符流到字節流的橋梁
? ? 是從字符流到字節流的橋梁,使用指定的編碼將寫入的字符編碼為字節
? ? 它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平臺的默認字符集
? ?
? ?
07_字符流寫數據的5種方式
3.5、字符流寫數據的5種方式
構造方法:OutputStreamWriter?(OutputStream out):創建一個使用默認字符編碼的OutputStreamWriter
08_字符流讀數據的2種方式
3.6、字符流讀數據的2種方式
構造方法:InputStreamReader?(InputStream in):創建一個使用默認字符集的InputStreamReader
字節流、字符流 讀數據的方式一樣!
09_字符流復制Java文件
案例:復制Java文件
10_字符流復制Java文件改進版
案例:復制Java文件(改進版)
簡化書寫,使用FileWriter、FileReader。編碼解碼問題:需要使用轉換流lnputStreamReader、OutputStreamReader。
1、API——FileWriter
2、API——FileReader
11_字符緩沖流
3.7、字符緩沖流
字符緩沖流介紹
- BufferedWriter:將文本寫入字符輸出流,緩沖字符,以提供單個字符,數組和字符串的高效寫入,可以指定緩沖區大小,或者可以接受默認大小。默認值足夠大,可用于大多數用途。
- BufferedReader:從字符輸入流讀取文本,緩沖字符,以提供字符,數組和行的高效讀取,可以指定緩沖區大小,或者可以使用默認大小。 默認值足夠大,可用于大多數用途。
構造方法
- BufferedWriter(Writer out)? ?創建字符緩沖輸出流對象
- BufferedReader(Reader in) 創建字符緩沖輸入流對象
1、API——BufferedReader
2、API——BufferedWriter
封裝長度為8192長度的字符數組。
??
12_字符緩沖流復制Java文件
案例:復制Java文件(字符緩沖流改進版)
13_字符緩沖流特有功能
3.8、字符緩沖流特有功能
BufferedWriter:
? ? void newLine():寫一行行分隔符,行分隔符字符串由系統屬性定義。適應不同的系統:Windows:\r\n;Linux:\n;Mac:\r
BufferedReader:
? ? public String readLine():讀一行文字。結果包含行的內容的字符串,不包括任何行終止字符,如果流的結尾已經到達,則為null。
14_字符緩沖流特有功能復制Java文件
案例:復制Java文件(字符緩沖流特有功能改進版)
15_IO流小結
3.9、IO流小結
抽象類:InputStream、OutputStream?
1、字節流
2、字符流
16_集合到文件
案例:集合到文件
17_文件到集合
案例:文件到集合
18_點名器
案例:點名器
19_集合到文件改進版
案例:集合到文件(改進版)
1、Student.java
package com.itheima_06;public class Student {private String sid;private String name;private int age;private String address;public Student() {}public Student(String sid, String name, int age, String address) {this.sid = sid;this.name = name;this.age = age;this.address = address;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;} }2、ArrayListToFileDemo.java
package com.itheima_06; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class ArrayListToFileDemo {public static void main(String[] args) throws IOException {//2:創建ArrayList集合ArrayList<Student> array = new ArrayList<Student>();//3:創建學生對象Student s1 = new Student("itheima001", "林青霞", 30, "西安");Student s2 = new Student("itheima002", "張曼玉", 35, "武漢");Student s3 = new Student("itheima003", "王祖賢", 33, "鄭州");//4:把學生對象添加到集合中array.add(s1);array.add(s2);array.add(s3);//5:創建字符緩沖輸出流對象BufferedWriter bw = new BufferedWriter(new FileWriter("students.txt"));//6:遍歷集合,得到每一個學生對象for (Student s : array) {//7:把學生對象的數據拼接成指定格式的字符串StringBuilder sb = new StringBuilder();sb.append(s.getSid()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress());//8:調用字符緩沖輸出流對象的方法寫數據bw.write(sb.toString());bw.newLine();bw.flush();}//9:釋放資源bw.close();} }20_文件到集合改進版
案例:文件到集合(改進版)
?
package com.itheima_06;import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList;public class FileToArrayListDemo {public static void main(String[] args) throws IOException {//2:創建字符緩沖輸入流對象BufferedReader br = new BufferedReader(new FileReader("students.txt"));//3:創建ArrayList集合對象ArrayList<Student> array = new ArrayList<Student>();//4:調用字符緩沖輸入流對象的方法讀數據String line;while ((line = br.readLine()) != null) {//5:把讀取到的字符串數據用split()進行分割,得到一個字符串數組String[] strArray = line.split(",");//6:創建學生對象Student s = new Student();//7:把字符串數組中的每一個元素取出來對應的賦值給學生對象的成員變量值//itheima001,林青霞,30,西安s.setSid(strArray[0]);s.setName(strArray[1]);s.setAge(Integer.parseInt(strArray[2]));s.setAddress(strArray[3]);//8:把學生對象添加到集合array.add(s);}//9:釋放資源br.close();//10:遍歷集合for (Student s : array) {System.out.println(s.getSid() + "," + s.getName() + "," + s.getAge() + "," + s.getAddress());}} }終于看完了。。。
總結
以上是生活随笔為你收集整理的Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java17-day08【File(创建
- 下一篇: Java19-day10【标准输入输出流