精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java中基礎(chǔ)的 IO 流

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-10 16:16 ? 次閱讀

java 中,程序通常會(huì)和其他外部設(shè)備進(jìn)行數(shù)據(jù)交互,比如寫入磁盤,網(wǎng)絡(luò)發(fā)送數(shù)據(jù)等等,今天我們來學(xué)學(xué) java 中 基礎(chǔ)的 IO 流。

IO 流

與其他外部設(shè)備進(jìn)行數(shù)據(jù)交互,比如將數(shù)據(jù)從內(nèi)存中保存到磁盤文件中或者從網(wǎng)絡(luò)上下載數(shù)據(jù)并加載到內(nèi)存中,這個(gè)過程都是一種單向且有順序的數(shù)據(jù)傳輸,被稱之為流。

IO 就是 Input 輸入和 Output 輸出。輸入輸出以內(nèi)存為中心的流向劃分的。傳輸數(shù)據(jù)到內(nèi)存就是輸入流,從內(nèi)存中輸出數(shù)據(jù)就是輸出流。

InputStream

InputStream 是所有輸入流的父類,是一個(gè)抽象類,讀取的數(shù)據(jù)單位是字節(jié)(byte)。

圖片

主要的抽象方法是 read(),這個(gè)方法就是讀取數(shù)據(jù)內(nèi)容并返回 -1~255 的 int 值。read() 方法是一個(gè)阻塞的方法,只有將內(nèi)容全部讀取完成之后才能運(yùn)行下一行代碼。

public abstract int read() throws IOException;

以 FileInputStream 實(shí)現(xiàn)類作為示例:

public static void main(String[] args) throws Exception {
    // input.txt 內(nèi)容為 hello, inputStream
    InputStream input = new FileInputStream("input.txt");
    int n = 0;
    while((n = input.read()) != -1){
        System.out.print((char) n);
    }
    input.close();
}

示例中的 read() 方法只能一個(gè)字節(jié)的一個(gè)字節(jié)讀取數(shù)據(jù),效率不高,當(dāng)文件中存在多個(gè)字節(jié)為一個(gè)漢字的中文時(shí),上面的示例將打印出亂碼。

InputStream 支持將一次性讀取多個(gè)字節(jié)到緩沖區(qū),利用緩沖區(qū)提高效率。返回值的數(shù)據(jù)不再是讀取的數(shù)據(jù)字節(jié),而是讀取的字節(jié)數(shù)。并且可以正常的打印出中文字符。

// 將讀取的內(nèi)容填充到 byte 數(shù)組
public int read(byte b[]) throws IOException
// 將讀取的內(nèi)容填充 byte 數(shù)組中 off 開始,len 長度的區(qū)域
public int read(byte b[], int off, int len)  throws IOException

將緩沖區(qū)大小設(shè)置為 1024 個(gè)字節(jié)示例:

public static void main(String[] args) throws Exception {
    //input.txt 文件內(nèi)容為 你好, inputStream
    InputStream input = new FileInputStream("input.txt");

    byte[] result = new byte[1024];

    while(input.read(result) != -1){
        System.out.print(new String(result, "utf-8"));
    }
    input.close();
}

OutputStream

OutputStream 是所有輸出流的父類。和 InputStream 一樣是一個(gè)抽象類。

圖片

主要的抽象方法是 write(),也是一個(gè)阻塞的方法,只有將內(nèi)容全部寫完成之后才能運(yùn)行下一行代碼。write() 方法和 read() 方法一樣都是一個(gè)字節(jié)一個(gè)字節(jié)的操作的。

public abstract void write(int b) throws IOException;

以 FileInputStream 實(shí)現(xiàn)類作為示例:

public static void main(String[] args) throws Exception {
    OutputStream out = new FileOutputStream("out.txt");
    try {
        out.write("h".getBytes());
        out.write("e".getBytes());
        out.write("l".getBytes());
        out.write("l".getBytes());
        out.write("0".getBytes());
    } finally {
        if(out != null) {
            out.close();
        }
    }
}

write() 按單個(gè)字節(jié)寫入磁盤的效率比較低下,OutputStream 提供了 write(byte[]) 一次性大批量的將字節(jié)輸出到磁盤。對(duì)于 IO 設(shè)備來說,一次性寫入 1 個(gè)字節(jié)和寫入 1000 個(gè)字節(jié)的時(shí)間都是差不多的。

public static void main(String[] args) throws Exception {
    OutputStream out = new FileOutputStream("out.txt");
    try {
        out.write("哈嘍,outputStream".getBytes());
    } finally {
        if(out != null) {
            out.close();
        }
    }
}

關(guān)閉資源

不管是 InputStream 還是 OutputStream 在使用資源之后都需要調(diào)用 close()方法。在示例中如果在 close() 方法調(diào)用之前拋出異常則不會(huì)自動(dòng)關(guān)閉資源。以下兩種方式都可以關(guān)閉資源:

  1. try..finally 方式
public static void main(String[] args) throws Exception {
    InputStream input = new FileInputStream("input.txt");
    try {
        byte[] result = new byte[1024];

        while(input.read(result) != -1){
            System.out.print(new String(result, "utf-8"));
        }
    } finally {
        if(input != null) {
            input.close();
        }
    }

}
  1. try(resource)

實(shí)現(xiàn)了 Closeable 接口的 InputStream 和 OutputStream 使用 try(resource) 時(shí),編譯器會(huì)自動(dòng)增加 finally。

public static void main(String[] args) throws Exception {
    try (OutputStream out = new FileOutputStream("out.txt")){
        out.write("編譯器會(huì)添加 finally".getBytes());
    }

}

