java -- 緩衝流、轉換流、序列化流

来源:https://www.cnblogs.com/paopaoT/archive/2023/04/19/17334335.html
-Advertisement-
Play Games

緩衝流 緩衝流, 也叫高效流, 按照數據類型分類: 位元組緩衝流:BufferedInputStream,BufferedOutputStream 字元緩衝流:BufferedReader,BufferedWriter 緩衝流的基本原理,是在創建流對象時,會創建一個內置的預設大小的緩衝區數組,通過緩衝 ...


緩衝流

緩衝流, 也叫高效流, 按照數據類型分類:

  • 位元組緩衝流BufferedInputStreamBufferedOutputStream
  • 字元緩衝流BufferedReaderBufferedWriter

緩衝流的基本原理,是在創建流對象時,會創建一個內置的預設大小的緩衝區數組,通過緩衝區讀寫,減少系統IO次數,從而提高讀寫的效率。

位元組緩衝流

// 構造方法
public BufferedInputStream(InputStream in)
// 創建一個 新的緩衝輸入流
public BufferedOutputStream(OutputStream out)
// 創建一個新的緩衝輸出流。
// 位元組輸出緩衝流
OutputStream out = new BufferedOutputStream(new FileOutputStream("FileAndIoStream\\test\\4.txt"));

out.write("hello world\r\n".getBytes());
out.write("hello world\r\n".getBytes());
out.write("hello world\r\n".getBytes());
out.write("hello world\r\n".getBytes());
out.close();

// 位元組輸入緩衝流
InputStream in = new BufferedInputStream(new FileInputStream("FileAndIoStream\\test\\4.txt"));
byte[] chs = new byte[1024];
int len = 0;
while ((len = in.read(chs)) != -1) {
    System.out.println(new String(chs, 0, len));
}
in.close();

字元緩衝流

// 構造方法
public BufferedReader(Reader in)
// 創建一個 新的緩衝輸入流
public BufferedWriter(Writer out)
// 創建一個新的緩衝輸出流。

特有方法

  • BufferedReader:public String readLine(): 讀一行文字。
  • BufferedWriter:public void newLine(): 寫一行行分隔符,由系統屬性定義符號。
BufferedReader bufferedReader = new BufferedReader(new FileReader("FileAndIoStream\\test\\4.txt"));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
}
bufferedReader.close();

BufferedWriter bw = new BufferedWriter(new FileWriter("FileAndIoStream\\test\\4.txt"));
bw.write("你好");
bw.close();

文本排序練習

