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