最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JAVA 字節(jié)流和字符流

 更新時(shí)間:2020年06月20日 14:18:10   作者:認(rèn)真對(duì)待世界的小白  
這篇文章主要介紹了JAVA 字節(jié)流和字符流的的相關(guān)資料,文中講解非常的細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

1、InputStream 和 Reader

InputStream 和 Reader 是所有輸入流的抽象基類(lèi),本身并不能創(chuàng)建實(shí)例來(lái)執(zhí)行輸入,但它們將成為所有輸入流的模板,所以它們的方法是所有輸入流都可使用的方法。

在 InputStream 里包含如下三個(gè)方法。

  • int read():從輸入流中讀取單個(gè)字節(jié),返回所讀取的字節(jié)數(shù)據(jù)(字節(jié)數(shù)據(jù)可直接轉(zhuǎn)換為int類(lèi)型)。
  • int read(byte[] b):從輸入流中最多讀取 b.length 個(gè)字節(jié)的數(shù)據(jù),并將其存儲(chǔ)在字節(jié)數(shù)組 b 中,返回實(shí)際讀取的字節(jié)數(shù)。
  • int read(byte[] b, int off, int len):從輸入流中最多讀取 len 個(gè)字節(jié)的數(shù)據(jù),并將其存儲(chǔ)在數(shù)組 b 中,放入數(shù)組 b 中時(shí),并不是從數(shù)組起點(diǎn)開(kāi)始,而是從 off 位置開(kāi)始,返回實(shí)際讀取的字節(jié)數(shù)。

在 Reader 里包含如下三個(gè)方法。

  • int read():從輸入流中讀取單個(gè)字符,返回所讀取的字符數(shù)據(jù)(字符數(shù)據(jù)可直接轉(zhuǎn)換為int類(lèi)型)。
  • int read(char[] cbuf):從輸入流中最多讀取 cbuf.length 個(gè)字符的數(shù)據(jù),并將其存儲(chǔ)在字符數(shù)組 cbuf 中,返回實(shí)際讀取的字符數(shù)。
  • int read(char[] chuf, int off, int len):從輸入流中最多讀取 len 個(gè)字符的數(shù)據(jù),并將其存儲(chǔ)在字符數(shù)組 cbuf 中,放入數(shù)組 cbuf 中時(shí),并不是從數(shù)組起點(diǎn)開(kāi)始,而是從 off 位置開(kāi)始,返回實(shí)際讀取的字符數(shù)。

對(duì)比 InputStream 和 Reader 所提供的方法,就不難發(fā)現(xiàn)這兩個(gè)基類(lèi)的功能基本是一樣的。

正如前面提到的,InputStream 和 Reader 都是抽象類(lèi),本身不能創(chuàng)建實(shí)例,但它們分別有一個(gè)用于讀取文件的輸入流:FileInputStream 和 FileReader,它們都是節(jié)點(diǎn)流一一會(huì)直接和指定文件關(guān)聯(lián)。

下面程序示范了使用 FileInputStream 來(lái)讀取自身的效果。

public class FileInputStreamTest {
  public static void main(String[] args) throws IOException {
    // 創(chuàng)建字節(jié)輸入流
    FileInputStream fis = new FileInputStream("F:\\eclipse-workspace\\demo\\src\\com\\jwen\\demo15_3\\FileInputStreamTest.java");
    // 創(chuàng)建一個(gè)長(zhǎng)度為1024的“竹筒”
    byte[] bbuf = new byte[1024];
    // 用于保存實(shí)際讀取的字節(jié)數(shù)
    int hasRead = 0;
    // 使用循環(huán)來(lái)重復(fù)“取水”過(guò)程
    while ((hasRead = fis.read(bbuf)) > 0) {
      // 取出“竹筒”中水滴(字節(jié)),將字節(jié)數(shù)組轉(zhuǎn)換成字符串輸入!
      System.out.print(new String(bbuf, 0, hasRead));
    }
    // 關(guān)閉文件輸入流,放在finally塊里更安全
    fis.close();
  }
}

