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