Java I/O流

1.簡介

1.1繼承結構

in/out相對于程序而言的輸入(讀取)和輸出(寫出)的過程爆雹。
在Java中愕鼓,根據處理的數據單位不同钙态,分為字節(jié)流和字符流菇晃。

java.io包:
File

字節(jié)流:針對二進制文件
InputStream
--FileInputStream
--BufferedInputStream
--ObjectInputStream
OutputStream
--FileOutputStream
--BufferedOutputStream
--ObjectOutputStream

字符流:針對文本文件册倒。讀寫容易發(fā)生亂碼現象,在讀寫時最好指定編碼集為utf-8
Reader
--FileReader
--BufferedReader
--InputStreamReader
--PrintWriter/PrintStream
Writer
--FileWriter
--BufferedWriter
--OutputStreamWriter

1.2流的概念

  • 數據的讀寫抽象成數據磺送,在管道中流動灿意。
  • 流只能單方向流動
  • 輸入流用來讀取in
  • 輸出流用來寫出Out
  • 數據只能從頭到尾順序的讀寫一次


2.File文件流

2.1 概述

封裝一個磁盤路徑字符串崇呵,對這個路徑可以執(zhí)行一次操作。
可以用來封裝文件路徑荒辕、文件夾路徑犹褒、不存在的路徑。

2.2 創(chuàng)建對象

File(String pathname):通過將給定路徑名字符串轉換為抽象路徑名來創(chuàng)建一個新 File 實例化漆。

2.3 常用方法

文件、文件夾屬性
length():文件的字節(jié)量
exists():是否存在疙赠,存在返回true
isFile():是否為文件朦拖,是文件返回true
isDirectory():是否為文件夾,是文件夾返回true
getName():獲取文件/文件夾名
getParent():獲取父文件夾的路徑
getAbsolutePath():獲取文件的完整路徑

創(chuàng)建捍岳、刪除
createNewFile():新建文件睬隶,文件夾不存在會異常,文件已經存在返回false
mkdirs():新建多層不存在的文件夾\a\b\c
mkdir():新建單層不存在的文件夾\a
delete():刪除文件苏潜,刪除空文件夾

文件夾列表
list():返回String[],包含文件名
listFiles():返回File[]贴唇,包含文件對象

2.4 練習:測試常用方法

package cn.tedu.bigdecimal;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
//測試文件流
public class Test2_File {
    public static void main(String[] args) throws IOException {
       //1,創(chuàng)建文件對象
       //參數是具體的路徑飞袋,這個路徑可以是文件路徑也可以是文件夾路徑
       File file = new File("D:\\teach\\1.txt");
       //2巧鸭,測試常用方法
//     文件、文件夾屬性
       System.out.println(file.length());
       System.out.println(file.exists());
       System.out.println(file.isFile());
       System.out.println(file.isDirectory());
       System.out.println(file.getName());
       System.out.println(file.getParent());
       System.out.println(file.getAbsolutePath());
//     創(chuàng)建、刪除
       file = new File("D:\\teach\\2.txt");
       System.out.println(file.createNewFile());//創(chuàng)建不存在的文件P痉簟压鉴!
       file = new File("D:\\teach\\m");
       System.out.println(file.mkdir());//創(chuàng)建不存在的單級文件夾!!
       file = new File("D:\\teach\\o");
       System.out.println(file.mkdirs());//創(chuàng)建不存在的多級文件夾M裨住心包!
       System.out.println(file.delete());//刪除文件或者刪除空的文件夾
//     文件夾列表
       file = new File("D:\\teach\\a");
       String[] names = file.list();
       //列出文件夾中的所有文件的  名稱
       System.out.println(Arrays.toString(names));
        File[] fs = file.listFiles();
       //列出文件夾中的所有文件的 文件對象
       System.out.println(Arrays.toString(fs));
    }
}

3.字節(jié)流讀取

字節(jié)流是由字節(jié)組成的,字符流是由字符組成的. Java里字符由兩個字節(jié)組成.字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是痕惋,主要用在處理二進制數據娃殖。
流式傳輸主要指將整個音頻和視頻及三維媒體等多媒體文件經過特定的壓縮方式解析成一個個壓縮包,由視頻服務器向用戶計算機順序或實時傳送堕虹。在采用流式傳輸方式的系統(tǒng)中芬首,用戶不必像采用下載方式那樣等到整個文件全部下載完畢,而是只需經過幾秒或幾十秒的啟動延時即可在用戶的計算機上利用解壓設備對壓縮的A/V郁稍、3D等多媒體文件解壓后進行播放和觀看。此時多媒體文件的剩余部分將在后臺的服務器內繼續(xù)下載昼钻。

3.1 InputStream抽象類

此抽象類是表示字節(jié)輸入流的所有類的超類/抽象類封寞。

