溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

深入淺析Java中IO流的字節(jié)流

發(fā)布時間:2020-11-19 16:07:50 來源:億速云 閱讀:122 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)深入淺析Java中IO流的字節(jié)流,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Java中IO流 字節(jié)流實例詳解

IO流(輸入流、輸出流),又分為字節(jié)流、字符流。

  流是磁盤或其它外圍設(shè)備中存儲的數(shù)據(jù)的源點或終點。

  輸入流:程序從輸入流讀取數(shù)據(jù)源。數(shù)據(jù)源包括外界(鍵盤、文件、網(wǎng)絡(luò)…),即是將數(shù)據(jù)源讀入到程序的通信通道。

  輸出流:程序向輸出流寫入數(shù)據(jù)。將程序中的數(shù)據(jù)輸出到外界(顯示器、打印機、文件、網(wǎng)絡(luò)…)的通信通道。

字節(jié)流

  1.InputStream、OutputStream

  InputStream抽象了應(yīng)用程序讀取數(shù)據(jù)的方式

  OutputStream抽象了應(yīng)用程序?qū)懗鰯?shù)據(jù)的方式

  2.讀到文件結(jié)尾,稱為EOF = end,讀到-1就讀到結(jié)尾

  3.輸入流基本方法

  int b = in.read();讀取一個字節(jié),無符號填充到int的低八位.-1是EOF

  int.read(byte[] buf)讀取數(shù)據(jù)填充到字節(jié)數(shù)組buf

  int.read(byte[] buf, int start, int size)讀取數(shù)據(jù)填充到字節(jié)數(shù)組buf,從buf的start位置開始存儲size長度的數(shù)據(jù)

  4.輸出流基本方法

  out.write(int b);寫出一個byte到流,b的低八位

  out.write(byte[] buf);將buf字節(jié)數(shù)組都寫入到流

  out.write(byte[] buf, int start, int size);字節(jié)數(shù)組buf從start位置開始寫size長度的字節(jié)到流

  5.FileInputStream是InputStream的子類,具體實現(xiàn)了在文件上讀取數(shù)據(jù)

    6.FileOutputStream是OutputStream的子類,實現(xiàn)了向文件中寫出字節(jié)數(shù)據(jù)的方法

  FileInputStream的demo:

package com.test.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtils {
  /**
   * 讀取指定文件內(nèi)容,按照十六進制輸出到控制臺
   * 并且每輸出10個byte換行
   * @param fileName
   * @throws IOException
   */
  public static void printHex(String fileName) throws IOException {
    //把文件作為字節(jié)流進行讀操作
    FileInputStream in = new FileInputStream(fileName);
    int b;
    int i = 1;
    while ((b = in.read()) != -1) {
      if (b <= 0xf) {
        System.out.print("0");
      }
      System.out.print(Integer.toHexString(b) + " ");
      if (i % 10 == 0) {
        System.out.println("");
      }
      i++;
    }
    in.close();
  }

  public static void printHexByByteArray(String fileName) throws IOException {
    FileInputStream in = new FileInputStream(fileName);
    byte[] buf = new byte[20*1024];
    
    //如果字節(jié)數(shù)組夠大,可以一次性讀完
    //從in中批量讀取字節(jié),放入到buf這個字節(jié)數(shù)組中,從第0個位置開始放,最多放buf.length個,返回的是讀到的字節(jié)的個數(shù)
    /* int bytes = in.read(buf, 0, buf.length);
    int j = 1;
    for(int i = 0;i < bytes; i++) {
      if (buf[i] <= 0xf) {
        System.out.print("0");
      }
      System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
      if (j % 10 == 0) {
        System.out.println("");
      }
      j++;
    } */
    
    //如果字節(jié)數(shù)組不夠大,不能一次性讀完
    int bytes = 0;
    int j = 1;
    while ((bytes = in.read(buf, 0, buf.length)) != -1) {
      for (int i = 0; i <bytes; i++) {
        if (buf[i] <= 0xf) {
          System.out.print("0");
        }
        System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
        if (j % 10 == 0) {
          System.out.println("");
        }
        j++;
      }
    }
  }

}

  FileOutputStream的demo:

