从IOException恢复:网络名称不再可用

Shi*_*iro 5 java io file-io exception-handling ioexception

我正在尝试读取一个大的(700GB)文件并逐步处理它,但我正在处理的网络偶尔会关闭,切断对该文件的访问.这会抛出一个java.io.IOException告诉我"指定的网络名称不再可用".是否有一种方法可以捕获此异常并等待,例如,十五分钟,然后重试读取,或者一旦访问该文件丢失,读取器对象是否被炒掉?

如果连接丢失后读取器变得无用,有没有办法可以重写这个,以便让我"保存我的位置",然后从那里开始我的读取,而不必阅读和丢弃所有之前的数据呢?即使只是在没有处理数据的情况下咀嚼数据也需要花费很长时间才能完成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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的时间.

And*_*rte 4

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

read+=br.read(buff);
Run Code Online (Sandbox Code Playgroud)

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

br.skip(read);
Run Code Online (Sandbox Code Playgroud)

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

  • 一些“InputStream”实现还支持“mark()”方法,它允许您基本上保存在流中的位置。也可能有用... (2认同)