1. 程式人生 > >字元流和位元組流的區別 加入了自己的理解

字元流和位元組流的區別 加入了自己的理解

【以下正文】

1 . 之前

○ 在程式中所有的資料都是以流的方式進行傳輸或儲存的,程式需要資料的時候要使用輸入流讀取資料,而當程式需要將一些資料儲存起來的時候,就要使用輸出流完成。
○ 程式中的輸入輸出都是以流的形式儲存的,流中儲存的實際上全都是位元組檔案。

2 . 位元組流與字元流

○ 在java.io包中操作檔案內容的主要有兩大類:位元組流、字元流,兩類都分為輸入和輸出操作。
○ 在位元組流中輸出資料主要是使用OutputStream類完成,輸入資料主要是使用InputStream類完成——主要用於處理位元組或二進位制物件。(byte[])
○ 在字元流中輸出資料主要是使用Writer類完成,輸入資料主要是使用Reader類完成——主要用於處理字元或字串。(String)
○ 位元組流可以處理任何型別的物件,包括二進位制物件。但是它不能直接處理Unicode字元。
○ 字元流可以處理Unicode字元、字串之類的。但是它處理不了物件。
○ 1字元 = 2位元組。

○ 字元流的處理單元為2個位元組的Unicode字元,位元組流的處理單元為1個位元組。
○ JAVA虛擬機器負責(用encode)將位元組轉化為2個位元組的Unicode字元。位元組流構造字元流。這實質就是String和byte[]的關係轉換。
○ 這是通過InputStreamReader和OutputStreamWriter完成的。(記憶:正好是InputSteam+Reader和OutputStream+Writer)

○ 檔案在磁碟上的儲存方式不是儲存字元,而是將字元編碼成位元組儲存。因此讀取和寫入檔案時,都是操作位元組。

3 . 操作位元組流/字元流的流程

①使用File類開啟一個檔案
②通過位元組流/字元流的子類,指定輸出位置
③做讀/寫操作
④最後關閉輸入/輸出流。因為這屬於資源操作,因此一定要關閉,釋放資源。

==============

4 . 舉例子:

站在記憶體和檔案的關係角度理解。

○ 記憶體→檔案:為“寫檔案操作”,用OutputStream(位元組流)和Writer(字元流)。
○ 記憶體←檔案:為“讀檔案操作”,用InputStream(位元組流)和Reader(字元流)。

【位元組流·寫】OutputStream的子類FileOutputStream類
寫一個字串到某個txt檔案中:利用OutputStream類(由於它被定義為abstract的,因此必須由子類例項化物件再去操作,即FileOutputStream類)

