HOWTO · Java

在 Java 中轉換輸入流為位元組陣列

本文介紹瞭如何在 Java 中把輸入流轉換為位元組陣列。

本頁內容

本教程介紹瞭如何在 Java 中把輸入流轉換為位元組陣列,並列舉了一些示例程式碼來理解這個主題。

InputStream 是一個抽象類,也是所有表示位元組輸入流的類的超類。Java 使用輸入流從任何源如檔案、陣列等讀取資料。然後,我們將看到如何通過使用 Java 中的一些內建方法和自定義程式碼將該流轉換為位元組陣列。

在本文中,我們將使用幾個內建方法,如 toByteArray()readAllBytes()readFully()getBytes()write() 等,並使用一個文字檔案 abc.txt 來讀取資料。這個文字檔案中包含了一句話:Welcome to Delfstack,我們將讀到這句話並轉換成位元組陣列,進一步可以轉換成字串來檢查所需的結果。

使用 Java 中的 readAllBytes() 方法將 InputStream 轉換為位元組陣列

我們可以使用 readAllBytes() 方法將所有資料放入一個位元組陣列。這個方法返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class SimpleTesting {
  public static void main(String[] args) {
    try {
      InputStream ins = new FileInputStream("abc.txt");
      byte[] byteArray = ins.readAllBytes();
      System.out.println(new String(byteArray));
      ins.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delfstack

使用 Java 中的 toByteArray() 方法將輸入流轉換為位元組陣列

如果使用 Apache 庫,則可以使用 IOUtils 類的 toByteArray() 方法來獲取所有資料到位元組陣列中。這個方法返回一個位元組陣列,可以進一步傳遞給 String 建構函式來列印文字資料。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;

public class SimpleTesting {
  public static void main(String[] args) {
    try {
      InputStream ins = new FileInputStream("abc.txt");
      byte[] bytes = IOUtils.toByteArray(ins);
      System.out.println(new String(bytes));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delftstack

使用 Java 中的 write() 方法將輸入流轉換為位元組陣列

我們可以使用 ByteArrayOutputStream 類的 write() 方法將所有的資料轉換成一個位元組陣列。這個方法返回一個位元組陣列,可以傳遞給 String 建構函式來列印文字資料。

package myjavaproject;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class SimpleTesting {
  public static void main(String[] args) {
    try {
      InputStream ins = new FileInputStream("abc.txt");
      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
      int read;
      byte[] data = new byte[16384];
      while ((read = ins.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, read);
      }
      System.out.println(new String(data));
      ins.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delfstack

使用 Java 中的 readAllBytes() 方法將 InputStream 轉換為位元組陣列

我們可以使用 DataInputStream 類的 readAllBytes() 方法將所有資料轉換為一個位元組陣列。這個方法返回的位元組陣列可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class SimpleTesting {
  public static void main(String[] args) {
    try {
      String file = "abc.txt";
      DataInputStream dis = new DataInputStream(new FileInputStream(file));
      byte[] bytes = dis.readAllBytes();
      System.out.println(new String(bytes));
      dis.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delftstack

使用 Java 中的 readFully() 方法將 InputStream 轉換為位元組陣列

我們可以使用 RandomAccessFile 類的 readFully() 方法將所有資料轉換為位元組陣列。這個方法返回一個位元組陣列,它可以傳遞給 String 建構函式來列印文字資料。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
public class SimpleTesting {
  public static void main(String[] args) {
    try {
      String file = "abc.txt";
      InputStream is = new FileInputStream(file);
      RandomAccessFile raf = new RandomAccessFile(file, "r");
      byte[] bytesData = new byte[(int) raf.length()];
      raf.readFully(bytesData);
      System.out.println(new String(bytesData));
      is.close();
      raf.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delfstack

使用 Java 中的 getBytes() 方法將輸入流轉換為位元組陣列

我們可以使用 String 類的 getBytes() 方法將所有資料轉換成一個位元組陣列。這個方法返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    try {
      String file = "abc.txt";
      byte[] bytesData = {};
      InputStream is = new FileInputStream(file);
      try (BufferedReader buffer = new BufferedReader(new InputStreamReader(is))) {
        bytesData = buffer.lines().collect(Collectors.joining("\n")).getBytes();
      }
      System.out.println(new String(bytesData));
      is.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delftstack

使用 Java 中的自定義程式碼將輸入流轉換為位元組陣列

如果你不想使用任何內建的方法,可以使用這段自定義的程式碼將輸入流轉換為位元組陣列,這段程式碼返回一個位元組陣列,它可以進一步傳入 String 建構函式來列印文字資料。這段程式碼返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class SimpleTesting {
  public static void main(String[] args) {
    try {
      String file = "abc.txt";
      byte[] bytesData = {};
      bytesData = getBytesFromFile(new File(file));
      System.out.println(new String(bytesData));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    long length = file.length();
    byte[] bytes = new byte[(int) length];
    int offset = 0;
    int numRead = 0;
    while (
        offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
      offset += numRead;
    }
    if (offset < bytes.length) {
      throw new IOException("Could not read file " + file.getName());
    }
    return bytes;
  }
}

輸出:

Welcome to Delfstack

使用 Java 中的 toByteArray() 方法將輸入流轉換為位元組陣列

我們可以使用 ByteArrayOutputStream 類的 toByteArray() 方法將所有資料轉換為一個位元組陣列。這個方法返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class SimpleTesting {
  public static void main(String[] args) {
    try {
      String file = "abc.txt";
      InputStream is = new FileInputStream(file);
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      is.transferTo(byteArrayOutputStream);
      byte[] bytesData = byteArrayOutputStream.toByteArray();
      System.out.println(new String(bytesData));
      is.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

輸出:

Welcome to Delfstack