Java InterruptedIOException 类
最后修改时间:2025 年 4 月 16 日
java.io.InterruptedIOException
表示 I/O 操作已被中断。 当执行 I/O 的线程被中断时,会抛出此异常。 此异常继承自 IOException
并包含 bytesTransferred 字段。
InterruptedIOException
通常发生在阻塞 I/O 操作期间。 bytesTransferred 字段指示中断前传输了多少数据。 这有助于应用程序从中断处恢复操作。
InterruptedIOException 类概述
InterruptedIOException
是 Java I/O 系统中的检查型异常。 它包含一个公共字段 bytesTransferred,用于跟踪部分传输计数。 该类被各种 I/O 类(如 Socket 和 URLConnection)使用。
public class InterruptedIOException extends IOException { public int bytesTransferred = 0; public InterruptedIOException(); public InterruptedIOException(String s); }
上面的代码显示了 InterruptedIOException
的结构。 bytesTransferred 字段是公共的,可以直接访问。 两个构造函数允许创建带有或不带有消息的异常。
InterruptedIOException 基础示例
此示例演示了在网络操作期间捕获 InterruptedIOException
。 我们通过手动创建和中断线程来模拟中断。
import java.io.*; import java.net.*; public class Main { public static void main(String[] args) { Thread ioThread = new Thread(() -> { try { URL url = new URL("http://example.com"); URLConnection conn = url.openConnection(); InputStream in = conn.getInputStream(); byte[] buffer = new byte[1024]; int bytesRead = in.read(buffer); System.out.println("Read " + bytesRead + " bytes"); in.close(); } catch (InterruptedIOException e) { System.out.println("I/O interrupted after " + e.bytesTransferred + " bytes"); } catch (IOException e) { e.printStackTrace(); } }); ioThread.start(); ioThread.interrupt(); // Simulate interruption } }
此示例创建一个尝试从 URL 读取的线程。 线程立即被中断,这可能会导致 InterruptedIOException
。 catch 块处理异常并报告传输的字节数。
使用 InterruptedIOException 处理 Socket 超时
Socket 操作在超时时可能会抛出 InterruptedIOException
。 此示例演示了如何在客户端-服务器通信中处理此类情况。
import java.io.*; import java.net.*; public class Main { public static void main(String[] args) { try { Socket socket = new Socket(); socket.setSoTimeout(1000); // Set 1 second timeout // This will timeout and throw InterruptedIOException socket.connect(new InetSocketAddress("example.com", 80)); } catch (InterruptedIOException e) { System.out.println("Socket operation timed out after " + e.bytesTransferred + " bytes transferred"); } catch (IOException e) { e.printStackTrace(); } } }
此示例演示了 socket 超时处理。 setSoTimeout
方法设置 1 秒超时。 如果未及时建立连接,则会抛出 InterruptedIOException
,我们捕获并处理它。
恢复中断的文件传输
此示例演示了如何使用 InterruptedIOException
的 bytesTransferred 字段在中断后恢复文件传输。
import java.io.*; import java.util.Random; public class Main { public static void main(String[] args) { Random random = new Random(); File source = new File("source.dat"); File dest = new File("dest.dat"); try (InputStream in = new FileInputStream(source); OutputStream out = new FileOutputStream(dest)) { byte[] buffer = new byte[1024]; int totalRead = 0; while (true) { try { int bytesRead = in.read(buffer); if (bytesRead == -1) break; out.write(buffer, 0, bytesRead); totalRead += bytesRead; // Simulate random interruption if (random.nextInt(100) < 5) { throw new InterruptedIOException(); } } catch (InterruptedIOException e) { System.out.println("Transfer interrupted at " + totalRead + " bytes. Resuming..."); } } System.out.println("Transfer completed: " + totalRead + " bytes"); } catch (IOException e) { e.printStackTrace(); } } }
此示例模拟可能被中断的文件传输。 发生中断时,传输从中断的地方恢复。 此处未使用 bytesTransferred 字段,因为我们手动跟踪进度。
自定义 InterruptedIOException 处理
此示例演示了如何为 InterruptedIOException
创建自定义处理程序,该处理程序实现带有退避的重试逻辑。
import java.io.*; import java.net.*; public class Main { public static void main(String[] args) { int maxRetries = 3; int retryCount = 0; long backoffTime = 1000; // 1 second while (retryCount < maxRetries) { try { URL url = new URL("http://example.com/largefile"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); try (InputStream in = conn.getInputStream()) { byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { // Process data here } System.out.println("Download completed successfully"); break; } } catch (InterruptedIOException e) { retryCount++; System.out.println("Attempt " + retryCount + " interrupted after " + e.bytesTransferred + " bytes. Retrying in " + (backoffTime/1000) + " seconds..."); try { Thread.sleep(backoffTime); backoffTime *= 2; // Exponential backoff } catch (InterruptedException ie) { Thread.currentThread().interrupt(); break; } } catch (IOException e) { e.printStackTrace(); break; } } if (retryCount >= maxRetries) { System.out.println("Max retries reached. Operation failed."); } } }
此示例实现了一个具有重试逻辑的强大下载器。 发生 InterruptedIOException
时,它会等待并以指数退避方式重试。 bytesTransferred 字段有助于跟踪重试之间的进度。
多线程环境中的 InterruptedIOException
此示例演示了 InterruptedIOException
如何在多线程应用程序中发生以及如何正确处理它。
import java.io.*; import java.net.*; import java.util.concurrent.*; public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); Future future = executor.submit(() -> { try { ServerSocket server = new ServerSocket(8080); System.out.println("Server started"); while (!Thread.currentThread().isInterrupted()) { try { Socket client = server.accept(); System.out.println("Client connected"); InputStream in = client.getInputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { // Process client data } client.close(); } catch (InterruptedIOException e) { System.out.println("Accept interrupted"); break; } } server.close(); } catch (IOException e) { e.printStackTrace(); } }); try { Thread.sleep(2000); future.cancel(true); // Interrupt the server thread executor.shutdown(); executor.awaitTermination(1, TimeUnit.SECONDS); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }
此示例演示了一个可以正常中断的服务器。 当线程被中断时,accept
方法可能会抛出 InterruptedIOException
。 我们捕获此异常以正确清理资源。
带有 NIO 通道的 InterruptedIOException
虽然 NIO 通道通常使用不同的中断机制,但某些操作仍然可以抛出 InterruptedIOException
。 此示例显示了这样一种情况。
import java.io.*; import java.net.*; import java.nio.channels.*; public class Main { public static void main(String[] args) { try { SocketChannel channel = SocketChannel.open(); channel.configureBlocking(true); Thread interruptThread = new Thread(() -> { try { Thread.sleep(1000); channel.close(); // Force interruption } catch (Exception e) { e.printStackTrace(); } }); interruptThread.start(); try { channel.connect(new InetSocketAddress("example.com", 80)); } catch (InterruptedIOException e) { System.out.println("Channel connection interrupted"); } } catch (IOException e) { e.printStackTrace(); } } }
此示例演示了在阻塞操作期间关闭通道如何导致 InterruptedIOException
。 我们启动一个单独的线程以在延迟后关闭通道,从而中断连接尝试。
来源
Java InterruptedIOException 类文档
在本文中,我们介绍了 Java InterruptedIOException
类的基本方面。 理解此异常对于构建可以优雅地处理中断的强大 I/O 操作至关重要。
作者
列出所有Java教程。