最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Java IO流-基本流

2023-03-02 14:29 作者:回到唐朝當(dāng)少爺  | 我要投稿

IO流 基本流

IO流:存儲(chǔ)和讀取數(shù)據(jù)的解決方案

作用:讀寫數(shù)據(jù)(本地文件,網(wǎng)絡(luò))

按流的方向分:IO流分為輸入流(讀取)和輸出流(寫出)

按操作文件類型分:字節(jié)流(操作所有類型的文件)和字符流(只能操作純文本文件)

純文本文件:Windows自帶的記事本打開能讀懂 word文件,Excel文件不是純文本文件

IO流體系

字節(jié)流:InputStream(字節(jié)輸入流)和OutputStream(字節(jié)輸出流)

字符流:Reader(字符輸入流)和Writer(字符輸出流)

上述均為抽象類

字節(jié)流

FileOutputStream

細(xì)節(jié)

  1. 創(chuàng)建字節(jié)輸出流對(duì)象

    • 參數(shù)使字符串表示的路徑或者是File對(duì)象均可

    • 如果文件不存在會(huì)創(chuàng)建一個(gè)新的文件,但要保證父級(jí)路徑是存在的

    • 如果文件已經(jīng)存在會(huì)清空文件

  2. 寫數(shù)據(jù)

    • write方法的參數(shù)是整數(shù),但是實(shí)際上寫到本地文件中的整數(shù)是在ASCII上對(duì)應(yīng)的字符

    • 97->a

  3. 釋放資源

    • 每次使用完流后要釋放資源

寫數(shù)據(jù)的三種方式

換行寫:

  • windows:\r\n

  • Linux:\n

  • Mac:\r

細(xì)節(jié):

  • 在Windows操作系統(tǒng)中,java對(duì)回車換行進(jìn)行了優(yōu)化

  • 雖然完整的是\r\n,但是我們寫其中一個(gè)\r或者\(yùn)n,java也可以實(shí)現(xiàn)換行,因?yàn)樗鼤?huì)在底層補(bǔ)全

建議:不要省略,還是寫全比較好

續(xù)寫:

如果想續(xù)寫打開開關(guān)即可,傳遞true

FileInputStream

如果讀不到了返回-1

書寫細(xì)節(jié):

  1. 創(chuàng)建字節(jié)輸入流對(duì)象

    • 如果文件不存在就直接報(bào)錯(cuò)

  2. 讀取數(shù)據(jù)

    • 一次讀一個(gè)字節(jié)讀出來(lái)的數(shù)據(jù)是在ASCII上對(duì)應(yīng)的數(shù)字,空格為32

    • 讀到文件末尾了read方法返回-1

  3. 釋放資源

    • 先開的流最后關(guān)閉

注意:read讀取一個(gè)數(shù)據(jù)移動(dòng)一次指針,所以要注意拿一個(gè)變量接受fis.read()結(jié)果

一次讀取多個(gè)字節(jié):

一般創(chuàng)建1024的整數(shù)倍的數(shù)組

捕獲異常

JDK7中捕獲異常的寫法

JDK9中捕獲異常的寫法

實(shí)際開發(fā)中,異常都是拋出處理,上述了解即可

字符集

計(jì)算機(jī)中,任意數(shù)據(jù)都是以二進(jìn)制形式存儲(chǔ)的,8位為1個(gè)字節(jié),存儲(chǔ)英文,一個(gè)字節(jié)就足以

  1. GB2312字符集:1980年發(fā)布,1981年5月1日實(shí)施的簡(jiǎn)體中文漢字編碼國(guó)家標(biāo)準(zhǔn),收錄7445個(gè)圖形字符,包含6763個(gè)簡(jiǎn)體漢字(臺(tái)灣用不了)

  2. BIG5字符:太短地區(qū)繁體中文標(biāo)準(zhǔn)字符集,共收錄13053個(gè)中文字,1984年實(shí)施

  3. GBK字符集(國(guó)標(biāo)擴(kuò)):2000年3月17日發(fā)布,收錄21003個(gè)漢字,包含國(guó)家標(biāo)準(zhǔn)GB13000-1中的全部中日韓漢字和BIG5編碼中的所有漢字Windows系統(tǒng)默認(rèn)使用的就是GBK,不過(guò)系統(tǒng)顯示為ANSI

  4. Unicode字符集:國(guó)際標(biāo)準(zhǔn)字符集,它將世界各種語(yǔ)言的每個(gè)字符定義唯一的編碼,以滿足跨語(yǔ)言,跨平臺(tái)的文本信息轉(zhuǎn)換

GBK完全兼容ASCII,英文用一個(gè)字節(jié)存儲(chǔ),漢字用兩個(gè)字節(jié)存儲(chǔ) 高位字節(jié)二進(jìn)制一定以1開頭,轉(zhuǎn)成十進(jìn)制后是一個(gè)負(fù)數(shù)(為了與英文區(qū)分開)

UFT-16編碼規(guī)則:用2-4個(gè)字節(jié)保存 UTF-32編碼規(guī)則:固定使用4個(gè)字節(jié)保存UTF-8編碼規(guī)則:用1-4個(gè)字符保存英文字母1個(gè)字節(jié),簡(jiǎn)體中文3個(gè)字節(jié)

UTF-8不是一個(gè)字符集!!!而是一個(gè)編碼規(guī)則,Unicode才是字符集

