在 Java 中转换输入流为字节数组

Mohammad Irfan 2023年10月12日
  1. 使用 Java 中的 readAllBytes() 方法将 InputStream 转换为字节数组
  2. 使用 Java 中的 toByteArray() 方法将输入流转换为字节数组
  3. 使用 Java 中的 write() 方法将输入流转换为字节数组
  4. 使用 Java 中的 readAllBytes() 方法将 InputStream 转换为字节数组
  5. 使用 Java 中的 readFully() 方法将 InputStream 转换为字节数组
  6. 使用 Java 中的 getBytes() 方法将输入流转换为字节数组
  7. 使用 Java 中的自定义代码将输入流转换为字节数组
  8. 使用 Java 中的 toByteArray() 方法将输入流转换为字节数组
在 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

相关文章 - Java IO