day36-IO流3

day36——IO流

一、上節(jié)課回顧

1、File類:文件和目錄

2、IO流:將數(shù)據(jù)從一個地方傳輸?shù)搅硪粋€地方。

? 原理:比如本地文件和程序,創(chuàng)建“管子”——>IO流,

3、IO的操作步驟:

step1:數(shù)據(jù)從哪到哪里:本地文件——程序,程序——本地文件,程序——網(wǎng)絡,網(wǎng)絡——程序。。。。
step2:創(chuàng)建流:
    流向:輸入,輸出
    單位:字節(jié),字符
    子類流:
step3:操作流
    輸入:讀取,read()
    輸出:寫出,write()
step4:關閉流
    釋放資源

4、常見的IO流

A:4個父類流(抽象的)
InputStream
OutputStream
Reader
Writer
B:文件流
FileInputStream
FileOutputStream
FileReader
FileWriter

5、操作流

讀取數(shù)據(jù):
int read(),每次只讀取一個字節(jié)的數(shù)據(jù)。返回值就是讀到的數(shù)據(jù)。末尾,-1
    
int read(byte[] bs),每次讀取多個字節(jié),數(shù)據(jù)存入到bs數(shù)組中。最多可以讀入數(shù)組的長度個,返回值是實際讀取的數(shù)量。末尾,-1.
int read(byte[] bs,int off,int len),每次讀取多個,數(shù)據(jù)存入到bs數(shù)組中,從off下標開始存儲,最多可以讀入len個,返回值才是實際讀取的數(shù)量。末尾,-1.
    
    
    
  讀取-1
  read()-->97
  byte [] bs = new byte[1];
  read(bs)-->1
      
寫出操作:
void write(int),寫出一個字節(jié),參數(shù)就是要寫出的這個字節(jié)數(shù)據(jù)
void write(byte[] bs),將bs數(shù)組中的所有數(shù)據(jù),全部寫出
void write(byte[] bs,int off,int len),寫出數(shù)組中的部分數(shù)據(jù),從下標off開始,len個。

復制文件:

源文件:960個字節(jié)
目標文件:960個字節(jié)

byte[] bs= new byte[200];
第一讀:200,寫:200,剩:760
第二讀:200,寫:200,剩:560
第三讀:200,寫:200,剩:360
第四讀:200,寫:200,剩:160
第五讀:160,寫:160,剩余:0
第六讀:-1.
1文件復制.png

二、本節(jié)課內(nèi)容

2.1、FileReader

同F(xiàn)ileInputStream,單位不同。

讀取:
read()-->int,讀取一個字符,返回值就是讀到的數(shù)據(jù),末尾-1.
read(char[] cs)-->int,讀取多個字符,存入cs字符數(shù)組中,返回值讀取的個數(shù)。末尾-1
read(char[] cs,int off,int len)-->int,讀取多個字符,末尾-1
字節(jié)流:操作的單位是字節(jié),可以讀取一個字節(jié),也可以讀取多個字節(jié),存入字節(jié)數(shù)組:byte[] bs,
字符流:操作的單位是字符,可以讀取一個字符,也可以讀取多個字符,存入字符數(shù)組:char[] cs,

選擇流的時候,到低是選擇字節(jié)為單位的還是字符單位的?

數(shù)據(jù):計算機存儲數(shù)據(jù),都是采用2進制:01碼
單位:
    一個0或一個1,叫一個bit,位
    8個0或1,叫一個byte,字節(jié)
    
所有的數(shù)據(jù)的本質(zhì),都是字節(jié)為單位的。
    圖片,音頻,視頻,壓縮文件,exe可執(zhí)行文件,包括文本文件。。
    
字符流:字符——>字符編碼(GBK,UTF-8)
    a:97
    中:20013
    
【禁止】?。?!使用字符流去操作非字符的文件。比如音頻,視頻,圖片等等。。。

字符流:

1、使用字節(jié)流(FileInputStream)讀取一個文本文件(包含中文),邊讀邊看(打印),亂碼。原因?
    GBK,UTF-8,一個中文可能占多個字節(jié)。
    如果使用字節(jié)流讀取數(shù)據(jù),按照字節(jié)來讀,一個字節(jié)一個字節(jié)的讀取,讀了一個字節(jié),打印對應的字符,所以存在了亂碼。一個漢字是多個字節(jié),但是讀一個字節(jié)看一個字節(jié),肯定亂碼。
2、字符流 = 字節(jié)流 + 解碼過程
    字節(jié)組合操作 ——>當前環(huán)境的編碼集
        字符流將讀取的編碼值,根據(jù)編碼集,對應的字符。
    
