第57節:Java中流的操作以及編碼解碼

来源:https://www.cnblogs.com/dashucoding/archive/2018/11/14/9955951.html
-Advertisement-
Play Games

我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 編碼解碼:編碼時將信息從一種形式變成為另一種形式,成為編碼.編碼為 ,逆過程為解碼.編碼時用代碼表示的,解碼為 ,有了編碼就有相關的編碼表,是對生活中的文件和電腦進 ...


標題圖

我的博客:
https://huangguangda.cn/
https://huangguangda.github.io/

前言:

編碼解碼:編碼時將信息從一種形式變成為另一種形式,成為編碼.編碼為coding,逆過程為解碼.編碼時用代碼表示的,解碼為Decoding,有了編碼就有相關的編碼表,是對生活中的文件和電腦進行二進位的對應關係.

ascii,GB2312,unicode,UTF-8

把文字進行轉變為二進位位編碼,把二進位轉變為文字為解碼.

把字元串轉變為位元組數組為編碼,把位元組數組轉變為字元串為解碼.字元串的表示為:string,而位元組數組的表現形式為byte[],

string-->byte[]: 字元串變字元數組,使用getBytes()方法,位元組數組變字元串,使用new String((byte[]))方法.

java.langstring
java.lang.object->java.lang.string

實現的介面:

serializable,charsequence,comparable<string>

public final class String extends Object
implements Serializable, Comparable<String>, CharSequence

String代表字元串,字元串是常量,字元串的值在創建之後就不能更改,只有字元串緩衝區可以支持可變的字元串.

string對象是不可以變的,但是可以共用.

String str = "abc";

=

char data[] = ['a', 'b', 'c'];
String str = new String(data)

String類的方法可以用來查詢單個字元,進行比較字元串,提取字元串等等.字元串的串聯可以通過StringBuilderStringBuffer的類來實現.而字元串的轉換可以通過toString的方法來實現.

String類表示字元串類型,表示一個UTF-16格式的字元串.

import java.io.UnsupportedEncodingException;
public class EnDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "abc";
        byte[] buf1 = str.getBytes("utf-8");
        String s1 = new String(buf1,"utf-8");
        System.out.println(s1);
    }
}

實例:

public class CutStringTest {
 public static void main(String[] args){
  String str = "你好aa,謝謝";
  byte[] buf = str.getBytes("GBK");
  for (int i = 0; i < buf.length; i++) {
   String s = cutString(str,i+1);
   System.out.println(str+",截取"+(i+1)+"個結果是:"+s);
  }
  int len = 5;
  String s = cutString(str,len);
  System.out.println(s);
 }
 public static String cutString(String str,int len) throws UnsupportedEncodingException {
  // 中文由兩個位元組組成
  // 將字元串編碼成位元組數組
  byte[] buf = str.getBytes("GBK");
  int count = 0;
  // 對數組進行遍歷, 從截取位置開始往回遍歷
 for(int i = len -1; i >= 0; i--){
  // 判斷最後的截取位是否是負數
  if(buf[i]<0){
   count++;
  }else{
   break;
  }
 }
  // 判斷奇偶數
 if(count%2==0){
   return new String(buf, 0, len);
 }else{
  return new String(buf,0,len-1);
  // 捨棄最後一個。
 }
  return null;
 }
}

聯通:

聯通

移動:

移動

public class Test {
    public static void main(String[] args) {
        String str = "聯通";
        byte[] buf = str.getBytes();
                // 二進位
        for(byte b : buf){
            System.out.println(Integer.toBinaryString(b&255));
        }
    }
}

utf

字元流的緩衝區

public class BufferedStreamDemo {
    public static void main(String[] args) throws IOException {
        BufferedReader bufr = new BufferedReader(new FileReader("Test.java"));
        String line = null;
        while((line=bufr.readLine())!=null){
            System.out.println(line);
        }
        bufr.close();
    }
}

readLine和緩衝區

BufferedReader();字元數組 fr.read(char[]);

FileReader(); read()字元

readLine(); 一次讀取一行

readLine():
調用緩衝區的read方法,是將讀取到的字元存儲到另一個容器,當讀取到終止符時,就將臨時容器中存儲的數據轉換為字元串返回.

緩衝區:
使用底層流對象從具體設備上獲取數據,並將存儲到緩衝區中的數據內,通過緩衝區中read()方法,可以從緩衝區中獲取具體的字元數據,可以提高效率,如果用read()方法讀取字元數據,並存儲到另一個容器中,直到讀取到了換行符,這時另一個容器的臨時存儲的數據就會換成字元串返回,就會形成readLine()的功能.

