IO

IO 復(fù)習(xí)

File


  • 構(gòu)造方法
File(String pathName);
// 通過將給定路徑名字字符串轉(zhuǎn)為抽象路徑來創(chuàng)建一個(gè)新的File實(shí)例叙淌。
File(File parent, String child);
// 根據(jù)parent抽象路徑名和child路徑名字符串創(chuàng)建一個(gè)新的File實(shí)例。

File類的高級(jí)獲取


  • 常用方法
String list();
// 返回一個(gè)字符串?dāng)?shù)組焕窝,這些字符串指定抽象路徑名和文件
File listFiles();
// 返回一個(gè)抽象路徑名數(shù)組姓迅,這些路徑名表示抽象路徑名中的文件
  • 分析過程
private static void searchFiles(File file) {
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isFile) {
                    sysout(f);
                } else {
                    // 重復(fù)上面的邏輯
                    searchFiles(f);
                }
            }
        }
    }
}

FileReader


  • 專門讀取字符數(shù)據(jù)的
public class FileReader extends InputStreamReader
  • 構(gòu)造方法
FileReader(String fileName)
// 在給定從中去讀數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新的FileReader
  • 常用方法
int read(); // 讀取單個(gè)字符传轰。
// 讀取的字符數(shù)蒲祈,如果已到達(dá)流的末尾,則返回 -1
int read(char[] cbuf); // 將字符讀入數(shù)組峭范。
// 讀取的字符數(shù)财松,如果已到達(dá)流的末尾,則返回 -1
  • 示例代碼
Reader reader = new FileReader("c:/1.txt");
char[] buf = new char[5];
// 讀取數(shù)據(jù)到緩沖數(shù)組中
int len;
while ((len = reader.read(buf)) != -1) {
    sysout(new String(buf, 0, len));
}

FileWriter


  • 專門往文件中寫字符數(shù)據(jù)的
public class FileWriter extends OutputStreamWriter
  • 構(gòu)造方法
FileWriter(String fileName); // 根據(jù)給定的文件名構(gòu)造一個(gè)FileWriter對(duì)象。
FileWriter(String fileName, boolean append);// 根據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的boolean值來構(gòu)造FileWriter對(duì)象辆毡。
  • 常用方法
void write(String str); //寫入字符串菜秦。
abstract void write(char[] cbuf, int off, int len) // 寫入字符數(shù)組的某一部分
  • 分析過程
// 寫數(shù)據(jù)
writer.write("我是大魔王");
writer.flush();
// 字符流底層都是有緩沖區(qū)的,當(dāng)我們調(diào)用寫的方法的時(shí)候舶掖,是把數(shù)據(jù)寫入底層的緩沖區(qū)
  • 示例代碼
// 寫字符數(shù)據(jù)
Writer writer = new FileWriter("c:/1.txt");
// 寫操作
writer.write("我是大魔王");
// 字符流的寫是寫入底層的緩沖區(qū)球昨,要把數(shù)據(jù)寫到文件上還需要刷新緩沖區(qū)
// 刷新緩沖區(qū)
writer.flush();// 沒有刷新緩沖區(qū),數(shù)據(jù)是不會(huì)寫入文件的

拷貝文本文件


  • 字節(jié)流
private static void byByteStream() throws Exception {
    InputStream is = new FileInputStream("c:/1.java");
    OutputStream out = new FileOutputStream("c:/2.java");
    int len;
    byte[] buf = new byte[1024];
    while ((len = is.read(buf)) != -1) {
        // 邊讀邊寫
        out.wirte(buf, 0, len);
    }
    // 關(guān)閉資源
    is.close();
    out.close();
}
  • 字符流
private static void byCharStream() throws Exception {
    Reader reader = new FileReader("c:/1.java");
    Writer writer = new FileWriter("c:/2.java");
    char[] cbuf = new char[1024];
    int len;
    while ((len = reader.read(buf)) != -1) {
        writer.write(cbuf, 0, len);
    }
    // 關(guān)閉資源
    reader.close();
    writer.close();
}

字符的編碼和解碼