常用方法:
abstract  int read():從輸入流中讀取數據的下一個字節(jié)仅财。
int read(byte[] b):從輸入流中讀取一定數量的字節(jié)盏求,并將其存儲在緩沖區(qū)數組 b 中亿眠。
int read(byte[] b, int off, int len):將輸入流中最多 len 個數據字節(jié)讀入 byte 數組磅废。
void close():關閉此輸入流并釋放與該流關聯的所有系統(tǒng)資源。

3.2 FileInputStream子類

直接插在文件上拯勉,直接讀取文件數據宫峦。

創(chuàng)建對象:
FileInputStream(File file)
通過打開一個到實際文件的連接來創(chuàng)建一個 FileInputStream,該文件通過文件系統(tǒng)中的 File 對象 file 指定导绷。
FileInputStream(String pathname)
通過打開一個到實際文件的連接來創(chuàng)建一個 FileInputStream妥曲,該文件通過文件系統(tǒng)中的路徑名 name 指定。

3.3 BufferedInputStream子類

BufferedInputStream 為另一個輸入流添加一些功能檐盟,即緩沖輸入以及支持 mark 和 reset 方法的能力。在創(chuàng)建 BufferedInputStream 時箱玷,會創(chuàng)建一個內部緩沖區(qū)數組(默認8M大小)陌宿。在讀取或跳過流中的字節(jié)時,可根據需要從包含的輸入流再次填充該內部緩沖區(qū)舶得,一次填充多個字節(jié)爽蝴。

創(chuàng)建對象:
BufferedInputStream(InputStream in)
創(chuàng)建一個 BufferedInputStream 并保存其參數,即輸入流 in九孩,以便將來使用发框。

4.字符流讀取

常用于處理純文本數據。

4.1Reader抽象類

用于讀取字符流的抽象類。

常用方法:
int read():讀取單個字符仿野。
int read(char[] cbuf):將字符讀入數組她君。
abstract  int read(char[] cbuf, int off, int len):將字符讀入數組的某一部分。
 int read(CharBuffer target):試圖將字符讀入指定的字符緩沖區(qū)鳖枕。
abstract  void close():關閉該流并釋放與之關聯的所有資源桨螺。

4.2FileReader子類

用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節(jié)緩沖區(qū)大小都是適當的魏烫。要自己指定這些值肝箱,可以先在FileInputStream上構造一個InputStreamReader。

創(chuàng)建對象:
FileReader(String fileName)
在給定從中讀取數據的文件名的情況下創(chuàng)建一個新 FileReader呐赡。
FileReader(File file)
在給定從中讀取數據的 File 的情況下創(chuàng)建一個新 FileReader骏融。

4.3 InputStreamReader子類

InputStreamReader 是字節(jié)流通向字符流的橋梁:它使用指定的 charset 讀取字節(jié)并將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定怀泊,或者可以接受平臺默認的字符集误趴。

創(chuàng)建對象:
InputStreamReader(InputStream in, String charsetName)
創(chuàng)建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in)
創(chuàng)建一個使用默認字符集的 InputStreamReader枣申。

4.4 BufferedReader子類

從字符輸入流中讀取文本看杭,緩沖各個字符,從而實現字符熄驼、數組和行的高效讀取烘豹。
可以指定緩沖區(qū)的大小,或者可使用默認的大小携悯。大多數情況下,默認值就足夠大了龟劲。

創(chuàng)建對象:
BufferedReader(Reader in)
創(chuàng)建一個使用默認大小輸入緩沖區(qū)的緩沖字符輸入流轴或。

5.測試:文件的讀取

5.1字節(jié)流讀取

