Java IO流操作規(guī)律

源:鍵盤錄入蜂奸。

目的:控制臺。

需求:想把鍵盤錄入的數(shù)據(jù)存儲到一個文件中硬萍。
源:鍵盤扩所。
目的:文件。

需求:想要將一個文件的數(shù)據(jù)打印在控制臺上朴乖。
源:文件
目的:控制臺拴还。

流操作的基本規(guī)律:

最痛苦的就是流對象有很多号坡,不知道該用哪一個语御。
通過三個明確來完成柄慰。

  • 1.明確源和目的。
    源:輸入流哩都。InputStream Reader
    目的:輸出流。OutputStream Writer
  • 2.操作的數(shù)據(jù)是否是純文本婉徘。
    是:字符流漠嵌。
    不是:字節(jié)流。
  • 3.當(dāng)體系明確后盖呼,再明確要使用哪個具體的對象儒鹿。
    通過設(shè)備來進(jìn)行區(qū)分:
    源設(shè)備:內(nèi)存,硬盤几晤,鍵盤
    目的設(shè)備:內(nèi)存约炎,硬盤,控制臺蟹瘾。

將一個文本文件中數(shù)據(jù)存儲到另一個文件中圾浅,復(fù)制文件。

源:因為是源憾朴,所以使用讀取流狸捕。InputStream Reader是不是操作文本文件。
是众雷!這時就可以選擇Reader灸拍,這樣體系就明確了做祝。

接下來明確要使用該體系中的哪個對象。
明確設(shè)備:硬盤鸡岗。上一個文件混槐。
Reader體系中可以操作文件的對象是FileReader

是否需要提高效率:是!加入Reader體系中緩沖區(qū) BufferedReader轩性。
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);

目的:OutputStream Writer
是否是純文本声登。
是!Writer炮姨。
設(shè)備:硬盤捌刮,一個文件。
Writer體系中可以操作文件的對象FileWriter舒岸。
是否需要提高效率:是绅作!。加入Writer體系中緩沖區(qū)BufferedWriter蛾派。

FileWriter fw = new FileWriter("b.txt");
BufferedWriter bufw = new BufferedWriter(fw);

練習(xí):將一個圖片文件數(shù)據(jù)存儲到另一個文件中俄认。復(fù)制文件,要按照以上格式自己完成三個明確洪乍。


1.gif

Snip20190921_42.png

需求:將鍵盤錄入的數(shù)據(jù)保存到一個文件中眯杏。這個需求中有源和目的都存在。

那么分析分析

源:InputStream Reader
是不是純文本壳澳?是岂贩!Reader
設(shè)備:鍵盤。對應(yīng)的對象是System.in巷波。
不是選擇Reader嗎萎津?System.in對應(yīng)的不是字節(jié)流嗎?

為了操作鍵盤的文本數(shù)據(jù)方便抹镊。轉(zhuǎn)成字符流按照字符串操作是最方便的锉屈。
所以既然明確了Reader,那么就將System.in轉(zhuǎn)換成Reader垮耳。
用了Reader體系中轉(zhuǎn)換流颈渊,InputStreamReader

InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率嗎?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);

目的:OutputStream Writer
是否是純文本终佛?是俊嗽!Writer。
設(shè)備:硬盤铃彰。一個文件乌询。使用FileWriter。
FileWriter fw = new FileWriter("c.txt");
需要提高效率嗎豌研?需要妹田。
BufferedWriter bufw = new BufferedWriter(fw);

擴(kuò)展一下唬党,想要把錄入的數(shù)據(jù)按照指定的編碼表(utf-8),將數(shù)據(jù)存到文件中。
目的:OutputStream Writer
是否是純文本鬼佣?是驶拱!Writer。
設(shè)備:硬盤晶衷。一個文件蓝纲。使用FileWriter。
但是FileWriter是使用的默認(rèn)編碼表晌纫。GBK税迷。

但是存儲時,需要加入指定編碼表utf-8锹漱。而指定的編碼表只有轉(zhuǎn)換流可以指定箭养。
所以要使用的對象是OutputStreamWriter。
而該轉(zhuǎn)換流對象要接收一個字節(jié)輸出流哥牍。而且還可以操作的文件的字節(jié)輸出流毕泌。FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");