編碼與解碼之間的轉(zhuǎn)換關(guān)系

編碼:字符-->字節(jié)
解碼:字節(jié)-->字符
他們之間的轉(zhuǎn)換靠的是編碼表

  • String的編碼方法
byte[] getBytes();
// 使用平臺(tái)的默認(rèn)字符集將次String編碼為byte序列眨攘,并將結(jié)果存儲(chǔ)到一個(gè)新的byte數(shù)組中主慰。
byte[] getBytes(String charsetName)
// 使用指定的字符集將次String編碼為byte序列,并將結(jié)果存儲(chǔ)到一個(gè)新的byte數(shù)組中鲫售。
  • String的解碼方式依靠構(gòu)造方法
String(byte[] bytes);
// 通過平臺(tái)的默認(rèn)字符集將指定的byte的數(shù)組共螺,構(gòu)造成一個(gè)新的String。
String(byte[] bytes, String charsetName)
// 通過使用指定的charset解碼指定的byte數(shù)據(jù)情竹,構(gòu)造一個(gè)新的String藐不。

轉(zhuǎn)換流


  • OutputStreamReader--是字符流通向字節(jié)流的橋梁;

  • InputStreamWriter--是字節(jié)流通向字符流的橋梁秦效。

//準(zhǔn)備好輸出
OutputStream out = new FileOutputStream("c:/2.txt");
//把輸出字節(jié)流轉(zhuǎn)變成輸出字符流
Writer writer = new OutputStreamWriter(out, "utf-8");
writer.write("嘿嘿嘿");
writer.close();

InputStream is = new FileInputStream("c:/2.txt");
Reader reader = new InputStreamReader(is, "utf-8");
int read =reader.read();
System.out.println((char) read);
read.close();

字節(jié)緩存流


用得最多的包裝流就是緩存流雏蛮,默認(rèn)內(nèi)部維護(hù)了一個(gè)8KB的緩存區(qū)(能夠有效的減少IO次數(shù),從而提高IO的操作效率)阱州。