package cn.tedu.in;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
//測試文件的讀取
public class Test5_In {
    public static void main(String[] args) {
       method();// 字節(jié)流讀取
       method2();// 高效的字節(jié)流讀取
    }
    private static void method2() {
       try {
           //BufferedInputStream是高效的讀取流:原因在于底層維護了一個byte[]照雁,默認大小是8*1024字節(jié)是8K。
           // 1饺蚊,創(chuàng)建字節(jié)流的讀取對象
           InputStream in2 = new BufferedInputStream( new FileInputStream("D:\\teach\\1.txt") ) ;
           // 2污呼,開始讀取,read()讀取到數據的末尾燕酷,返回-1
           // 需求:重復的讀取每個字節(jié)
           int b;// 定義變量,記錄讀取到的數據
           while ((b = in2.read()) != -1) {// b!=-1静浴,也就是有數據就一直讀取
              System.out.println(b);
           }
           // 3挤渐,釋放資源
           in2.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
    private static void method() {
       try {
           // 1浴麻,創(chuàng)建字節(jié)流的讀取對象
           // InputStream in = new InputStream();//InputStream是字節(jié)讀取流的父類,但是是抽象類软免,不能new
           // InputStream in = new FileInputStream(new File("D:\\teach\\1.txt"));
           InputStream in2 = new FileInputStream("D:\\teach\\1.txt");
           // 2,開始讀取漓骚,read()讀取到數據的末尾,返回-1
           // System.out.println( in2.read() );//一個字節(jié)一個字節(jié)開始讀
           // System.out.println( in2.read() );
           // System.out.println( in2.read() );
           // System.out.println( in2.read() );//-1噩斟,沒數據了
           // System.out.println( in2.read() );//-1孤个,沒數據了
           // 需求:重復的讀取每個字節(jié)
           int b;// 定義變量,記錄讀取到的數據
           while ((b = in2.read()) != -1) {// b!=-1斥废,也就是有數據就一直讀取
              System.out.println(b);
           }
           // 3给郊,釋放資源
           in2.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
}

5.2字符流讀取

package cn.tedu.in;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
//測試字符流讀取
public class Test6_In2 {
    public static void main(String[] args) {
        method();// 字符流的讀取
       method2();// 高效的字符流讀取
    }
    private static void method2() {
       try {
           //BufferedReader是高效的字符讀取流,原因是荚板,底層維護了一個char[]吩屹,默認的容量也是8*1024字節(jié)就是8K
           // 1、創(chuàng)建對象
           Reader in2 = new BufferedReader( new FileReader("D:\\teach\\1.txt") );
           // 2免绿、開始讀取
           int b;// 定義變量擦盾,記錄讀取到的數據
           while ((b = in2.read()) != -1) {// 只要有數據,就一直讀
              System.out.println(b);
           }
           // 3辽故、釋放資源
           in2.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
    private static void method() {
       try {
           // 1腐碱、創(chuàng)建對象
           // Reader in = new Reader();//Reader是字符流讀取的父類,但是是一個抽象類喂走,不能new
           // Reader in = new FileReader(new File("D:\\teach\\1.txt"));
           Reader in2 = new FileReader("D:\\teach\\1.txt");
           // 2谋作、開始讀取
           // System.out.println(in2.read());//一個字符一個字符讀取
           // System.out.println(in2.read());
           // System.out.println(in2.read());
           // System.out.println(in2.read());//-1,沒數據了
           // System.out.println(in2.read());//-1帖池,沒數據了
           int b;// 定義變量,記錄讀取到的數據
           while ((b = in2.read()) != -1) {// 只要有數據肴甸,就一直讀
              System.out.println(b);
           }
           // 3帮孔、釋放資源
           in2.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末不撑,一起剝皮案震驚了整個濱河市焕檬,隨后出現的幾起案子,更是在濱河造成了極大的恐慌实愚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击喂,死亡現場離奇詭異懂昂,居然都是意外死亡没宾,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門铲敛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会钝,“玉大人,你說我怎么就攤上這事咽弦⌒渤觯” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵闹蒜,是天一觀的道長。 經常有香客問我姥闪,道長砌烁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任避归,我火速辦了婚禮管呵,結果婚禮上,老公的妹妹穿的比我還像新娘账锹。我一直安慰自己坷襟,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布廓奕。 她就那樣靜靜地躺著排抬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪番甩。 梳的紋絲不亂的頭發(fā)上届搁,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音宴胧,去河邊找鬼表锻。 笑死,一個胖子當著我的面吹牛显歧,可吹牛的內容都是我干的。 我是一名探鬼主播范删,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼拷肌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了添忘?” 一聲冷哼從身側響起带猴,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤懈万,失蹤者是張志新(化名)和其女友劉穎会通,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體涕侈,經...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡裳涛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了舷礼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郊闯。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡团赁,死狀恐怖,靈堂內的尸體忽然破棺而出欢摄,到底是詐尸還是另有隱情,我是刑警寧澤析蝴,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吨艇,受9級特大地震影響腾啥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜倘待,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一凸舵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渐苏,春花似錦菇夸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羞芍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谱醇,已是汗流浹背步做。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工全度, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓佑颇,卻偏偏與公主長得像草娜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茬贵,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容

  • 一解藻、流的概念和作用葡盗。 流是一種有順序的,有起點和終點的字節(jié)集合觅够,是對數據傳輸的總成或抽象。即數據在兩設備之間的傳輸...
    布魯斯不吐絲閱讀 10,062評論 2 95
  • Java I/O 流概述Java 流設計理念Java 流類繼承層次字節(jié)輸入流字節(jié)輸出流字符輸入流字符輸出流 ??K...
    狼性代碼人閱讀 538評論 0 2
  • I/O的方式通常分為幾種涂籽,同步阻塞的BIO、同步非阻塞的NIO评雌、異步非阻塞的AIO。 基于不同的IO抽象模型和交互...
    脆皮雞大蝦閱讀 470評論 0 0
  • 參考書:《Java程序設計標準教程》 一、簡介 java輸入輸出功能來自java.io.的抽象類:InputStr...
    奮斗滴猩猩閱讀 841評論 0 0
  • 概念和作用 流:代表任何有能力產出數據的數據源對象或者是有能力接受數據的接收端對象流的本質:數據傳輸搔涝,根據數據傳輸...
    海人為記閱讀 286評論 0 0