需要提高效率嗎?需要嗅辣。
BufferedWriter bufw = new BufferedWriter(osw);
所以撼泛,記住。轉(zhuǎn)換流什么時候使用澡谭。字符和字節(jié)之間的橋梁愿题,通常,涉及到字符編碼轉(zhuǎn)換時蛙奖,需要用到轉(zhuǎn)換流潘酗。

import java.io.*;

public class TransStreamDemo2 {
    public static void main(String[] args) throws IOException
    {
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d.txt")));
        String line = null;
        while ((line = bufr.readLine())!=null)
        {
            if ("over".equals(line))
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }
        bufr.close();
    }
}
2.gif

Snip20190921_46.png

添加參數(shù)"GBK","UTF-8"分別運(yùn)行外永。得到d1.txt,d2.txt文件崎脉。發(fā)現(xiàn)不添加參數(shù)和添加參數(shù)UTF-8得到的文件大小一致拧咳,所以得出默認(rèn)是UTF-8編碼伯顶。通過Properties getProperties();得出sun.jnu.encoding::UTF-8。

import java.io.*;

public class TransStreamDemo2 {
    public static void main(String[] args) throws IOException
    {
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d1.txt"),"GBK"));
        String line = null;
        while ((line = bufr.readLine())!=null)
        {
            if ("over".equals(line))
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }
        bufr.close();
    }
}
Snip20190921_47.png
import java.io.*;

public class TransStreamDemo2 {
    public static void main(String[] args) throws IOException
    {
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d2.txt"),"UTF-8"));
        String line = null;
        while ((line = bufr.readLine())!=null)
        {
            if ("over".equals(line))
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }
        bufr.close();
    }
}
Snip20190921_48.png

練習(xí):將一個文本數(shù)據(jù)打印在控制臺上骆膝,要按照以上格式自己完成三個明確祭衩。

改變標(biāo)準(zhǔn)輸入輸出設(shè)備

import java.io.*;

public class TransStreamDemo3 {
    public static void main(String[] args) throws IOException
    {
        System.setIn(new FileInputStream("DateDemo.java"));
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

        String line = null;
        while ((line = bufr.readLine())!=null)
        {
            if ("over".equals(line))
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }
        bufr.close();
    }
}
//輸出
IMPORT JAVA.TEXT.SIMPLEDATEFORMAT;
IMPORT JAVA.UTIL.DATE;

PUBLIC CLASS DATEDEMO {
    PUBLIC STATIC VOID MAIN(STRING[] ARGS) {
        DATE D = NEW DATE();
        SYSTEM.OUT.PRINTLN(D);//打印的時間看不懂,希望有些格式

        //將模式封裝到SIMPLEDATEFORMAT對象中
        SIMPLEDATEFORMAT SDF = NEW SIMPLEDATEFORMAT("YYYY年MM月DD日E HH:MM:SS");
        //調(diào)用FORMAT方法讓模式格式化指定DATE對象
        STRING TIME = SDF.FORMAT(D);
        SYSTEM.OUT.PRINTLN("TIME="+TIME);
    }
}
import java.io.*;

public class TransStreamDemo4 {
    public static void main(String[] args) throws IOException
    {
//        System.setIn(new FileInputStream("DateDemo.java"));

        System.setOut(new PrintStream("zz.txt"));
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

        String line = null;
        while ((line = bufr.readLine())!=null)
        {
            if ("over".equals(line))
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }
        bufr.close();
    }
}
3.gif

Snip20190921_50.png

異常的日志信息

import java.io.IOException;
import java.io.PrintStream;

public class ExceptionInfo {
    public static void main(String[] args) throws IOException
    {
        try
        {
           int[] arr = new int[2];
           System.out.println(arr[3]);
        }catch (Exception e)
        {
            e.printStackTrace(new PrintStream("a.txt"));
        }
    }
}
Snip20190921_51.png
import java.io.IOException;
import java.io.PrintStream;