實例:
自定義一個字元流緩衝區,用來緩衝字元數據,從而提高效率,可以使用緩衝區數據的方法.

緩衝區應該具備什麼?
1,要有數組。
2,對數組進行操作,對數組操作一定要有角標。

BufferedReader

read

public class MyBufferedReader {
    private Reader r;
    // 定義一個字元數組,作為緩衝區。
    private char[] buf = new char[1024];
    // 定義了一個索引,用於操作數組中的元素。
    private int index = 0;
    // 定義了一個變數,用於記錄讀取字元的個數。
    private int count = 0;

    // 需要一初始化就具備一個流對象。
    public MyBufferedReader(Reader r) {// 可以對Reader的所有子類進行高效讀取。
        this.r = r;
    }

    public int read() throws IOException {

        /*
         * 1,需要先通過流對象從底層設備上獲取一定數據的數據到緩衝區數組中。 使用流對象read(char[]);
         */
        //如果count記錄字元個數的變數為0,說明緩衝區已經沒有字元數據。
        if(count==0){
            //需要從設備上獲取一定數量的數據存儲到緩衝區中,並用count記錄存儲字元的個數。
            count = r.read(buf);
            //每取一次新的數據,就需要將角標歸0.
            index = 0;
        }
        //如果count小於0,說明到-1,沒有數據了,程式直接返回-1.
        if(count<0){
            return -1;
        }
        //從緩衝區中取出一個字元。
        char ch = buf[index];
        //角標自增。
        index ++;
        //計數器要自減。
        count --;
        
        return ch;
    }
    
    public String readLine() throws IOException{
        //1,定義一個臨時容器。
        StringBuilder sb = new StringBuilder();
        
        //2,調用本類中的read方法,從緩衝區中讀取一個字元,存儲到臨時容器中。
        //存的時候要註意:必須判斷,如果是行終止符就不要存儲了。就將臨時容器中的
        //字元轉成字元串返回。
        
        int ch = 0;
        while((ch=this.read())!=-1){
            if(ch=='\r'){
                continue;
            }
            
            if(ch=='\n'){
                return sb.toString();
            }
            
            sb.append((char)ch);//將讀取到的字元數字轉成char類型,存儲到sb中。
            
        }
        
        //萬一文本中最後以後沒有行終止符,判斷一下sb中是否有內容,如果有則返回。
        if(sb.length()!=0){
            return sb.toString();
        }
        
        return null;
    }
    
    // 關閉流資源。
    public void close() throws IOException {
        // 其實內部就是關閉具體的流。
        r.close();
    }
}
public class MyBufferedReaderDemo {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // 驗證自定義的緩衝區。
        MyBufferedReader myBufr = new MyBufferedReader(new FileReader("dashucoding\\1.txt"));
        
        String line = null;
        
        while((line=myBufr.readLine())!=null){
            System.out.println(line);
        }
        
        myBufr.close();
    }
}

位元組流:
FileInputStream FileOutputStream
BufferedInputStream BufferedOutputStream

字元流:
FileReader FileWriter
InputStreamReader OutputStreamWriter
BufferedReader BufferedWriter

public class ReadDemo {
    public static void main(String[] args) throws IOException {

        /*
         * 思路:
         * 將數據存儲到的文件
         * 怎麼獲取數據來源呢?鍵盤錄入怎麼弄呢?
         * 鍵盤錄入是輸入
         * 在System類找到了標準輸入流
         * System.in 對應的類型是InputStream。位元組輸入流。
         */
        //獲取了鍵盤錄入的輸入流對象。可以不用關閉。
        InputStream in = System.in;
        
        int ch = in.read();
        System.out.println(ch);

        int ch1 = in.read();
        System.out.println(ch1);

        int ch2 = in.read();
        System.out.println(ch2);

        int ch3 = in.read();
        System.out.println(ch3);
        
    }
}

Reader

Reader

讀取的:

InputStream

此抽象類表示位元組輸入流的所有類的超類

位元組輸入流轉成字元輸入流

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

字元流

public class DataToFileTest {

