IOException后的Java重试

IOException后的Java重试,java,inputstream,ioexception,Java,Inputstream,Ioexception,如果我有我期望的流,有时可能会抛出一个IOException,并希望捕获异常并重试流将在哪里(即,标记是否仍在最后一次成功读取块/字节之后)?我是否可以简单地捕获异常并执行相同的读取(byte[]),并期望不会丢失数据?谢谢。有些IOException是致命的,您无法期望继续。确保连续重试可能成功。(即,检查手头的异常是否可恢复。)您可以尝试使用(我是开发人员)的mark()/reset()方法、AOP和Java注释。读取的函数如下所示(伪代码): 如果在stream.read(字节,0,长度)

如果我有我期望的流,有时可能会抛出一个
IOException
,并希望捕获异常并重试流将在哪里(即,标记是否仍在最后一次成功读取块/字节之后)?我是否可以简单地捕获异常并执行相同的
读取(byte[])
,并期望不会丢失数据?谢谢。

有些IOException是致命的,您无法期望继续。确保连续重试可能成功。(即,检查手头的异常是否可恢复。)

您可以尝试使用(我是开发人员)的
mark()
/
reset()
方法、AOP和Java注释。读取的函数如下所示(伪代码):


如果在
stream.read(字节,0,长度)抛出IOException
调用
mark()
将不会发生,下一次调用
reset()
将指针设置到上一个位置。

据我所知,您必须重新开始并启动新的流。为什么您期望IOException?这几乎适用于除“超时”IOException之外的所有情况,例如SocketTimeoutException。-1这些广泛、全面的概括总是错误的。我今天有一个IOException(ConnectException),我对它进行了指数退避/重试,它恢复并继续。OP没有指定特定类型的IOException。作为一个类,您必须将IOException视为致命的。如果你有一个特定的子类,当然会有可恢复的错误。这就是为什么你的泛化(IOExceptions是致命的)是错误的@DonBranson重新连接时,您没有重用相同的
套接字
:因此,对于原始
套接字
,这不算“非致命”。失败后的第二个
Socket.connect()
调用无效:您将得到“非套接字上的套接字操作”,即它是致命的。套接字上唯一可以恢复的
IOException
SocketTimeoutException
@RetryOnFailure(attempts = 5)
private byte[] read(InputStream stream, int length) {
  stream.reset();
  byte[] bytes = new byte[length];
  stream.read(bytes, 0, length);
  stream.mark(length);
  return bytes;
}