【问题标题】:Recovering from IOException: network name no longer available从 IOException 中恢复:网络名称不再可用
【发布时间】:2011-12-24 19:27:18
【问题描述】:

我正在尝试读取一个大 (700GB) 文件并逐步处理它,但我正在处理的网络偶尔会出现故障,从而切断对文件的访问。这会引发 java.io.IOException 告诉我“指定的网络名称不再可用”。有没有一种方法可以捕获此异常并等待,例如,十五分钟,然后重试读取,或者一旦失去对文件的访问权限,Reader 对象是否会被炸掉?

如果一旦连接丢失,阅读器就变得无用,有没有办法可以重写它,让我“保存我的位置”,然后从那里开始阅读,而无需阅读和丢弃之前的所有数据吗?即使只是咀嚼数据而不进行处理,也需要很长时间才能通过 500GB 的数据。

目前,代码看起来像这样(为简洁而编辑):

class Processor {
    BufferedReader br;

    Processor(String fname) {
        br = new BufferedReader(new FileReader("fname"));
    }

    void process() {
        try {
            String line;
            while((line=br.readLine)!=null) {
                ...code for processing the line goes here...
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

感谢您的宝贵时间。

【问题讨论】:

  • 他一定是黑了索尼的人...... 700GB 天哪......

标签: java file-io exception-handling io ioexception


【解决方案1】:

您可以跟踪变量中的读取字节数。例如,这里我在一个名为 read 的变量中跟踪,buff 是 char[]。不确定是否可以使用 readLine 方法。

read+=br.read(buff);

那如果需要重启,可以跳过那么多字节

br.skip(read);

然后你就可以继续处理了。祝你好运

【讨论】:

  • 一些InputStream 实现还支持mark() 方法,它可以让您基本上将您的位置保存在流中。也可能有用...
【解决方案2】:

我怀疑在此错误之后底层 fd 是否仍然可用,但您必须尝试一下。更有可能您将不得不重新打开文件并跳到您之前的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2010-09-30
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多