Java 如果没有';我不知道要预先分配多少字节?

Java 如果没有';我不知道要预先分配多少字节?,java,initialization,bytebuffer,Java,Initialization,Bytebuffer,这是: ByteBuffer buf = ByteBuffer.allocate(1000); …初始化字节缓冲的唯一方法是什么 如果我不知道需要分配多少字节怎么办 编辑:更多详细信息: 我正在将一个图像文件格式转换为TIFF文件。问题是起始文件格式可以是任意大小,但我需要将TIFF中的数据写入little endian。所以我先把我最终要打印到TIFF文件的东西读到ByteBuffer中,这样我就可以把所有东西都放在Little Endian中,然后我要把它写到outfile中。我想既然我知

这是:

ByteBuffer buf = ByteBuffer.allocate(1000);
…初始化
字节缓冲的唯一方法是什么

如果我不知道需要分配多少字节怎么办

编辑:更多详细信息:


我正在将一个图像文件格式转换为TIFF文件。问题是起始文件格式可以是任意大小,但我需要将TIFF中的数据写入little endian。所以我先把我最终要打印到TIFF文件的东西读到ByteBuffer中,这样我就可以把所有东西都放在Little Endian中,然后我要把它写到outfile中。我想既然我知道IFD有多长,头有多长,并且我可以计算出每个图像平面中有多少字节,我就可以在整个过程中使用多个ByteBuffers。

这只是一个缓冲区,而不是整个数据。当您读取块、处理块(可能在其他地方写入)时,它是数据的临时休息点。所以,给自己分配一个足够大的“块”,这通常不会成为问题


您预计会出现什么问题?

您将使用
ByteBuffer
的位置类型通常是您将使用字节数组(也有固定大小)的位置类型。对于同步I/O,您通常使用字节数组,而对于异步I/O,则使用ByteBuffers

如果您需要使用<代码> ByteBuffer < /代码>读取未知量的数据,请考虑使用缓冲区<强>循环< /强>并将数据追加到AS中。完成后,调用

toByteArray()
以获取最终的字节数组

当您不能绝对确定给定输入的大小(或最大大小)时,在循环中读取(可能使用
ByteArrayOutputStream
,但在读取时仅将数据作为流处理)是处理该数据的唯一方法。如果没有某种循环,任何剩余的数据当然都会丢失

例如:

final byte[] buf = new byte[4096];
int numRead;

// Use try-with-resources to auto-close streams.
try(
  final FileInputStream fis = new FileInputStream(...);
  final ByteArrayOutputStream baos = new ByteArrayOutputStream()
) {
  while ((numRead = fis.read(buf)) > 0) {
    baos.write(buf, 0, numRead);
  }

  final byte[] allBytes = baos.toByteArray();

  // Do something with the data.
}
catch( final Exception e ) {
  // Do something on failure...
}
如果您想编写Java
int
s或其他非原始字节的东西,您可以将
ByteArrayOutputStream
包装在以下文件中:

视情况而定

图书馆 对于大多数问题域,转换文件格式往往是一个已解决的问题。例如:

final byte[] buf = new byte[4096];
int numRead;

// Use try-with-resources to auto-close streams.
try(
  final FileInputStream fis = new FileInputStream(...);
  final ByteArrayOutputStream baos = new ByteArrayOutputStream()
) {
  while ((numRead = fis.read(buf)) > 0) {
    baos.write(buf, 0, numRead);
  }

  final byte[] allBytes = baos.toByteArray();

  // Do something with the data.
}
catch( final Exception e ) {
  // Do something on failure...
}
  • 可以在各种图像格式(包括TIFF)之间进行转码
  • 可以在office电子表格格式之间转换
  • 可以从降价生成HTML
名单很长。第一个问题应该是,“什么可以完成这项任务?”如果性能是一个考虑因素,那么您最好将时间花在优化现有软件包以满足您的需求上,而不是编写另一个工具。(作为奖励,其他人可以从集中工作中受益。)


已知量
  • 读取文件?分配
    file.size()
    字节
  • 复制字符串?分配
    string.length()
    字节
  • 复制TCP数据包?例如,分配1500字节
未知数 当字节数确实未知时,可以执行以下操作:

  • 猜猜看
  • 分析要缓冲的示例数据集;使用平均长度
例子 Java的
StringBuffer
,除非另有说明,否则使用初始缓冲区大小来容纳16个字符。填充16个字符后,将分配一个新的较长数组,然后复制原始16个字符。如果
StringBuffer
的初始大小为1024个字符,那么重新分配就不会过早或频繁发生

优化 无论如何,这可能是一个过早的优化。通常,当您想要减少执行的内部内存重新分配的数量时,您会分配一组字节


这不太可能成为应用程序的瓶颈。

A
StringBuffer
的行为不同。如果您尝试添加更多内容,
ByteBuffer
只会抛出一个
BufferOverflowException
。能否使用ByteArrayOutputStream给出一个示例?比如说一个整数?@PaulaKristin现在就检查一下(我还修复了tearrayoutPutstream
链接中坏掉的