    public static void main(String[] args) throws IOException {

        //鍵盤錄入。
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        //目的是文件。
//      FileWriter fw = new FileWriter("dashucoding\\key.txt");
//      BufferedWriter bufw = new BufferedWriter(fw);
        BufferedWriter bufw = new BufferedWriter(new FileWriter("dashucoding\\key.txt"));
        
        String line = null;
        while((line=bufr.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            bufw.write(line);
            bufw.newLine();
            bufw.flush();
        }
        
        bufw.close();
    }
}

IO流

操作的數據是數據源還是數據

源: InputStream Reader
目的: OutputStream Writer

要操作的設備是位元組還是文本

源: 位元組:InputSteam 文本:Reader
目的: 位元組:OutputSteam 文本:Writer

具體設備:

源設備: 硬碟:文件File,記憶體:數組,字元串,鍵盤:System.in,網路:Socket

目的設備: 硬碟:文件File,記憶體:數組,字元串,屏幕:System.out,網路:Socket

需求

源:字元串,目的:文件, OutputStream, Writer

FileWriter fw = new FileWriter("a.txt");
fw.write(string);

高效

BufferedWriter bw= new BufferedWriter(new FilewWriter("a.txt"));
bw.write(string);
bw.newLine();
bw.flush();

複製文本文件

源:InputStream Reader
目的:OutStream Writer

(可有過濾需求)

FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");

高效

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
String line = br.readLine();
line = line.replace("dashucoding","達叔小生");
bw.write(line);

讀取鍵盤錄入到文件中(一般都是文本)

源: InputStream Reader
目的: OutputStream Writer

InputStream in = System.in;
FileWriter fw = new FileWriter("a.txt");

byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
fw.write(str);

位元組轉字元 InputStreamReader

InputStreamReader isr=new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");

高效

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt");

讀取文件到屏幕

FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;
System.out.println();

out

printstream

繼承

讀取文件到文本數據,將數據按照utf-8存儲到文件中

FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");

轉換

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8"));

達叔小生:往後餘生,唯獨有你
You and me, we are family !
90後帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: 達叔小生
https://www.jianshu.com/u/c785ece603d1

結語

  • 下麵我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
  • 小禮物走一走 or 點贊

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

-Advertisement-
Play Games
更多相關文章
  • @media screen and (max-width: 300px) { //當視口寬度小於等於300px時生效 } max-width 相當於 <= @media screen and (min-width: 300px) { //當視口寬度大於等於300px時生效 } max-width 相 ...
  • 本文作者:陳明傑(sandyskies) Tars是騰訊從2008年到今天一直在使用的後臺邏輯層的統一應用框架,目前支持C++,Java,PHP,Nodejs,Golang語言。該框架為用戶提供了涉及到開發、運維、以及測試的一整套解決方案,幫助一個產品或者服務快速開發、部署、測試、上線。 它集可擴展 ...
  • 抽象工廠模式簡介,介紹了抽象工廠模式意圖,結構,產品族以及產品等級的概念,並且提供了代碼示例java版抽象工廠模式,抽象工廠模式與工廠模式的對比差異 ...
  • istio sidecar自動註入過程分析 sidecar自動註入檢查 istio通過 "mutating webhook admission controller" 機制實現sidecar的自動註入.istio sidecard在每個服務創建pod時都會被自動註入. 檢查kube apiserve ...
  • 系統架構設計師-需求 前言: 最近很久沒有發文章了。最近事情挺多的,也不知道該發那方面的內容。正好這兩天有空閑,就整理整理思緒,把一些總結髮表一下。 經過考慮後,先將軟考-架構相關的內容發出來,之後有時間,也會將一些額外的理論知識和經驗寫出來。 參考:《系統架構設計師考試全程指導》,《系統架構設計師 ...
  • 距離《 "重磅:Spring Boot 2.0 正式發佈!" 》已經過去大半年了,而 Spring Boot 2.1.0 在 10 月底就發佈了,我們來看下 Spring Boot 2.1.0 都更新了什麼,每一個 Java 技術人都值得關註。 棧長其實早就看到了更新了,現在才有時間來更新下。 1、 ...
  • 1、讀取cookies 2、將cookies保存在文件中 3、處理異常 URLError和HTTPError類,兩個類是父子關係,HTTPError會返回錯誤代碼,兩個類都可以處理request模塊產生的異常,這兩個都有一個reason屬性,用於記錄出現異常的原因 URLError處理異常: HTT ...
  • [TOC] 1.遷移 創建完模型類後,並沒有真正的在資料庫中創建了數據表,需要執行遷移命令,在數據表中創建數據表。 1.生成遷移文件 文件所在目錄執行命令 2.執行遷移命令 文件所在目錄執行命令 執行命令後到資料庫中查看是創建好了數據表。 添加測試數據 檢查資料庫中是否添加了數據。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...