3.侍中、侍郎郭攸之、費禕、董允等,此皆良實,志慮忠純,是以先帝簡拔以遺陛下。愚以為宮中之事,事無大小,悉以咨之,然後施行,必得裨補闕漏,有所廣益。
8.願陛下托臣以討賊興復之效,不效,則治臣之罪,以告先帝之靈。若無興德之言,則責攸之、禕、允等之慢,以彰其咎;陛下亦宜自謀,以咨諏善道,察納雅言,深追先帝遺詔,臣不勝受恩感激。
4.將軍向寵,性行淑均,曉暢軍事,試用之於昔日,先帝稱之曰能,是以眾議舉寵為督。愚以為營中之事,悉以咨之,必能使行陣和睦,優劣得所。
2.宮中府中,俱為一體,陟罰臧否,不宜異同。若有作姦犯科及為忠善者,宜付有司論其刑賞,以昭陛下平明之理,不宜偏私,使內外異法也。
1.先帝創業未半而中道崩殂,今天下三分,益州疲弊,此誠危急存亡之秋也。然侍衛之臣不懈於內,忠志之士忘身於外者,蓋追先帝之殊遇,欲報之於陛下也。誠宜開張聖聽,以光先帝遺德,恢弘志士之氣,不宜妄自菲薄,引喻失義,以塞忠諫之路也。
9.今當遠離,臨表涕零,不知所言。
6.臣本布衣,躬耕於南陽,苟全性命於亂世,不求聞達於諸侯。先帝不以臣卑鄙,猥自枉屈,三顧臣於草廬之中,咨臣以當世之事,由是感激,遂許先帝以驅馳。後值傾覆,受任於敗軍之際,奉命於危難之間,爾來二十有一年矣。
7.先帝知臣謹慎,故臨崩寄臣以大事也。受命以來,夙夜憂嘆,恐付托不效,以傷先帝之明,故五月渡瀘,深入不毛。今南方已定,兵甲已足,當獎率三軍,北定中原,庶竭駑鈍,攘除姦凶,興復漢室,還於舊都。此臣所以報先帝而忠陛下之職分也。至於斟酌損益,進盡忠言,則攸之、禕、允之任也。
5.親賢臣,遠小人,此先漢所以興隆也;親小人,遠賢臣,此後漢所以傾頹也。先帝在時,每與臣論此事,未嘗不嘆息痛恨於桓、靈也。侍中、尚書、長史、參軍,此悉貞良死節之臣,願陛下親之信之,則漢室之隆,可計日而待也。
public class test {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("FileAndIoStream\\test\\csb"));
        TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                String num1 = o1.split("\\.")[0];
                String num2 = o2.split("\\.")[0];
                return Integer.parseInt(num1) - Integer.parseInt(num2);
            }
        });

        String line = null;
        while ((line = br.readLine()) != null) {
            set.add(line);
        }
        br.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter("FileAndIoStream\\test\\csb"));
        for (String s : set) {
            bw.write(s);
            bw.newLine();
            bw.flush();
        }
        bw.close();
    }
    public static void mapToSort() throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("FileAndIoStream\\test\\csb"));
        TreeMap<Integer, String> map = new TreeMap<>();
        String line = null;
        while ((line = br.readLine()) != null) {
            String[] split = line.split("\\.");
            map.put(Integer.parseInt(split[0]), line);
        }
        br.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter("FileAndIoStream\\test\\csb"));
        for (Integer integer : map.keySet()) {
            bw.write(map.get(integer));
            bw.newLine();
            bw.flush();
        }
        bw.close();
    }
}

轉換流

由於 FileReader 和 FileWriter 無法指定編碼 僅可使用平臺預設編碼 因此若讀取/寫入其他編碼文件會亂碼

// java.io.InputStreamReader
// 構造方法
public InputStreamReader(InputStream in, String charsetName)
    String charsetName 指定字元集, 不區分大小寫
// java.io.OutputStreamWriter
// 構造方法
public InputStreamReader(OutputStream in, String charsetName)
    String charsetName 指定字元集, 不區分大小寫
Reader r = new InputStreamReader(new FileInputStream("FileAndIoStream\\test\\csbGBK.txt"), "gbk");
char[] chs = new char[1024];
int len = 0;
while ((len = r.read(chs)) != -1) {
    System.out.println(new String(chs, 0, len));
}
r.close();

Writer w = new OutputStreamWriter(new FileOutputStream("FileAndIoStream\\test\\csbGBK.txt",true), "gbk");
w.write("\n11.END");
w.close();

練習

複製文件並轉換編碼

Reader reader = new InputStreamReader(new FileInputStream("FileAndIoStream\\test\\csbGBK.txt"),"gbk");
Writer writer = new OutputStreamWriter(new FileOutputStream("FileAndIoStream\\test\\csbUTF8.txt"));
char[] chars = new char[1024];
len = 0;
while ((len = reader.read(chars)) != -1) {
    writer.write(new String(chars, 0, len));
    writer.flush();
}
reader.close();
writer.close();

序列化

Java 提供了一種對象序列化的機制。用一個位元組序列可以表示一個對象,該位元組序列包含該對象的數據對象的類型對象中存儲的屬性等信息。位元組序列寫出到文件之後,相當於文件中持久保存了一個對象的信息。

反之,該位元組序列還可以從文件中讀取回來,重構對象,對它進行反序列化對象的數據對象的類型對象中存儲的數據信息,都可以用來在記憶體中創建對象。

  • java.io.ObjectOutputStream 類,將Java對象的原始數據類型寫出到文件,實現對象的持久存儲。
  • java.io.ObjectInputStream 反序列化流,將之前使用ObjectOutputStream序列化的原始數據恢復為對象
