我可以安全地假设 -1 仅在流关闭时返回吗?
是的。
你不应该假设这样的事情。您应该阅读 javadoc 并根据 API 的指定行为方式进行实施。特别是如果您希望您的代码健壮(或如您所说的“安全”。)
话虽如此,这或多或少是javadoc在这种情况下所说的。(有人可能会狡辩说 EOF 和“流已关闭”不一定意味着同一件事......并且通过调用InputStream.close()
或Socket.close()
本地关闭流会产生不同的效果。但是,这些都与您的使用没有直接关系-案子。)
有没有办法重新创建连接被强行断开时发生的IO异常?
不。首先,通常不会首先抛出异常,因此通常没有什么可以“重新创建”。其次,原始异常中的信息(如果有的话)已经消失了。
我是否应该发送一个数据包来告诉我的 InputStream 它应该关闭而不是前两种方法?
不,最好的方法是测试read
调用的结果。无论如何,您都需要对其进行测试,因为您不能假设该read(byte[])
方法(或其他方法)将返回您实际要求的字节数。
我想在某些情况下抛出一个特定于应用程序的异常是可以的。
但请记住一般原则,异常不应用于正常的流控制。
其他答案之一建议创建一个代理 InputStream 抛出一些异常而不是返回-1。
IMO,这是个坏主意。您最终会得到一个声称是 的代理类InputStream
,但违反了read
方法的约定。如果代理被传递给期望正确实现的东西,这可能会导致麻烦InputStream
。
其次,InputStream
is an abstract class
not an interface
,所以 Java 的动态代理机制不起作用。(例如,该newProxyInstance
方法需要一个接口列表,而不是类。)