上面程序中的粗體字代碼是使用 FileInputStream 循環(huán)“取水”的過(guò)程,運(yùn)行上面程序,將會(huì)輸出上面程序的源代碼。

注意:上面程序創(chuàng)建了一個(gè)長(zhǎng)度為1024的字節(jié)數(shù)組來(lái)讀取該文件,實(shí)際上該Java源文件的長(zhǎng)度還不到1024字節(jié),也就是說(shuō),程序只需要執(zhí)行一次 read() 方法即可讀取全部?jī)?nèi)容。但如果創(chuàng)建較小長(zhǎng)度的字節(jié)數(shù)組,程序運(yùn)行時(shí)在輸出中文注釋時(shí)就可能出現(xiàn)亂碼一一這是因?yàn)楸疚募4鏁r(shí)采用的是 GBK 編碼方式,在這種方式下,每個(gè)中文字符占2字節(jié),如果 read() 方法讀取時(shí)只讀到了半個(gè)中文字符,這將導(dǎo)致亂碼。

上面程序最后使用了 fis.close() 來(lái)關(guān)閉該文件輸入流,與 JDBC 編程一樣,程序里打開(kāi)的文件 IO 資源不屬于內(nèi)存里的資源,垃圾回收機(jī)制無(wú)法回收該資源,所以應(yīng)該顯式關(guān)閉文件資源。Java 7 改寫(xiě)了所有的 IO 資源類(lèi),它們都實(shí)現(xiàn)了 AutoCloseable 接口,因此都可通過(guò)自動(dòng)關(guān)閉資源的 try 語(yǔ)句來(lái)關(guān)閉這些 IO 流。下面程序使用 FileReader 來(lái)讀取文件本身。