亂碼出現(xiàn)原因

  1. 字節(jié)流一次只讀取一個(gè)字節(jié),所以例如三個(gè)字節(jié)的漢字會(huì)被截?cái)?每一段都是負(fù)數(shù),而在ASCII表中沒(méi)有負(fù)數(shù)

  2. 編碼和解碼方式不統(tǒng)一

所以不要用字節(jié)流讀取文本文件,但是用字節(jié)流拷貝文本文件不會(huì)亂碼

編碼與解碼

Java中的編碼方法

Java中的解碼方法

字符流

字符流的底層就是字節(jié)流

字符流=字節(jié)流+字符集

特點(diǎn):

  • 輸入流:一次讀一個(gè)字節(jié),遇到中文時(shí),一次讀多個(gè)字節(jié)

  • 輸出流:底層會(huì)把數(shù)據(jù)按照指定的編碼方式進(jìn)行編碼,變成字節(jié)再寫到文件中

使用場(chǎng)景:對(duì)純文本文件進(jìn)行讀寫操作

FileReader

  1. 創(chuàng)建字符輸入流對(duì)象

  1. 如果文件不存在直接報(bào)錯(cuò)

  2. 讀取數(shù)據(jù)

  1. 細(xì)節(jié)1:按字節(jié)進(jìn)行讀取,讀到中文一次讀多個(gè)字節(jié),讀取后解碼返回一個(gè)整數(shù)

    細(xì)節(jié)2:讀到文件末尾了,read方法返回-1

  2. 釋放資源

不帶參數(shù)的read方法:

read()細(xì)節(jié):

  1. read()默認(rèn)也是一個(gè)字節(jié)一個(gè)字節(jié)地讀取的,如果遇到中文就會(huì)一次讀取多個(gè)

  2. 在讀取之后,方法的底層還會(huì)進(jìn)行解碼并轉(zhuǎn)成十進(jìn)制 最終把這個(gè)十進(jìn)制作為返回值 這個(gè)十進(jìn)制的數(shù)據(jù)也表示在字符集上的數(shù)字 英文:文件里面二進(jìn)制數(shù)據(jù) 0110 0001 read方法進(jìn)行讀取,解碼并轉(zhuǎn)為十進(jìn)制97 中文:文件里面的二進(jìn)制數(shù)據(jù)11100110 10110001 100010001 read方法進(jìn)行讀取,解碼并轉(zhuǎn)成十進(jìn)制27721 我想看到中文漢字,就是把這些十進(jìn)制數(shù)據(jù)再進(jìn)行強(qiáng)轉(zhuǎn)(char)就行了

帶參數(shù)的read方法:

read(chars):讀取數(shù)據(jù),解碼,強(qiáng)轉(zhuǎn)三步合并了,把強(qiáng)轉(zhuǎn)之后的字符放到數(shù)組當(dāng)中

read(chars)可以看做空參的read+強(qiáng)制類型轉(zhuǎn)換

FileWriter

  1. 創(chuàng)建字符輸出流對(duì)象

    • 參數(shù)是字符串表示的路徑或者File對(duì)象都可以

    • 如果文件不存在會(huì)創(chuàng)建一個(gè)新的文件,但要保證父級(jí)路徑存在

    • 如果文件已存在則會(huì)清空文件,如果不想清空可以打開續(xù)寫開關(guān)

  2. 寫數(shù)據(jù)

    • 如果write方法的參數(shù)是整數(shù),但是實(shí)際上寫到本地文件中的是整數(shù)在字符集上對(duì)應(yīng)的字符

  3. 釋放資源

字符流底層原理

  1. 創(chuàng)建字符流輸入對(duì)象

    • 底層:關(guān)聯(lián)文件,并創(chuàng)建緩沖區(qū)(長(zhǎng)度為8192的字節(jié)數(shù)組)

  2. 讀取數(shù)據(jù)

    • 底層:

    1. 判斷緩沖區(qū)中是否有數(shù)據(jù)可以讀取

    2. 如果緩沖區(qū)中沒(méi)有數(shù)據(jù),就從文件中獲取數(shù)據(jù)撞到緩沖區(qū)中,如果文件中也沒(méi)有數(shù)據(jù)了,返回-1

    3. 緩沖區(qū)有數(shù)據(jù)就從緩沖區(qū)中讀取 空參的read方法:一次讀取一個(gè)字節(jié),遇到中文一次讀多個(gè)字節(jié),把字節(jié)解碼并轉(zhuǎn)成十進(jìn)制返回 有參的read方法:把讀取字節(jié),解碼,強(qiáng)轉(zhuǎn)三步合并了,強(qiáng)轉(zhuǎn)之后的字符放到數(shù)組中

flush刷新:刷新之后,還可以繼續(xù)往文件中寫出數(shù)據(jù)

close關(guān)流:斷開通道,無(wú)法再往文件中寫出數(shù)據(jù)

Java IO流-基本流的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
南召县| 汽车| 县级市| 咸阳市| 澳门| 三门县| 巴东县| 莲花县| 婺源县| 清镇市| 西城区| 广平县| 太和县| 武穴市| 吴川市| 合江县| 金川县| 南阳市| 玉树县| 彰化县| 寻甸| 准格尔旗| 祁阳县| 湖南省| 玉溪市| 简阳市| 芒康县| 文山县| 庄浪县| 游戏| 大丰市| 都江堰市| 嘉祥县| 武平县| 阆中市| 阿拉尔市| 越西县| 西和县| 舟曲县| 长宁区| 合作市|