📌  相关文章
📜  Java程序将文件转换为字节数组,反之亦然(1)

📅  最后修改于: 2023-12-03 15:16:37.849000             🧑  作者: Mango

Java程序将文件转换为字节数组,反之亦然

在开发过程中,我们经常需要将文件转换为字节数组或将字节数组转换为文件。Java提供了很多种不同的方法来实现这一目标。

将文件转换为字节数组
方式一:使用InputStream和ByteArrayOutputStream

使用InputStream和ByteArrayOutputStream可以将文件转换为字节数组。具体实现如下:

public static byte[] convertFileToByteArray(String filePath) throws IOException {
    byte[] buffer = new byte[8192];
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try (InputStream input = new FileInputStream(filePath)) {
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
        }
    }
    return output.toByteArray();
}

代码解析:

  1. 初始化缓冲区大小为8192字节。
  2. 初始化ByteArrayOutputStream,用于存放文件的字节数组。
  3. 使用try-with-resources语句,自动关闭输入流。
  4. 从输入流中读取数据,存入缓冲区中。
  5. 将缓冲区中的数据写入到字节数组的输出流中。
  6. 返回字节数组的输出流中的字节数组。
方式二:使用FileChannel和ByteBuffer

使用FileChannel和ByteBuffer可以将文件转换为字节数组。具体实现如下:

public static byte[] convertFileToByteArray(String filePath) throws IOException {
    File file = new File(filePath);
    long fileSize = file.length();
    try (FileChannel channel = new FileInputStream(file).getChannel()) {
        ByteBuffer buffer = ByteBuffer.allocate((int) fileSize);
        while (channel.read(buffer) > 0) {
            // do nothing
        }
        return buffer.array();
    }
}

代码解析:

  1. 获取文件大小。
  2. 初始化FileChannel,用于读取文件中的数据。
  3. 初始化ByteBuffer,用于存放文件的字节数组。
  4. 从FileChannel中读取数据,存入ByteBuffer中。
  5. 返回ByteBuffer中的字节数组。
将字节数组转换为文件
方式一:使用OutputStream和ByteArrayInputStream

使用OutputStream和ByteArrayInputStream可以将字节数组转换为文件。具体实现如下:

public static void convertByteArrayToFile(byte[] bytes, String filePath) throws IOException {
    try (InputStream input = new ByteArrayInputStream(bytes)) {
        try (OutputStream output = new FileOutputStream(filePath)) {
            byte[] buffer = new byte[8192];
            int n = 0;
            while (-1 != (n = input.read(buffer))) {
                output.write(buffer, 0, n);
            }
        }
    }
}

代码解析:

  1. 初始化ByteArrayInputStream,用于读取字节数组中的数据。
  2. 初始化FileOutputStream,用于写入数据到文件中。
  3. 初始化缓冲区大小为8192字节。
  4. 从ByteArrayInputStream中读取数据,存入缓冲区中。
  5. 将缓冲区中的数据写入到输出流中。
  6. 使用try-with-resources语句,自动关闭输入流和输出流。
方式二:使用FileChannel和ByteBuffer

使用FileChannel和ByteBuffer可以将字节数组转换为文件。具体实现如下:

public static void convertByteArrayToFile(byte[] bytes, String filePath) throws IOException {
    File file = new File(filePath);
    try (FileChannel channel = new FileOutputStream(file).getChannel()) {
        ByteBuffer buffer = ByteBuffer.wrap(bytes);
        channel.write(buffer);
    }
}

代码解析:

  1. 初始化FileOutputStream,用于写入数据到文件中。
  2. 初始化FileChannel,用于写入字节数组中的数据到文件中。
  3. 初始化ByteBuffer,用于读取字节数组中的数据。
  4. 将字节数组的数据包装为ByteBuffer。
  5. 将ByteBuffer中的数据写入到FileChannel中。
  6. 使用try-with-resources语句,自动关闭FileChannel。
总结

Java提供了很多种不同的方法来实现文件与字节数组的相互转换。我们可以根据实际情况选择不同的实现方式来达到最佳的性能和效果。