Восстановление из IOException: имя сети больше не доступно - PullRequest
5 голосов
/ 09 ноября 2011

Я пытаюсь прочитать большой (700 ГБ) файл и постепенно обработать его, но сеть, в которой я работаю, иногда отключается, закрывая доступ к файлу.Это вызывает исключение java.io.IOException, сообщающее, что «указанное сетевое имя больше не доступно».Есть ли способ, которым я могу перехватить это исключение и подождать, скажем, пятнадцать минут, а затем повторить чтение, или объект Reader перезаписывается после потери доступа к файлу?

Если средство чтения отображаетсябесполезно, когда соединение потеряно, есть ли способ, которым я могу переписать это таким образом, чтобы я мог «сохранить свое место», а затем начать свое чтение оттуда без необходимости читать и отбрасывать все данные перед этим?Даже просто копируя данные без обработки, требуется 500 ГБ, чтобы их обработать.

В настоящее время код выглядит примерно так (отредактировано для краткости):

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();
        }
    }
}

СпасибоВы за свое время.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

Вы можете отслеживать прочитанные байты в переменной.Например, здесь я отслеживаю переменную read, а buff - это char [].Не уверен, что это возможно, используя метод readLine.

read+=br.read(buff);

Тогда, если вам нужно перезапустить, вы можете пропустить столько байтов

br.skip(read);

Затем вы можете продолжить обработку.Удачи

0 голосов
/ 09 ноября 2011

Я сомневаюсь, что базовый fd все еще будет использоваться после этой ошибки, но вам придется попробоватьСкорее всего, вам придется заново открыть файл и перейти туда, где вы были до.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...