Java FileInputStream 限制为 65535 字节

Java FileInputStream limited to 65535 bytes

我有一个程序正在打开一个 fileInputStream,读取它并将其写入输出流。

我正在使用 AIX。

当我从终端 运行 时,没有任何问题。然而,当我的第三方应用程序 运行s 它时,它遇到一个问题,即 FileInputStream 只从文件中读取前 65535 个字节,然后下一次调用 .read() 函数 returns -1 ,即使文件略大于 65535 字节(它是 68372 字节)。这会生成一个 t运行 的输出文件。

我的问题是,什么会导致此限制?它似乎不是 FileInputStream 的固有限制。我怀疑某处设置了 java 选项,但我终生无法确定位置。这会不会是 OS 某种限制?

这是我的基本代码:

OutputStream lOut = new FileOutputStream("/home/fileOut.txt");
FileInputStream fIn = new FileInputStream(new File("/home/fileIn.txt"));
int ch;
byte[] buf = new byte[65536];

while((ch = fIn.read(buf)) > 0)
{
    lOut.write(buf);
}

fIn.close();
lOut.close();

先不说你的测试代码有问题;请参阅@EJP 的评论。 (是的。他 >><< 正确。相信我/他。)

My question is, what can cause this limitation?

据我所知,没有这样的限制。

It doesn't appear to be an intrinsic limit of FileInputStream.

没有。

I suspect there is a java option being set somewhere but I can't for the life of me determine where.

没有会导致此行为的 JVM 选项1

Could this be an OS limitation somehow?

理论上是的。或者它可能是文件系统驱动程序中的错误/限制、"resource limit"(请参阅 "man ulimit")或存储介质错误。实际上,所有这些解释都不太可能。但是您可以通过使用已知有效的 OS 实用程序尝试读取...或复制...相同的文件来确认此问题。


实际上,我怀疑真正的问题是您尝试使用的第三方应用程序2中的错误。它可能是与您的测试代码中的错误类似的错误,或者其他问题。


1 - 有点夸张。如果第 3 方应用做了一些 非常愚蠢的事情 (即捕获和压缩 Throwable),那么理论上将堆大小设置得太小可能会 "cause" 这种行为。如果您遇到这样的问题,请尽快更换供应商!

2 - 明确地说,"third party application" 是由第三方编写和提供的应用程序。您/您的组织是第一方,您的 JVM 供应商是第二方...