總結(jié)

今天就是簡單地給大家介紹 Java 的 IO 流,為接下來學(xué)其他 IO 類打個(gè)基礎(chǔ)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • IO
    IO
    +關(guān)注

    關(guān)注

    0

    文章

    436

    瀏覽量

    39084
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6909

    瀏覽量

    88849
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3004

    瀏覽量

    73900
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2960

    瀏覽量

    104565
  • 磁盤
    +關(guān)注

    關(guān)注

    1

    文章

    367

    瀏覽量

    25180
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    IO與NIO有何區(qū)別

    NIO 提到IO,這是Java提供的一套類庫,用于支持應(yīng)用程序與內(nèi)存、文件、網(wǎng)絡(luò)間進(jìn)行數(shù)據(jù)交互,實(shí)現(xiàn)數(shù)據(jù)寫入與輸出。JDK自從1.4版本后,提供了另一套類庫NIO,我們平時(shí)習(xí)慣稱呼為NEW IO
    的頭像 發(fā)表于 09-25 11:00 ?848次閱讀
    <b class='flag-5'>IO</b>與NIO有何區(qū)別

    javaIO與Guava工具

    Guava IO 日常系統(tǒng)交互,文件的上傳下載都是常見的,一般我們會(huì)通過jdk提供的IO操作庫幫助我們實(shí)現(xiàn)。IO指的是數(shù)據(jù)相對(duì)當(dāng)前操作程序的入與出,將數(shù)據(jù)通過 輸出
    的頭像 發(fā)表于 09-25 16:24 ?703次閱讀

    Java的輸入輸出盤點(diǎn)

    Java分為兩種,一種是字節(jié)流,另一種是字符,分別由四個(gè)抽象類來表示(每種包括輸入和輸出兩種所以一共四個(gè)):InputStream
    發(fā)表于 07-11 07:56

    Java NIO編程理論基礎(chǔ)之Java IO及l(fā)inux網(wǎng)絡(luò)IO模型發(fā)展

    Java NIO編程理論基礎(chǔ)篇——Java IO的發(fā)展以及l(fā)inux網(wǎng)絡(luò)IO模型
    發(fā)表于 07-18 12:40

    javaIO演進(jìn)之路概述

    第一章 javaIO演進(jìn)之路
    發(fā)表于 07-24 16:53

    淺析javaIO模型

    java IO初識(shí)與Linux網(wǎng)絡(luò)IO模型簡介
    發(fā)表于 08-05 06:28

    javaIO和單片機(jī)的IO口整體對(duì)比

    作為從本科學(xué)單片機(jī)出身筆者,對(duì)IO口獨(dú)有情鐘,這里對(duì)javaIO和單片機(jī)的IO口整體對(duì)比一
    發(fā)表于 01-18 08:28

    基于數(shù)據(jù)Java字節(jié)碼分析

    本文基于數(shù)據(jù)框架理論,提出了如何將數(shù)據(jù)分析方法應(yīng)用于JAVA 字節(jié)碼,通過建立數(shù)據(jù)與半格、數(shù)據(jù)
    發(fā)表于 12-25 13:22 ?9次下載

    java與文件實(shí)驗(yàn)

    實(shí)驗(yàn)10 與文件一、實(shí)驗(yàn)?zāi)康?1. 理解數(shù)據(jù)的概念2. 理解Java的層次結(jié)構(gòu)3. 理解文件的概念二、實(shí)驗(yàn)要求 1. 掌握字節(jié)流
    發(fā)表于 09-23 19:04 ?1901次閱讀

    javaio分析

    一、的概念 (stream)的概念源于UNIX管道(pipe)的概念。在UNIX,管道是一條不間斷的字節(jié)流,用來實(shí)現(xiàn)程序或進(jìn)程間的通信,或讀寫外圍設(shè)備、外部文件等。 一個(gè)
    發(fā)表于 09-27 14:51 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>中</b>的<b class='flag-5'>io</b><b class='flag-5'>流</b>分析

    關(guān)于javaio知識(shí)總結(jié)詳解

    一、Java io的開始:文件 1. 我們主要講的是的本質(zhì)也是對(duì)文件的處理,我們循序漸進(jìn)一步一步從文件將到流去。 2. java 處理
    發(fā)表于 09-28 13:20 ?0次下載

    基礎(chǔ):Java IO學(xué)習(xí)總結(jié)

    IO的分類 根據(jù)處理數(shù)據(jù)類型的不同分為:字符和字節(jié)流 根據(jù)數(shù)據(jù)流向不同分為:輸入流和輸出
    發(fā)表于 03-08 14:38 ?2064次閱讀

    Java并行存在的問題及解決辦法詳解

    對(duì)于從事Java開發(fā)的童鞋來說,相信對(duì)于Java8的并行并不陌生,沒錯(cuò),我們常常用它來執(zhí)行并行任務(wù),但是由于并行(parallel stream)采用的是享線程池,可能會(huì)對(duì)我們的性
    發(fā)表于 04-03 15:55 ?12次下載

    JAVANIO通過MappedByteBuffer操作大文件

    java io操作通常采用BufferedReader,BufferedInputStream等帶緩沖的IO類處理大文件,不過java n
    的頭像 發(fā)表于 05-05 23:42 ?3482次閱讀

    java的字符分析

    上次聊到了 java 的 字符 Reader ,今天來看看它的好朋友 Writer 字符。 Writer java
    的頭像 發(fā)表于 10-10 15:38 ?545次閱讀