package com.test.io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputDemo {

  public static void main(String[] args) throws IOException {
    //如果該文件不存在,則直接創(chuàng)建,如果存在,刪除后創(chuàng)建。(如果第二個參數(shù)為 true,則將字節(jié)寫入文件末尾處,而不是寫入文件開始處。)
    FileOutputStream out = new FileOutputStream("F:\\javaio\\out.dat");
    out.write('A');//寫入了‘A'的低八位(一次只寫入一個字節(jié))
    int a = 10;
    out.write(a >>> 24);
    out.write(a >>> 16);
    out.write(a >>> 8);
    out.write(a);
    
    byte[] b = "10".getBytes();
    out.write(b);
    
    out.close();
    
    IOUtils.printHex("F:\\javaio\\out.dat");    
  }
}

  7.DataOutputStream和DataInputStream,對流功能的擴展,可以更加方便的讀取int,long,字符等類型數(shù)據(jù)。

package com.test.io;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputDemo {

  public static void main(String[] args) throws IOException {
    String file = "F:\\javaio\\b.txt";
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
    dos.writeInt(10);
    dos.writeInt(-10);
    dos.writeLong(10l);
    dos.writeDouble(10.5);
    dos.writeUTF("你好");
    dos.writeChars("中國");
    dos.close();
    IOUtils.printHex(file);
  }
}

  運行結(jié)果:

00 00 00 0a ff ff ff f6 00 00 
00 00 00 00 00 0a 40 25 00 00 
00 00 00 00 00 06 e4 bd a0 e5 
a5 bd 4e 2d 56 fd 

  其中,00 06兩個字節(jié)是“你好”這兩個中文的字節(jié)個數(shù)。

package com.test.io;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataInputDemo {

  public static void main(String[] args) throws IOException {
    String file = "F:\\javaio\\b.txt";
    DataInputStream dis = new DataInputStream(new FileInputStream(file));
    int i = dis.readInt();
    System.out.println(i);
    i = dis.readInt();
    System.out.println(i);
    long l = dis.readLong();
    System.out.println(l);
    double d = dis.readDouble();
    System.out.println(d);
    String s = dis.readUTF();
    System.out.println(s);
    dis.close();
  }

}

  運行結(jié)果:

10
-10
10
10.5
你好

   8.BufferedInputStream&BufferedOutputStream,這兩個流類為IO提供了帶緩沖區(qū)的操作,一般打開文件進行寫入或讀取操作時,都會加上緩沖,這種流模式提高了IO的性能。

  文件的拷貝:

package com.test.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtils {/**
   * 拷貝文件,字節(jié)批量讀取
   * @param srcFile 源文件
   * @param destFile 目標(biāo)文件
   * @throws IOException
   */
  public static void copyFile(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    byte[] buf = new byte[10*1024];
    int b;
    while ((b = in.read(buf, 0, buf.length)) != -1) {
      out.write(buf,0,b);
      out.flush();//最好加上,刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)。
    }
    in.close();
    out.close();
  }
  /**
   * 拷貝文件,利用帶緩沖的字節(jié)流
   * @param srcFile
   * @param destFile
   * @throws IOException
   */
  public static void copyFileByBuffer(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    
    BufferedInputStream bis = new BufferedInputStream(in);
    BufferedOutputStream bos = new BufferedOutputStream(out);
    
    int c;
    while ((c = bis.read()) != -1) {
      bos.write(c);
      bos.flush();
    }
    
    bis.close();
    bos.close();
  }
  /**
   * 拷貝文件,通過單字節(jié)讀取
   * @param srcFile
   * @param destFile
   * @throws IOException
   */
  public static void copyFileByByte(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    
    int c;
    while ((c = in.read()) != -1) {
      out.write(c);
      out.flush();
    }
    
    in.close();
    out.close();
  }
}

  測試文件拷貝:

package com.test.io;

import java.io.File;
import java.io.IOException;

public class IOUtilsTest {

  public static void main(String[] args) {
    //IOUtils.printHex("D:\\javaProgram\\Hello.java");
    try {
      long start = System.currentTimeMillis();
      //IOUtils.copyFile(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\2.mp3"));//211ms
      //IOUtils.copyFileByBuffer(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\3.mp3"));//18583ms
      IOUtils.copyFileByByte(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\4.mp3"));//37822ms
      long end = System.currentTimeMillis();
      System.out.println(end - start);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

上述就是小編為大家分享的深入淺析Java中IO流的字節(jié)流了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI