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

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

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

Java中基礎的 IO 流

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

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

IO 流

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

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

InputStream

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

圖片

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

public abstract int read() throws IOException;

以 FileInputStream 實現(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() 方法只能一個字節(jié)的一個字節(jié)讀取數(shù)據(jù),效率不高,當文件中存在多個字節(jié)為一個漢字的中文時,上面的示例將打印出亂碼。

InputStream 支持將一次性讀取多個字節(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ū)大小設置為 1024 個字節(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 一樣是一個抽象類。

圖片

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

public abstract void write(int b) throws IOException;

以 FileInputStream 實現(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() 按單個字節(jié)寫入磁盤的效率比較低下,OutputStream 提供了 write(byte[]) 一次性大批量的將字節(jié)輸出到磁盤。對于 IO 設備來說,一次性寫入 1 個字節(jié)和寫入 1000 個字節(jié)的時間都是差不多的。

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)用之前拋出異常則不會自動關(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)

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

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

}

總結(jié)

今天就是簡單地給大家介紹 Java 的 IO 流,為接下來學其他 IO 類打個基礎。

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

    關(guān)注

    0

    文章

    453

    瀏覽量

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

    關(guān)注

    8

    文章

    7104

    瀏覽量

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

    關(guān)注

    8

    文章

    3042

    瀏覽量

    74179
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2973

    瀏覽量

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

    關(guān)注

    1

    文章

    379

    瀏覽量

    25235
收藏 人收藏

    評論

    相關(guān)推薦

    IO與NIO有何區(qū)別

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

    javaIO與Guava工具

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

    Java的輸入輸出盤點

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

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

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

    javaIO演進之路概述

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

    淺析javaIO模型

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

    javaIO和單片機的IO口整體對比

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

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

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

    java與文件實驗

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

    javaio分析

    一、的概念 (stream)的概念源于UNIX管道(pipe)的概念。在UNIX,管道是一條不間斷的字節(jié)流,用來實現(xiàn)程序或進程間的通信,或讀寫外圍設備、外部文件等。 一個
    發(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知識總結(jié)詳解

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

    基礎:Java IO學習總結(jié)

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

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

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

    JAVANIO通過MappedByteBuffer操作大文件

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

    java的字符分析

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