public class ExceptionInfo {
    public static void main(String[] args) throws IOException
    {
        try
        {
           int[] arr = new int[2];
           System.out.println(arr[3]);
        }catch (Exception e)
        {
            System.setOut(new PrintStream("exception.log"));
            e.printStackTrace(System.out);
        }
    }
}
Snip20190921_53.png
import java.io.IOException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionInfo {
    public static void main(String[] args) throws IOException
    {
        try
        {
           int[] arr = new int[2];
           System.out.println(arr[3]);
        }catch (Exception e)
        {
            try
            {
               Date d = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy--MM--dd HH:mm:ss");
                String s = sdf.format(d);
                PrintStream ps = new PrintStream("exception.log");
                ps.println(s);
                System.setOut(ps);
            }catch (IOException ex)
            {
                throw new RuntimeException("日志文件創(chuàng)建失敗");
            }
            e.printStackTrace(System.out);
        }
    }
}
Snip20190921_54.png

輸出系統(tǒng)信息

import java.io.IOException;
import java.io.PrintStream;
import java.util.Properties;

public class SystemInfo {
    public static void main(String[] args) throws IOException
    {
        Properties prop = System.getProperties();
        //System.out.println(prop);
        prop.list(new PrintStream("sysinfo.txt"));
    }
}
Snip20190921_59.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阅签,一起剝皮案震驚了整個濱河市掐暮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌政钟,老刑警劉巖路克,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樟结,死亡現(xiàn)場離奇詭異,居然都是意外死亡精算,警方通過查閱死者的電腦和手機(jī)瓢宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灰羽,“玉大人驮履,你說我怎么就攤上這事×溃” “怎么了玫镐?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怠噪。 經(jīng)常有香客問我恐似,道長,這世上最難降的妖魔是什么舰绘? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任蹂喻,我火速辦了婚禮,結(jié)果婚禮上捂寿,老公的妹妹穿的比我還像新娘口四。我一直安慰自己,他們只是感情好秦陋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布蔓彩。 她就那樣靜靜地躺著,像睡著了一般驳概。 火紅的嫁衣襯著肌膚如雪赤嚼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天顺又,我揣著相機(jī)與錄音更卒,去河邊找鬼。 笑死稚照,一個胖子當(dāng)著我的面吹牛蹂空,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播果录,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼上枕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弱恒?” 一聲冷哼從身側(cè)響起辨萍,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎返弹,沒想到半個月后锈玉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爪飘,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年拉背,在試婚紗的時候發(fā)現(xiàn)自己被綠了悦施。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡去团,死狀恐怖抡诞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情土陪,我是刑警寧澤昼汗,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站鬼雀,受9級特大地震影響顷窒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜源哩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一鞋吉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧励烦,春花似錦谓着、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屉栓,卻和暖如春舷蒲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背友多。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工牲平, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人域滥。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓纵柿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骗绕。 傳聞我的和親對象是個殘疾皇子藐窄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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

  • 五资昧、IO流 1酬土、IO流概述 (1)用來處理設(shè)備(硬盤,控制臺格带,內(nèi)存)間的數(shù)據(jù)撤缴。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 506評論 0 0
  • 概述 計算機(jī)并不區(qū)分二進(jìn)制文件與文本文件刹枉。所有的文件都是以二進(jìn)制形式來存儲的,因此屈呕,從本質(zhì)上說微宝,所有的文件都是二進(jìn)...
    奮斗的老王閱讀 1,333評論 0 51
  • 1,源:鍵盤錄入。目的:控制臺虎眨。 2蟋软,需求:想把鍵盤錄入的數(shù)據(jù)存儲到一個文件中。源:鍵盤嗽桩。目的:文件岳守。 3,需求:...
    menmo_O閱讀 502評論 0 0
  • import java.io.BufferedReader; import java.io.BufferedWri...
    大蝦咪閱讀 173評論 0 0
  • 高考與我有什么關(guān)系碌冶? 高考與我屁的關(guān)系都沒有湿痢。 今天已經(jīng)開始高考了。 這兩天打開手機(jī)映入眼簾的都是關(guān)于高考的消息扑庞。...
    郭三木_閱讀 283評論 0 1