All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.io.FastByteArrayOutputStream Maven / Gradle / Ivy

There is a newer version: 5.8.33
Show newest version
package cn.hutool.core.io;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjectUtil;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

/**
 * 基于快速缓冲FastByteBuffer的OutputStream,随着数据的增长自动扩充缓冲区
 * 

* 可以通过{@link #toByteArray()}和 {@link #toString()}来获取数据 *

* {@link #close()}方法无任何效果,当流被关闭后不会抛出IOException *

* 这种设计避免重新分配内存块而是分配新增的缓冲区,缓冲区不会被GC,数据也不会被拷贝到其他缓冲区。 * * @author biezhi */ public class FastByteArrayOutputStream extends OutputStream { private final FastByteBuffer buffer; /** * 构造 */ public FastByteArrayOutputStream() { this(1024); } /** * 构造 * * @param size 预估大小 */ public FastByteArrayOutputStream(int size) { buffer = new FastByteBuffer(size); } @Override public void write(byte[] b, int off, int len) { buffer.append(b, off, len); } @Override public void write(int b) { buffer.append((byte) b); } public int size() { return buffer.size(); } /** * 此方法无任何效果,当流被关闭后不会抛出IOException */ @Override public void close() { // nop } public void reset() { buffer.reset(); } /** * 写出 * @param out 输出流 * @throws IORuntimeException IO异常 */ public void writeTo(OutputStream out) throws IORuntimeException { final int index = buffer.index(); if(index < 0){ // 无数据写出 return; } byte[] buf; try { for (int i = 0; i < index; i++) { buf = buffer.array(i); out.write(buf); } out.write(buffer.array(index), 0, buffer.offset()); } catch (IOException e) { throw new IORuntimeException(e); } } /** * 转为Byte数组 * @return Byte数组 */ public byte[] toByteArray() { return buffer.toArray(); } @Override public String toString() { return toString(CharsetUtil.defaultCharset()); } /** * 转为字符串 * @param charsetName 编码 * @return 字符串 */ public String toString(String charsetName) { return toString(CharsetUtil.charset(charsetName)); } /** * 转为字符串 * @param charset 编码,null表示默认编码 * @return 字符串 */ public String toString(Charset charset) { return new String(toByteArray(), ObjectUtil.defaultIfNull(charset, CharsetUtil.defaultCharset())); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy