Java學(xué)習(xí)筆記 - 第022天

每日要點(diǎn)

概要

兩種對(duì)稱性

字節(jié) 字符
InputStream Reader
OutputStream Writer
輸入 輸出
InputStream OutputStream
Reader Writer
read() write()

兩種設(shè)計(jì)模式
1.裝潢模式 - 過濾流
2.適配器模式 - 轉(zhuǎn)換流

三種流
1.數(shù)據(jù)流(原始流)
2.過濾流(處理流)
2.轉(zhuǎn)換流(編碼轉(zhuǎn)換)

原始流

FileOutputSteam - 指定文件作為輸出的目的地 - 數(shù)據(jù)流(原始流)

過濾流

PrintStream - 本身沒有輸出的目的地要依賴數(shù)據(jù)流才能使用 - 過濾流(處理流)
過濾流通常都比數(shù)據(jù)流擁有更多的方法方便對(duì)流進(jìn)行各種的操作

System中的in和out的兩個(gè)流可以進(jìn)行重定向
System.setOut(out);
例子1:99乘法表

    public static void main(String[] args) {
        try (PrintStream out = new PrintStream(new FileOutputStream("c:/99.txt"))) {    
    //  try (PrintStream out = new PrintStream("c:/99.txt")) {  
            // System中的in和out的兩個(gè)流可以進(jìn)行重定向
            // System.setOut(out);
            for (int i = 1; i <= 9; i++) {
                for (int j = 1; j <= i; j++) {
                //  System.out.printf("%d*%d=%d\t", i, j, i * j);
                    out.printf("%d*%d=%d\t", i, j, i * j);
                }
            //  System.out.println();
                out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

例子2:
其中小知識(shí):如何在類路徑下取資源文件:

    public static void main(String[] args) throws InterruptedException {
        // 如何在類路徑下取資源文件
        ClassLoader loader = Test01.class.getClassLoader();
        InputStream in = loader.getResourceAsStream("resources/致橡樹.txt");
    //  try (Reader reader = new FileReader("c:/致橡樹.txt")) {
        try (Reader reader = new InputStreamReader(in)) {
            BufferedReader br = new BufferedReader(reader);
        //  LineNumberReader lineNumberReader = new LineNumberReader(reader);
            String str;
            while ((str = br.readLine()) != null) {
        //  while ((str = lineNumberReader.readLine()) != null) {
        //      System.out.print(lineNumberReader.getLineNumber());
                System.out.println(str);
                Thread.sleep(1000);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

轉(zhuǎn)換流

轉(zhuǎn)換流 - 將字節(jié)流適配成字符流 (實(shí)現(xiàn)從字節(jié)到字符的轉(zhuǎn)換)
如果應(yīng)用程序中需要做編碼轉(zhuǎn)換(將8位編碼轉(zhuǎn)換成16位編碼)就需要使用轉(zhuǎn)換流
例子1:普通方法

    public static void main(String[] args) {
        System.out.print("請(qǐng)輸入: ");
        byte[] buffer = new byte[1024];
        try {
            int totalBytes = System.in.read(buffer);
            String str = new String(buffer, 0, totalBytes);
            int endIndex = str.indexOf("\r\n");
            if (endIndex != -1) {
                str = str.substring(0, endIndex);
            }
            int a = Integer.parseInt(str);
        //  System.out.println(str.toUpperCase());
            System.out.println(a > 5);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

例子2:轉(zhuǎn)換流 不使用Scanner從鍵盤輸入讀取數(shù)據(jù)

    public static void main(String[] args) {
        System.out.print("請(qǐng)輸入: ");
        try {
            // 轉(zhuǎn)換流 - 將字節(jié)流適配成字符流 (實(shí)現(xiàn)從字節(jié)到字符的轉(zhuǎn)換)
            // 如果應(yīng)用程序中需要做編碼轉(zhuǎn)換(將8位編碼轉(zhuǎn)換成16位編碼)就需要使用轉(zhuǎn)換流
            InputStreamReader inputReader = new InputStreamReader(System.in);
            BufferedReader bufferedReader = new BufferedReader(inputReader);
            String str;
            while ((str = bufferedReader.readLine()) != null) {
                System.out.println(str.toUpperCase());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

序列化和反序列化

把對(duì)象寫入到流中 - 序列化(serialization)
串行化/歸檔/腌咸菜

從流中讀取對(duì)象 - 反序列化(反串行化/解歸檔)

serialVersionUID 相當(dāng)于版本號(hào)
被transient修飾的屬性不參與系列化和反序列化
private transient String tel;
注意:如果學(xué)生對(duì)象要支持序列化操作那么學(xué)生對(duì)象關(guān)聯(lián)的其他對(duì)象也要支持序列化

例子1:實(shí)現(xiàn)對(duì)學(xué)生類和車類序列化保存對(duì)象為文件净薛,再反序列化讀取
學(xué)生類:

public class Student implements Serializable{
    private static final long serialVersionUID = 1L;  // serialVersionUID 相當(dāng)于版本號(hào)
    private String name;
    private int age;
    // 被transient修飾的屬性不參與系列化和反序列化
    private transient String tel;
    // 如果學(xué)生對(duì)象要支持序列化操作那么學(xué)生對(duì)象關(guān)聯(lián)的其他對(duì)象也要支持序列化
    private Car car;
        
    public Student(String name, int age, String tel) {
        this.name = name;
        this.age = age;
        this.tel = tel;
    }
    
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "name=" + name + ", age=" + age + 
                ", tel=" + tel + "," + car.toString();
    }   
}

車類:

public class Car implements Serializable{
    private static final long serialVersionUID = 1L;
    private String brand;
    private int maxSpeed;
    
    public Car(String brand, int maxSpeed) {
        this.brand = brand;
        this.maxSpeed = maxSpeed;
    }
    
    @Override
    public String toString() {
        return "car=[brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
    }   
}

序列化:

    public static void main(String[] args) {
        Student student = new Student("王大錘", 18, "13521324325");
        student.setCar(new Car("QQ", 128));
        System.out.println(student);
        try (OutputStream out = new FileOutputStream("c:/stu.data")) {
            ObjectOutputStream oos = new ObjectOutputStream(out);
            oos.writeObject(student);
            System.out.println("存檔成功!");
        } catch (IOException e) { 
            e.printStackTrace();
        }
    }

反序列化:

    public static void main(String[] args) {
        try (InputStream in = new FileInputStream("c:/stu.data")) {
            ObjectInputStream ois = new ObjectInputStream(in);
            Object object = ois.readObject();
            System.out.println(object);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

昨日作業(yè)講解

  • 作業(yè)1:九九乘法表文件輸出(普通方法)
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("c:/九九表.txt")) {
            for (int i = 1; i <= 9; i++) {
                for (int j = 1; j <= i; j++) {
                    String str = String.format("%d*%d=%d\t", i, j, i * j);
                    writer.write(str);
                }
                writer.write("\r\n");
            }
            System.out.println("程序執(zhí)行成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 作業(yè)2:寫一個(gè)方法實(shí)現(xiàn)文件拷貝功能
    public static void fileCopy(String source, String target) throws IOException {
        try (InputStream in = new FileInputStream(source);
                OutputStream out = new FileOutputStream(target)) {  
            byte[] buffer = new byte[512];
            int totalBytes;
            while ((totalBytes = in.read(buffer)) != -1) {
                out.write(buffer, 0, totalBytes);
            }
            
        }
    }
    
    public static void main(String[] args) {
        try {
            long start = System.currentTimeMillis();
            fileCopy("C:/Users/Administrator/Downloads/YoudaoDict.exe", "C:/Users/Administrator/Desktop");
            long end = System.currentTimeMillis();
            System.out.println((end - start) + "ms");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

作業(yè)

  • **作業(yè)1:建一個(gè)文本文件 寫很多話 做一個(gè)窗口 隨機(jī)顯示一句話 點(diǎn)一下?lián)Q一句 **
    隨機(jī)文本類:
public class RandomText {
    private List<String> list = new ArrayList<>();
    private String str;
    private int totalRows;
    private int randomNum;
    
    public RandomText() {
        try {
            this.random();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void random() throws IOException {
        ClassLoader loader = RandomText.class.getClassLoader();
        InputStream in = loader.getResourceAsStream("resources/致橡樹.txt");
        InputStreamReader reader = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(reader);  
        while ((str = br.readLine()) != null) {
            list.add(str);
            totalRows += 1;
        }
    }
    
    public String randomLine() {
            randomNum = (int) (Math.random() * totalRows);
            str = list.get(randomNum);
            return str;
    }
}

窗口類:

public class MyFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    private RandomText rt = new RandomText();
    private JLabel label;

    public MyFrame() {
        this.setTitle("隨機(jī)話");
        this.setSize(350, 200);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        label = new JLabel(rt.randomLine());
        label.setFont(new Font("微軟雅黑", Font.PLAIN, 18));
        this.add(label);
        
        JPanel panel = new JPanel();
        this.add(panel, BorderLayout.SOUTH);
        JButton button = new JButton("換一句");
        button.addActionListener(e -> {
            String command = e.getActionCommand();
            if (command.equals("換一句")) {
                label.setText(rt.randomLine());
            }
        });
        panel.add(button);
    }
    
    public static void main(String[] args) {
        new MyFrame().setVisible(true);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弧腥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沦辙,老刑警劉巖判族,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吝岭,居然都是意外死亡肋联,警方通過查閱死者的電腦和手機(jī)威蕉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄仍,“玉大人韧涨,你說我怎么就攤上這事∥攴保” “怎么了虑粥?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宪哩。 經(jīng)常有香客問我舀奶,道長(zhǎng),這世上最難降的妖魔是什么斋射? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮但荤,結(jié)果婚禮上罗岖,老公的妹妹穿的比我還像新娘。我一直安慰自己腹躁,他們只是感情好桑包,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纺非,像睡著了一般哑了。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烧颖,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天弱左,我揣著相機(jī)與錄音,去河邊找鬼炕淮。 笑死拆火,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播们镜,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼币叹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了模狭?” 一聲冷哼從身側(cè)響起颈抚,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚼鹉,沒想到半個(gè)月后贩汉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡反砌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年雾鬼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴树。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡策菜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酒贬,到底是詐尸還是另有隱情又憨,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布锭吨,位于F島的核電站蠢莺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏零如。R本人自食惡果不足惜躏将,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望考蕾。 院中可真熱鬧祸憋,春花似錦、人聲如沸肖卧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塞帐。三九已至拦赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葵姥,已是汗流浹背荷鼠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榔幸,地道東北人颊咬。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓务甥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喳篇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敞临,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)麸澜,斷路器挺尿,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法炊邦,內(nèi)部類的語法编矾,繼承相關(guān)的語法,異常的語法馁害,線程的語...
    子非魚_t_閱讀 31,581評(píng)論 18 399
  • 一窄俏、 1、請(qǐng)用Java寫一個(gè)冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨(dú)云閱讀 1,348評(píng)論 0 6
  • 一碘菜、流的概念和作用凹蜈。 流是一種有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合忍啸,是對(duì)數(shù)據(jù)傳輸?shù)目偝苫虺橄笱鎏埂<磾?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,018評(píng)論 2 95
  • 昨天是周末,三姊妹決定讓孩子們聚聚计雌。 姐姐家是兒子悄晃,在北京上大學(xué)。我家是女兒凿滤,在廈門上大學(xué)妈橄,妹妹家是女兒,今年...
    心際流塵閱讀 265評(píng)論 0 0