3、總結:
    所有的文件都可以是使用字節(jié)流。
        圖片,音頻,視頻,壓縮文件,exe可以執(zhí)行文件。。。
        
    文本文件,建議使用字符流。因為里面都是文本(字符)。

2.2、FileWriter

1、構造方法:

FileWriter(String path);
FileWriter(File file);
FileWriter(String path,boolean append);
FileWriter(File file, boolean append);

2、寫出數(shù)據(jù)

void write(int),將參數(shù)這個字符,寫出去
void write(char[] cs),將整個cs數(shù)組的所有數(shù)據(jù),全部寫出
void write(char[] cs,int off,int len),將cs數(shù)組的一部分寫出,從下標off開始,len個
void write(String s),直接將一個字符串寫出
void write(String s, int off,int len),寫出字符串的一部分

2.3、InputStreamReader

2.4、OutputStreamWriter

轉換流:輸入:InputStreamReader,繼承了Reader,讀取

轉換流:輸出:OutputStreamWriter,繼承了Writer,寫出

構造方法:

InputStreamReader(InputStream);//讀取字符為單位的數(shù)據(jù)
OutputStreamWriter(OutputStream);//寫出字符為單位的數(shù)據(jù)

InputStreamReader(InputStream,"編碼集");//讀取字符為單位的數(shù)據(jù)
OutputStreamWriter(OutputStream,"編碼集");//寫出字符為單位的數(shù)據(jù)
  • 轉換了單位:字節(jié)-字符之間的橋梁
  • 設置編碼:因為java采用的編碼Unicode編碼,程序應該使用utf-8的編碼集。但是eclipse這個軟件的工作空間,默認的編碼集是gbk。為了一勞永逸,更改工作空間的編碼集為utf-8。


    eclipse切換工作空間.png
設置eclipse的工作空間的編碼集為utf-8.png
OutputStream流:字節(jié)輸出流
FileOutputStream
    write(int),寫一個字節(jié)
    write(byte[] bs ),寫一個字節(jié)數(shù)組的數(shù)據(jù)
    write(byte[] bs,int off, int len),寫出一個字節(jié)數(shù)組的一部分
    

Writer流:字符輸出流
FileWriter
    write(int),寫一個字符
    write(char[] cs),寫一個字符數(shù)組的數(shù)據(jù)
    write(char[] cs,int off,int len)
    write(String s)
    write(String s,int off,int len)
    
3InputStreamReader流.png
4OutputStreamWriter.png

字符編碼:

本質(zhì):每個字符——>編碼值
    a:97
    b:98
    A:65
    B:66
    。。。
編碼集:ASCII(美國標準信息交換碼)

每個國家都有個自己的編碼集:
中國:GBK編碼集,兼容了ASCII。
    包含了我們中國的字符。
    中:編碼值
    國:編碼值
    字符:都給排個編號,就是編碼值
    
編碼集:亂碼
    編碼和解碼不對應,就會亂碼。

Unicode編碼:號稱統(tǒng)一了全世界的字符。
    UTF-8
A、4大基類流
InputStream
OutputSteam
Reader
Writer
B:文件流
FileInputStream
FileOutputStream
FileReader
FileWriter

C、緩存流
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter

D、對象流
ObjectInputStream
ObjectOutputStream

E:轉換流:
InputStreamReader
OutputStreamWriter
    轉換單位:字節(jié)-字符之間的橋梁
    指明編碼:

流的分類:

流向:輸入,輸出
單位:字節(jié),字符
功能:
    節(jié)點流:直接接觸數(shù)據(jù)源的流
    處理流:也叫過濾流,套在別的流上的流。
        關閉的時候:倒著關閉?;蛘吒纱嘀苯雨P閉處理流。

2.5、BufferedInputStream

2.6、BufferedOutoutStream

2.7、BufferedReader

新增的方法:readLine()--->String,每次讀取一行。

2.8、BufferedWriter

新增的方法:newLine()-->void

寫換行:write("\r\n");

緩存流(重點掌握):目的:高效。
原理:自帶了一個數(shù)組作為緩沖區(qū)。讀寫發(fā)生在數(shù)組上。數(shù)組占內(nèi)存,速度很快。
FileInputStream
    read()-->int,訪問磁盤,操作文件,讀一個字節(jié)回來。。

BufferedInputStream
    read()-->int,先找緩沖區(qū),從緩沖區(qū)中讀取一個字節(jié)回來。fill(),讀取磁盤文件,填充緩沖區(qū)
byte[] bs ,作為緩沖區(qū):1024*8。

5緩存流.png
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容