BufferedInputStream is = new BufferedInputStream(new FileInputStream("c:/setup.exe"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("c:/1.ext"));
int len;
byte[] buf = new byte[1024];
// 先讀取數(shù)據(jù)挑秉,在寫數(shù)據(jù)
while ((len = is.read(buf)) != -1) {
    out.write(buf, 0, len);
}
// 關(guān)閉資源
is.close();
out.close();

字符緩沖流


public class BufferedReader extends Reader

reader.readLine();可以直接讀取一行數(shù)據(jù)

底層同樣是自帶一個(gè)8K的緩沖區(qū)

從字符輸入流中讀取文本,緩沖各個(gè)字符贡耽,從而實(shí)現(xiàn)字符衷模、數(shù)組和行的高效讀取。

構(gòu)造方法


BufferedReader(Reader in)

  • 創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流
//常用方法
String readLine();// 讀取一個(gè)文本行蒲赂。
public class BufferedWriter extends Writer
//可以直接寫換行阱冶,writer.newLine();
  • 構(gòu)造方法

BufferedWriter(Writer out)

// 常用方法
void newLine();// 寫入一個(gè)行分隔符
  • 示例代碼
// 字符緩沖流
BufferedReader reader = new BufferedReader(new FileReader("c:/1.java"));
BufferedWriter writer = new BufferedWriter(new FileWriter("c:/2.java"));
String data;
// 直接讀取一行數(shù)據(jù)
while ((data = reader.readLine()) != null) {
    writer.write(data);
    // 寫一個(gè)換行符
    writer.newLine();
}
reader.close();
writer.close();

屬性文件


Properties類表示了一個(gè)持久的屬性集。

Properties可保存在流中或者從流中加載滥嘴。

  • 屬性列表中每個(gè)鍵以及對(duì)應(yīng)值都是一個(gè)字符串木蹬。
public class Properties extends Hashtable<Object, Object>
// 這個(gè)類是專門用于操作屬性文件properties的
  • 為什么要使用文件屬性?

1.解除硬編碼若皱,源代碼是要編譯的镊叁。

2.改善程序的結(jié)構(gòu),有利于日后的維護(hù)走触。

  • 構(gòu)造方法

Properties(); 創(chuàng)建一個(gè)無默認(rèn)值得空屬性列表晦譬。

  • 常用方法
void load(InputStream inStream);
// 從流中讀取屬性列表(鍵和元素對(duì))。
String getProperty(String key);
// 用指定的鍵在此屬性列表中搜索屬性互广。
  • 屬性文件的寫法
src=c:/setup.exe
dest=c:/1.exe
  • 示例代碼
// 使用Properties文件
Properties p = new Properties();
// 從流中去讀取屬性的配置信息
InputStream in = new FileInputStream("file.properties");
p.load(in);

// 獲取屬性的值
String src = p.getProperty("src");
InputStream is = new FileInputStream(src);
String dest = p.getProperty("dest");
OutputStream out = new FileOutputStream(dest);

ObjectOutputStream

  • 用途

把內(nèi)存中的對(duì)象輸出到文件或者把文件中保存的對(duì)象輸入到內(nèi)存

  • 目的

為了進(jìn)程之間的數(shù)據(jù)交流

  • 構(gòu)造方法
ObjectOutputStream(OutputStream out);
// 創(chuàng)建寫入指定OutputStream的ObjectOutputStream
  • 重用方法
void writeObject(Object obj);
// 將指定的對(duì)象寫入ObjectOutputStream敛腌。
  • 示例代碼
// 使用對(duì)象的輸出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:/1.txt"));
// 寫數(shù)據(jù)
// 寫出的內(nèi)容不是給人看的卧土,是給機(jī)器看的
User u = new User("羅杰斯", 108);
out.writeObject(u);
// 把內(nèi)存中的對(duì)象寫出到硬盤-->序列化
out.close();
  • 對(duì)象要序列化必須實(shí)現(xiàn)序列化接口
public class User implements Serializable {
    String name;
    int age;
}

ObjectInputStream


序列化與反序列化之間的關(guān)系


把內(nèi)存中的對(duì)象寫入硬盤-->序列化

把硬盤中的對(duì)象讀入內(nèi)存-->反序列化

構(gòu)造方法


ObjectInputStream(InputStream in);
// 創(chuàng)建從指定InputStream讀取的ObjectInpuStream對(duì)象。

內(nèi)存流


ByteArrayOutputStream:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末像樊,一起剝皮案震驚了整個(gè)濱河市尤莺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌生棍,老刑警劉巖颤霎,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涂滴,居然都是意外死亡友酱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門柔纵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粹污,“玉大人,你說我怎么就攤上這事首量。” “怎么了进苍?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵加缘,是天一觀的道長。 經(jīng)常有香客問我觉啊,道長拣宏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任杠人,我火速辦了婚禮勋乾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗡善。我一直安慰自己辑莫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布罩引。 她就那樣靜靜地躺著各吨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袁铐。 梳的紋絲不亂的頭發(fā)上揭蜒,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音剔桨,去河邊找鬼屉更。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洒缀,可吹牛的內(nèi)容都是我干的瑰谜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼似舵!你這毒婦竟也來了脚猾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤砚哗,失蹤者是張志新(化名)和其女友劉穎龙助,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛛芥,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡提鸟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仅淑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片称勋。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涯竟,靈堂內(nèi)的尸體忽然破棺而出赡鲜,到底是詐尸還是另有隱情,我是刑警寧澤庐船,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布银酬,位于F島的核電站,受9級(jí)特大地震影響筐钟,放射性物質(zhì)發(fā)生泄漏揩瞪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一篓冲、第九天 我趴在偏房一處隱蔽的房頂上張望李破。 院中可真熱鬧,春花似錦壹将、人聲如沸嗤攻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屯曹。三九已至,卻和暖如春惊畏,著一層夾襖步出監(jiān)牢的瞬間恶耽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工颜启, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偷俭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓缰盏,卻偏偏與公主長得像涌萤,于是被迫代替她去往敵國和親淹遵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容