ioutils的多个方面详解

一、ioutils.write

ioutils.write方法用于将指定字节数组的所有字节写入输出流中。这个方法有四个参数:输出流,要写入的字节数组,开始写入的下标和要写入的字节数。必要时,这个方法会等待输出流变成可用的。

/**
 * 将指定字节数组的所有字节写入输出流中。 注意: 当前方法调用后会调用流的flush()方法,强制将所有缓冲输出到流中。
 *
 * @param data 要写入的字节数组。
 * @param output 写入的输出流。
 * @throws IOException 如果向流中写入字节出错。
 */
public static void write(byte[] data, OutputStream output) throws IOException {
    if (data != null) {
        output.write(data);
    }
}

一般来说,这个方法是很安全的,因为 它对开发者来说非常方便——它做了所有必要的流管理操作,开发者完全不必自己写写缓冲区之类的代码。 实际上,这个方法将自动优化缓存策略,尽可能快地推送字节流到输出流。

二、ioutils.tobytearray内存溢出

ioutils.tobytearray方法用于将指定输入流的字节内容读取到字节数组中。 请注意,此方法会将整个输入流读入内存,这就意味着 如果输入流非常大,那么可能会遇到内存耗尽的问题。

/**
 * 将指定输入流的字节内容读取到字节数组中。 请注意,此方法会将整个输入流读入内存,因此可能会造成内存耗尽的风险。
 *
 * @param input 要读取的输入流
 * @return 读取到的字节数组。
 * @throws IOException 如果读取输入流出错
 */
public static byte[] toByteArray(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    copy(input, output);
    return output.toByteArray();
}

如果您确定要将大量数据读入字节数组,那么可以考虑分段处理数据。要做到这一点,您可以传递一个带有偏移和长度参数的方法调用。这可以使分段操作成为可能。

三、ioutils.close

ioutils.close方法可以安全而简单地关闭任何可能抛出异常的流对象。使用try-with-resources块调用ioutils.close方法可以确保在所使用的流上正确地关闭所有资源。必须注意的是,如果列表中有多个流对象被打开,那么可以使用该方法将它们同时关闭。

/**
 * 安全地关闭指定的输入输出流。这个方法是安全的:如果流对象为空,它什么也没做。
 *
 * @param outputStream 输出流对象
 * @param inputStream  输入流对象
 */
public static void close(OutputStream outputStream, InputStream inputStream) {
    try {
        if (outputStream != null) {
            outputStream.close();
        }
        if (inputStream != null) {
            inputStream.close();
        }
    } catch (Exception e) {
        // ignore exception.
    }
}

四、ioutils.tostring

ioutils.tostring方法用于将指定输入流的内容转换为字符串。 这个方法还可以允许程序员设置字符编码,以确保所有字节正确地转换为字符串。 如果未设置字符编码,则默认使用UTF-8。

/**
 * 将指定输入流的内容转换为字符串。 这个方法还可以允许程序员设置字符编码,以确保所有字节正确地转换为字符串。
 *
 * @param input 输入流
 * @param charsetName 字符编码, 默认为UTF-8
 * @return 读取到的字符串。
 * @throws IOException 如果读取输入流出错
 */
public static String toString(InputStream input, String charsetName) throws IOException {
    StringBuilderWriter sw = new StringBuilderWriter();
    copy(input, sw, charsetName);
    return sw.toString();
}

这个方法可以用于对网络流和文件流进行编码转换和字符序列操作。建议在我们的应用程序中使用这个方法时使用try-with-resource结构。

五、ioutils.readfully

ioutils.readfully方法用于从指定的输入流中读取完整的字节数组。这个方法保证将读取到指定字节数量的所有字节,并支持在读取到末尾时关闭流。

/**
 * 从输入流中读取完整的字节数据。这个方法保证将读取到指定字节数量的所有字节,并支持在读取到末尾时关闭流。
 *
 * @param input 输入流.
 * @param byteCount 读取的字节数.
 * @return 读取到的字节数组.
 * @throws IOException 如果源流出现故障或无法读取到完整字节.
 */
public static byte[] readFully(InputStream input, int byteCount) throws IOException {
    byte[] result = new byte[byteCount];
    int remaining = byteCount;
    int offset = 0;
    int readCount;
    while (remaining > 0) {
        readCount = input.read(result, offset, remaining);
        if (readCount < 0) {
            break;
        }
        remaining -= readCount;
        offset += readCount;
    }

    if (remaining != 0) {
        throw new EOFException("InputStream ended before reading required bytes");
    }

    return result;
}

使用这个方法的时候,建议加上一个合理的字符编码选择,以便能够在UTF-8或其他字符编码模式中正常读写所需的整字节数量。

六、ioutils.tobytearray