public class FileReaderTest {
  public static void main(String[] args) {
    try (
      // 創(chuàng)建字符輸入流
      FileReader fr = new FileReader("F:\\eclipse-workspace\\demo\\src\\com\\jwen\\demo15_3\\FileReaderTest.java")) {
      // 創(chuàng)建一個(gè)長(zhǎng)度為32的“竹筒”
      char[] cbuf = new char[32];
      // 用于保存實(shí)際讀取的字符數(shù)
      int hasRead = 0;
      // 使用循環(huán)來(lái)重復(fù)“取水”過(guò)程
      while ((hasRead = fr.read(cbuf)) > 0) {
        // 取出“竹筒”中水滴(字符),將字符數(shù)組轉(zhuǎn)換成字符串輸入!
        System.out.print(new String(cbuf, 0, hasRead));
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

上面的 FileReaderTest.java 程序與前面的 FileInputStreamTest.java 并沒(méi)有太大的不同,程序只是將字符數(shù)組的長(zhǎng)度改為32,這意味著程序需要多次調(diào)用 read() 方法才可以完全讀取輸入流的全部數(shù)據(jù)。程序最后使用了自動(dòng)關(guān)閉資源的 try 語(yǔ)句來(lái)關(guān)閉文件輸入流,這樣可以保證輸入流一定會(huì)被關(guān)閉。

除此之外,InputStream 和 Reader 還支持如下幾個(gè)方法來(lái)移動(dòng)記錄指針。

  • void mark(int readAheadLimit):在記錄指針當(dāng)前位置記錄一個(gè)標(biāo)記(mark).
  • boolean markSupported():判斷此輸入流是否支持 mark() 操作,即是否支持記錄標(biāo)記。
  • void reset():將此流的記錄指針重新定位到上一次記錄標(biāo)記(mark)的位置。
  • long skip(long n):記錄指針向前移動(dòng)個(gè)字節(jié)/字符。

2、OutputStream 和 Writer

OutputStream 和 Writer 也非常相似,兩個(gè)流都提供了如下三個(gè)方法。

  • void write(int c):將指定的字節(jié)/字符輸出到輸出流中,其中 c 既可以代表字節(jié),也可以代表字符。
  • void write(byte[]/char[] buf):將字節(jié)數(shù)組/字符數(shù)組中的數(shù)據(jù)輸出到指定輸出流中。
  • void write(byte[]/char[] buf, int off, int len):將字節(jié)數(shù)組/字符數(shù)組中從 off 位置開(kāi)始,長(zhǎng)度為 len 的字節(jié)/字符輸出到輸出流中。

因?yàn)樽址髦苯右宰址鳛椴僮鲉挝唬?Writer 可以用字符串來(lái)代替字符數(shù)組,即以 String 對(duì)象作為參數(shù)。Writer 里還包含如下兩個(gè)方法。

  • void write(String str):將字符串里包含的字符輸出到指定輸出流中。
  • void write(String str, int off, int len):將字符串里從 off 位置開(kāi)始,長(zhǎng)度為 len 的字符輸出到指定輸出流中。

下面程序使用 FileInputStream 來(lái)執(zhí)行輸入,并使用 FileOutputStream 來(lái)執(zhí)行輸出,用以實(shí)現(xiàn)復(fù)制 FileOutputStreamTest.java 文件的功能。

public class FileOutputStreamTest {
  public static void main(String[] args) {
    try (
      // 創(chuàng)建字節(jié)輸入流
      FileInputStream fis = new FileInputStream("FileOutputStreamTest.java");
      // 創(chuàng)建字節(jié)輸出流
      FileOutputStream fos = new FileOutputStream("newFile.txt")) {
      byte[] bbuf = new byte[32];
      int hasRead = 0;
      // 循環(huán)從輸入流中取出數(shù)據(jù)
      while ((hasRead = fis.read(bbuf)) > 0) {
        // 每讀取一次,即寫(xiě)入文件輸出流,讀了多少,就寫(xiě)多少。
        fos.write(bbuf, 0, hasRead);
      }
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }
}

運(yùn)行上面程序,將看到系統(tǒng)當(dāng)前路徑下多了一個(gè)文件:newFile.txt,該文件的內(nèi)容和 FileOutputStreamTest.java 文件的內(nèi)容完全相同。

注意:使用 Java 的 IO 流執(zhí)行輸出時(shí),不要忘記關(guān)閉輸出流,關(guān)閉輸出流除可以保證流的物理資源被回收之外,可能還可以將輸出流緩沖區(qū)中的數(shù)據(jù) flush 到物理節(jié)點(diǎn)里(因?yàn)樵趫?zhí)行 close() 方法之前,自動(dòng)執(zhí)行輸出流的 flush() 方法)。Java 的很多輸出流默認(rèn)都提供了緩沖功能,其實(shí)沒(méi)有必要刻意去記憶哪些流有緩沖功能、哪些流沒(méi)有,只要正常關(guān)閉所有的輸出流即可保證程序正常。

如果希望直接輸出字符串內(nèi)容,則使用 Writer 會(huì)有更好的效果,如下程序所示。

public class FileWriterTest {
  public static void main(String[] args) {
    try (FileWriter fw = new FileWriter("poem.txt")) {
      fw.write("錦瑟 - 李商隱\r\n");
      fw.write("錦瑟無(wú)端五十弦,一弦一柱思華年。\r\n");
      fw.write("莊生曉夢(mèng)迷蝴蝶,望帝春心托杜鵑。\r\n");
      fw.write("滄海月明珠有淚,藍(lán)田日暖玉生煙。\r\n");
      fw.write("此情可待成追憶,只是當(dāng)時(shí)已惘然。\r\n");
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }
}

運(yùn)行上面程序,將會(huì)在當(dāng)前目錄下輸出一個(gè) poem.txt 文件,文件內(nèi)容就是程序中輸出的內(nèi)容。

注意:上面程序在輸出字符串內(nèi)容時(shí),字符串內(nèi)容的最后是\r\n,這是 Windows 平臺(tái)的換行符,通過(guò)這種方式就可以讓輸出內(nèi)容換行;如果是 UNIX/Linux/BSD 等平臺(tái),則使用 \n 就作為換行符。

以上就是詳解JAVA 字節(jié)流和字符流的詳細(xì)內(nèi)容,更多關(guān)于JAVA 字節(jié)流和字符流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解

    Java語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解

    這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解,簡(jiǎn)單介紹了棧的概念,然后分享了線性棧和鏈?zhǔn)綏5腏ava代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java Web開(kāi)發(fā)之基于Session的購(gòu)物商店實(shí)現(xiàn)方法

    Java Web開(kāi)發(fā)之基于Session的購(gòu)物商店實(shí)現(xiàn)方法

    這篇文章主要介紹了Java Web開(kāi)發(fā)之基于Session的購(gòu)物商店實(shí)現(xiàn)方法,涉及Java針對(duì)session的操作及數(shù)據(jù)庫(kù)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Spring?Cloud?Ribbon?負(fù)載均衡使用策略示例詳解

    Spring?Cloud?Ribbon?負(fù)載均衡使用策略示例詳解

    Spring?Cloud?Ribbon?是基于Netflix?Ribbon?實(shí)現(xiàn)的一套客戶(hù)端負(fù)載均衡工具,Ribbon客戶(hù)端組件提供了一系列的完善的配置,如超時(shí),重試等,這篇文章主要介紹了Spring?Cloud?Ribbon?負(fù)載均衡使用策略示例詳解,需要的朋友可以參考下
    2023-03-03
  • Java?超詳細(xì)帶你掌握矩陣的運(yùn)算

    Java?超詳細(xì)帶你掌握矩陣的運(yùn)算

    在學(xué)習(xí)機(jī)器學(xué)習(xí)算法時(shí),發(fā)現(xiàn)運(yùn)用java?來(lái)實(shí)現(xiàn)有些算法代碼時(shí),會(huì)有很大困難,其中有一點(diǎn)就是?java?本身并沒(méi)有矩陣運(yùn)算的?api,所以進(jìn)行要實(shí)現(xiàn)矩陣運(yùn)算就尤其復(fù)雜,讓我們一起了解矩陣的運(yùn)算
    2022-03-03
  • SpringBoot實(shí)現(xiàn)文件上傳功能

    SpringBoot實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • ReentrantLock獲取鎖釋放鎖的流程示例分析

    ReentrantLock獲取鎖釋放鎖的流程示例分析

    這篇文章主要為大家介紹了ReentrantLock獲取鎖釋放鎖的流程示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 在Java中使用Moshi?JSON庫(kù)的方法詳解

    在Java中使用Moshi?JSON庫(kù)的方法詳解

    Moshi?是一個(gè)可用于?Java?與?Kotlin?的?JSON?序列化與反序列化庫(kù),其主要使用?Kotlin?編寫(xiě),本文以樣例代碼的方式來(lái)演示該庫(kù)在?Java?中的使用,需要的朋友可以參考下
    2024-04-04
  • 基于@RequestMapping 用法詳解之地址映射

    基于@RequestMapping 用法詳解之地址映射

    這篇文章主要介紹了@RequestMapping 用法詳解之地址映射,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • maven配置本地倉(cāng)庫(kù)的方法步驟

    maven配置本地倉(cāng)庫(kù)的方法步驟

    本文主要介紹了maven配置本地倉(cāng)庫(kù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • RocketMQ?Broker消息如何刷盤(pán)源碼解析

    RocketMQ?Broker消息如何刷盤(pán)源碼解析

    這篇文章主要為大家介紹了RocketMQ?Broker消息如何刷盤(pán)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論

富阳市| 页游| 西安市| 景泰县| 霞浦县| 工布江达县| 镇原县| 仙居县| 夏邑县| 舞钢市| 勐海县| 九龙城区| 建始县| 大埔县| 横山县| 沽源县| 常熟市| 大同县| 阿荣旗| 郓城县| 晋中市| 中宁县| 马山县| 海南省| 永康市| 巨野县| 永清县| 乌兰县| 临沭县| 梨树县| 镇康县| 万盛区| 确山县| 丰县| 甘泉县| 洛隆县| 会泽县| 安达市| 西乌| 汕尾市| 通道|