// 構造方法
public ObjectOutputStream(OutputStream out)
// 創建一個指定OutputStream的ObjectOutputStream
public ObjectInputStream(InputStream in)
// 創建一個指定InputStream的ObjectInputStream
public class Demo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        writeObject();
        readerObject();

    }

    // 序列化
    public static void writeObject() throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("FileAndIoStream\\test\\Person.txt"));
        // 序列化單個對象
        // oos.writeObject(new Person("張三", 17, 1));

        // 序列化多個對象
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("張三",11,1));
        list.add(new Person("李四",15,0));
        list.add(new Person("王五",17,1));
        list.add(new Person("劉六",10,0));

        oos.writeObject(list);
        oos.close();
    }

    // 反序列化
    public static void readerObject() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("FileAndIoStream\\test\\Person.txt"));
        // 反序列化單個對象
        // Person p = (Person) ois.readObject();
        // System.out.println(p);

        // 反序列化多個對象
        Object obj = ois.readObject();
        List<Person> list = (List<Person>) obj;
        for (Person person : list) {
            System.out.println(person);
        }

        ois.close();
    }
}
class Person implements Serializable {
    // 靜態內容不能序列化
    private static String className;
    private String name;
    private int age;
    // transient 關鍵字 瞬態, 不可被序列化
    private transient int sex;
    private static final long serialVersionUID = 1L;

    // 反序列化 不調用構造方法
    public Person() {}
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name, int age, int sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

反序列化時, 若找不到class文件, 則反序列話失敗, 拋出異常 ClassNotFoundException
當jvm反序列化對象時, 能找到class文件, 但在序列化對象後class文件發生了改變, 則反序列化失敗, 拋出異常 InvalidClassException
當類作為Serializable 的實現類初始化時, 會同時生成一個序列號, 反序列化時檢測到序列號不一致

列印流

平時我們在控制台列印輸出,是調用print方法和println方法完成的,這兩個方法都來自於java.io.PrintStream類,該類能夠方便地列印各種數據類型的值,是一種便捷的輸出方式

PrintStream類

public PrintStream(String fileName) : 使用指定的文件名創建一個新的列印流。

public class Demo {
    public static void main(String[] args) throws IOException {
        PrintWriter p = new PrintWriter("FileAndIoStream\\test\\print1.txt");
        p.print("abc");
        p. println(10);
        p.println(true);
        p.close();
        PrintWriter pw = new PrintWriter(new FileWriter("FileAndIoStream\\test\\print2.txt"),true);
        pw.println("你好");
        // 設置輸出位置, 將 輸出到控制台 改為 輸出到文件
        System.setOut(new PrintStream(new FileOutputStream("FileAndIoStream\\test\\print2.txt", true)));
        System.out.println("輸出到文件1");
        System.out.println("輸出到文件2");
        pw.close();
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計是一個讓人夢想成真過程,開始編碼、測試、調試之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ...
  • 作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基於此我們探索了一種新的技術體系及交付方案來解決如上問題。 ...
  • 值傳遞不會改變本身,引用傳遞(如果傳遞的值需要實例化到堆里)如果發生修改了會改變本身。 1.基本數據類型都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ...
  • 第一個 Scala 程式 shell裡面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 文件形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ...
  • 理解 函數指針 指向函數的指針。比如: 理解函數指針的偽代碼 void (*p)(int type, char *data); // 定義一個函數指針p void func(int type, char *data); // 聲明一個函數func p = func; // 將指針p指向函數func ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記二十五之資料庫函數之日期函數 日期函數主要介紹兩個大類,Extract() 和 Trunc() Extract() 函數作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等數據 Trunc() 的作用則是截取,比如 2022-0 ...
  • 什麼是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的電腦上模擬模擬各種電腦功能來實現的。由一套位元組碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域等組成。JVM屏蔽了與操作系統平臺相關的信息,使得Java程式只需要生成在Java虛擬機 ...
  • 更新完微信服務號的模板消息之後,我又趕緊把微信小程式的訂閱消息給實現了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息類型。 https://gitee.com/zhongfuch ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...