import java.io.File;
import
java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class WriteStr{ public static void main(String args[]) throws IOException { //注意,要丟擲一個檔案找不到的IO異常 Output out = new FileOutputStream(f); //因為是對一個檔案做讀寫操作,因此用File類的OutputStream。注意,對於FileOutputStream(f),再呼叫時,會覆蓋newFile.txt內容。若想追加內容,使用另一個建構函式FileOutputStream(File file, boolean append)。即FileOutputStream(f, true)就可以繼續在newFile.txt中追加內容了 String str = "The line to be writed into txt file."; //準備寫入的字串。另,“\r\n”可以用來表示換行符 byte[] b = str.getBytes(); //因為檔案的讀寫都是對位元組操作的,因此必須完成一個字元到位元組的轉換。利用getBytes可以做到。 out.write(b); //write()函式起到將位元組流輸出的作用 out.close(); //必須關閉IO操作,釋放資源 } }

【位元組流·讀】InputStream類的子類FileInputStream類
從一個txt檔案中讀一串字串:利用InputStream類(由於它被定義為abstract的,因此必須由子類例項化物件再去操作,及FileInputStream類)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputSream;

public class ReadStr{
    public static void main(String args[]) throws IOException {    //注意,要丟擲一個檔案找不到的IO異常

        File f = new File("e:" + File.seperator + "newFile.txt");    //同上,利用變數f存放檔案資訊

        Input in = new FileInputStream(f);    //同上

        byte[] b = new byte[(int) f.length()];    //注意:①new byte[...]了;②f.length()是預定義的函式,自動獲取f的檔案長度;③對f.length()需要強制轉換為int型

        String str = new String(b);    //注意,與寫入檔案不同的地方。需要把byte位元組型,轉換成String字元型寫進來

        in.read(b);
        in.close();
        System.out.println(str);    //同樣,列印str就可以了。
    }
}

【字元流·寫】Writer類的子類FileWriter類
寫一個字串到某個txt檔案中:利用Writer類(由於它被定義為abstract的,因此必須由子類例項化物件再去操作,即FileWriter類)

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class WriteStr{
    public static void main(String args[]){
        File f = new File("e:" + File.seperator + "newFile.txt");    //同樣需要先獲取檔案資訊,存到變數f中

        Writer out = new FileWriter(f, true);    //true表示寫檔案的時候不是覆蓋原來的,而是追加到末尾

        String str = "Hello World!";
        out.write(str);    //直接寫入字串str就可以了。字元流可以直接操作,不需要轉換成byte型

        out.close();    //釋放IO資源
    }
}

【字元流·讀】Reader類的子類FileReader類
從一個txt檔案中讀一串字串:利用Reader類(由於它被定義為abstract的,因此必須由子類例項化物件再去操作,及FileReader類)

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ReadStr{
    public static void main(String args[]){
        File f = new File("e:" + File.seperator + "newFile.txt");
        Reader in = new FileReader(f);

        char[] c = new char[1024];    //因為讀出來的是byte位元組陣列,因此要轉化成一個字元陣列輸出,先new一塊空間

        int len = in.read(c);    //需要確定檔案內文字的長度
        in.close();    //釋放IO資源,字元流不先釋放IO資源,無法列印
        System.out.println(new String(c, 0, len));    //因為讀出來的內容還是位元組流byte陣列,因此要轉化成字元流String陣列
    }
}

5 . 字元流和位元組流在記憶體方面的區別:

○ 位元組流直接操作檔案,不經過記憶體;
○ 字元流間接操作檔案,經過記憶體,再到檔案。
○ 位元組流即使不close()操作,也可以寫入檔案;
○ 字元流如果不先close()操作,只會存在記憶體的緩衝區,不會寫入檔案。

相關推薦

字元位元組區別 加入自己理解

【以下正文】 1 . 之前 ○ 在程式中所有的資料都是以流的方式進行傳輸或儲存的,程式需要資料的時候要使用輸入流讀取資料,而當程式需要將一些資料儲存起來的時候,就要使用輸出流完成。 ○ 程式中的輸入輸出都是以流的形式儲存的,流中儲存的實際上全都是位

【筆面試】字元位元組區別以及如何解決亂碼問題

工作中經常遇到java編碼問題,由於缺乏研究,總是無法給出確切的答案,這個週末在網上查了一些資料,在此做些彙總。 問題一:在java中讀取檔案時應該採用什麼編碼? Java讀取檔案的方式總體可以分為兩類:按位元組讀取和按字元讀取。按位元組讀取就是採用InputStre

java 字元位元組的比較

IO分兩種流位元組流 InputStream OutputStream字元流 Reader Writer他們都是抽象類具體實現位元組流 FileInputStream FileOutputStream字元流 FileReader FileWriter 字元流處理的單元為2個

JAVA IO——字元位元組的粗淺理解

本人在使用IO流是經常在選擇是output還是input,reader還是writer中糾結一會,歸根結底還是沒有對IO流方向問題擁有自己的理解。 位元組流和字元流,顧名思義,前者和位元組打交道,後者和字元打交道。 位元組流和字元流都分為輸入和輸出兩個方向,

分別使用(字元)(位元組)對檔案進行讀寫操作

一.使用(字元流)對檔案進行讀寫操作/* * 使用字元流對檔案進行讀寫操作 */ import java.io.BufferedReader; import java.io.FileInputSt

Java 字元位元組-學習筆記

 一:字元流  Reader和Writer(基類)  FileReader和FileWriter(定義字元輸入、輸出流)  BufferedReader和BufferedWriter(字元帶緩衝輸入、輸出流)  LineNumberReader    二:字元流拷貝檔案,4中方式  1.FileReader和

IO字元位元組的不同使用

源頭: Reader (字元流) 和 InputStream(位元組流) 目標 Writer(字元流)和 OutputStream(位元組流) 裝置 鍵盤 硬碟 控制檯 高效率操作 字元流: BufferedReader BuffereWr

Java中ListArrayList的區別(加入個人見解)

       轉載自:http://www.cnblogs.com/aisiteru/articles/1151874.html       第一次看這篇文章時,是在CSDN部落格中看到的,作者寫的初衷還是蠻好的,但是確實有錯誤的地方和不是很明白的地方。於是就很想去看看原文,

java之字元位元組區別聯絡

流,用來處理輸入和輸出,主要是和檔案系統打交道,把計算機的處理結果儲存到檔案中,把檔案中的內容讀取到記憶體中,這些都需要流操作來完成。 IO = Input / Output = 輸入 / 輸出                            Java IO 流                    

Java I/O複習(二)—字元字元緩衝、以及位元組區別

Java I/O流複習(二) 1 字元輸入流 字元流(Java IO的Reader和Writer)功能與InputStream和OutputStream非常類似,InputStream和OutputStream基於位元組處理,而字元流(Reader和Writ

3.7 Java之列印資料(附字元位元組練習)

列印流 例項 資料流 資料流輸出 資料流輸入 字元位元組流練習 位元組流輸出 字元流輸出

Java:位元組字元(輸入輸出

什麼是流 如果想學習Java工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加我的Java高階交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。 流是個抽象的概念,是對輸入輸出裝置的抽象,輸

位元組字元位元組字元的使用哪個多? java 讀寫操作大檔案 BufferedReaderRandomAccessFile

一 首先我們要知道 在程式中所有的資料都是以流的方式進行傳輸或儲存的   而流有兩種 位元組流用來處理位元組或二進位制物件 字元流主要用來處理字元或字串,一個字元佔兩個位元組 而上一篇的java 讀寫操作大檔案 BufferedReader和RandomAccessFile Buf

Java:IO:探究位元組字元

前言---- 本來不想寫前言了,但是寫完,發現寫得太好了,遇到就好好看一看啊!!!! 注:歡迎轉載,轉載請註明來處 目錄 一. 簡單理解什麼是流? 我是把流理解成一個導管,這個導管連線了硬碟中的某個檔案和程式. 輸入流:輸入資料

Java基礎之IO位元組字元、記憶體、帶快取的、序列化反序列化)

File類:File類提供了對檔案的操作,可以通過字串或URI來構建一個File類物件。通過物件,可以實現檔案的建立(createNewFile)、刪除(delete)、獲得檔名(getName)、獲得父目錄物件(getParentFile)、獲得父目錄名稱(

位元組 字元 轉換

位元組流位元組流 又稱 萬能流 不但可以讀寫文字,還可以讀寫圖片 音訊 視訊使用位元組流進行 檔案的複製需要對異常進行處理  且計算複製時間long start = System.currentTimeMillis(); // 被讀檔案 File file1 = new

Java的位元組字元緩衝對比探究

[TOC] ## 一、前言 所謂IO,也就是Input/Output。Java程式跟外部進行的資料交換就叫做Java的IO操作。程式中資料的輸入輸出,被抽象為流, 按照相對於程式的流向,可分為輸出流和輸入流。 **按照資料流的格式,可分為位元組流和字元流**。Java IO流的體系很龐大,功能豐富。 本

float 浮動 文檔文字區別

關於 photo cli btn 元素 title comment div 顯示 源自:2-2 浮動的基礎知識 關於float屬性的脫離文檔流的問題 看完視頻後,教材裏說的使用float浮動後,元素雖然會脫離文檔流,但還處在文本流的位置當中,所以就不會出現重疊的效果嗎?

java IO字元位元組簡單使用示例

1.Reader && Writer Reader java.lang.Object |-- java.io.Reader//常用方法 |-- int read() //讀取單個字元 |--

File,字元位元組

File: 檔案和目錄路徑名的抽象表示形式 構造方法: public File(String pathname) 通過給定的檔案或資料夾的路徑,來建立對應的File物件 public File(String parent, String child) 通過給定的父資料夾路徑,與給定