ioutils.tobytearray是ioutils.toByteArray的重载版本,支持设置最大长度。这个方法将读取并返回输入流中的所有可用数据,并且不会关闭流。

/**
 * 将指定输入流的内容完整数据读入到字节数组中。 注意:数据读取后,流不会被关闭。
 *
 * @param input 要读取的输入流
 * @param size  读取的字节数
 * @return 读取的字节数组。
 * @throws IOException 如果读取输入流出错
 */
public static byte[] toByteArray(InputStream input, int size) throws IOException {
    if (size < 0) {
        throw new IllegalArgumentException("Invalid size: " + size);
    }
    byte[] data = new byte[size];
    int offset = 0;
    int readCount;
    while (offset < size) {
        readCount = input.read(data, offset, size - offset);
        if (readCount < 0) {
            break;
        }
        offset += readCount;
    }

    if (offset != size) {
        throw new IOException("Failure creating byte array: expected " + size + " bytes, but read " + offset + " bytes");
    }

    return data;
}

这个方法可以用于读取大对象等情形,但是在读取到末尾之前始终需要处理批量读取所覆盖的字节数。

七、IOUtils.copy

IOUtils.copy方法用于将一个输入流复制到另一个输出流中,并允许在复制过程中选择设置缓冲区的大小。

/**
 * 从一个输入流复制到另一个输出流。缓冲区的大小指定为DEFAULT_BUFFER_SIZE。这个方法保证在复制源流时使用缓冲区。
 *
 * @param input  输入流.
 * @param output 输出流.
 * @throws IOException 如果复制时出现故障.
 */
public static void copy(InputStream input, OutputStream output) throws IOException {
    copy(input, output, DEFAULT_BUFFER_SIZE);
}

/**
 * 从一个输入流复制到另一个输出流。这个方法可以指定输出流的缓冲区大小,以确保优化数据传输速度。
 *
 * @param input  输入流.
 * @param output 输出流.
 * @param bufferSize  缓冲区大小.
 * @throws IOException 如果复制时出现故障.
 */
public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException {
    byte[] buffer = new byte[bufferSize];
    int count;
    while ((count = input.read(buffer)) != -1) {
        output.write(buffer, 0, count);
    }
}

使用这个方法时,可以根据实际情况选择合适的缓存大小以及输出流的类型。

原创文章,作者:NMVR,如若转载,请注明出处:https://www.506064.com/n/145793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NMVRNMVR
上一篇 2024-10-27 23:52
下一篇 2024-10-27 23:52

相关推荐

  • 为什么Python不能编译?——从多个方面浅析原因和解决方法

    Python作为很多开发人员、数据科学家和计算机学习者的首选编程语言之一,受到了广泛关注和应用。但与之伴随的问题之一是Python不能编译,这给基于编译的开发和部署方式带来不少麻烦…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • 从多个方面用法介绍yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授权过程中,需要进行确认和配置级别控制的全能编程开发工程师。 一、授权确…

    编程 2025-04-29
  • 从多个方面zmjui

    zmjui是一个轻量级的前端UI框架,它实现了丰富的UI组件和实用的JS插件,让前端开发更加快速和高效。本文将从多个方面对zmjui做详细阐述,帮助读者深入了解zmjui,以便更好…

    编程 2025-04-28
  • 学Python用什么编辑器?——从多个方面评估各种Python编辑器

    选择一个适合自己的 Python 编辑器并不容易。除了我们开发的应用程序类型、我们面临的软件架构以及我们的编码技能之外,选择编辑器可能也是我们编写代码时最重要的决定之一。随着许多不…

    编程 2025-04-28
  • 使用easypoi创建多个动态表头

    本文将详细介绍如何使用easypoi创建多个动态表头,让表格更加灵活和具有可读性。 一、创建单个动态表头 easypoi是一个基于POI操作Excel的Java框架,支持通过注解的…

    编程 2025-04-28
  • 创建列表的多个方面

    本文将从多个方面对创建列表进行详细阐述。 一、列表基本概念 列表是一种数据结构,其中元素以线性方式组织,并且具有特殊的序列位置。该位置可以通过索引或一些其他方式进行访问。在编程中,…

    编程 2025-04-28
  • Python多个sheet表合并用法介绍

    本文将从多个方面对Python多个sheet表合并进行详细的阐述。 一、xlrd与xlwt模块的基础知识 xlrd与xlwt是Python中处理Excel文件的重要模块。xlrd模…

    编程 2025-04-27
  • 从多个角度用法介绍lower down

    lower down是一个常用于编程开发中的操作。它可以对某个值或变量进行降低精度的处理,非常适合于一些需要精度不高但速度快的场景。那么,在本文中,我们将从多个角度解析lower …

    编程 2025-04-27

发表回复

登录后才能评论