Как бороться с поврежденными файлами, которые были созданы, но возникла IOException? - PullRequest
0 голосов
/ 21 июля 2011

Не могли бы вы подсказать, как справиться с этими ситуациями? Я понимаю, что во втором примере это очень редко случается в Unix, не так ли? Если права доступа в порядке. Также файл не будет даже создан. Я не понимаю, почему существует IOException, создано оно или нет, почему мы должны беспокоиться об IOException?

Но в первом примере будет поврежденный файл зомби. Теперь, если вы скажете пользователю загрузить его снова, то же самое может произойти. Если вы не можете этого сделать, и у входного потока нет маркера. Вы теряете свои данные? Мне действительно не нравится, как это делается в Java, я надеюсь, что новый ввод-вывод в Java 7 лучше

Обычно это удалить

public void inputStreamToFile(InputStream in, File file) throws SystemException {

    OutputStream out;
    try {
        out = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        throw new SystemException("Temporary file created : " + file.getAbsolutePath() + " but not found to be populated", e);
    }

    boolean fileCorrupted = false;
    int read = 0;
    byte[] bytes = new byte[1024];

    try {
        while ((read = in.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
    } catch (IOException e) {
        fileCorrupted = true;
        logger.fatal("IO went wrong for file : " + file.getAbsolutePath(), e);
    } finally {
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(out);

                    if(fileCorrupted) {
        ???
                    }
    }
}


public File createTempFile(String fileId, String ext, String root) throws SystemException {

    String fileName = fileId + "." + ext;

    File dir = new File(root);

    if (!dir.exists()) {
        if (!dir.mkdirs())
            throw new SystemException("Directory " + dir.getAbsolutePath() + " already exists most probably");
    }

    File file = new File(dir, fileName);

    boolean fileCreated = false;
    boolean fileCorrupted = false;
    try {
        fileCreated = file.createNewFile();
    } catch (IOException e) {
        fileCorrupted = true;
        logger.error("Temp file " + file.getAbsolutePath() + " creation fail", e);
    } finally {

        if (fileCreated)
            return file;
        else if (!fileCreated && !fileCorrupted)
            throw new SystemException("File " + file.getAbsolutePath() + " already exists most probably");
        else if (!fileCreated && fileCorrupted) {

        }
    }

}

1 Ответ

1 голос
/ 21 июля 2011

Мне действительно не нравится, как это делается в Java, я надеюсь, что новый ввод-вывод в Java 7 лучше

Я не уверен, насколько Java отличается от любого другого языка программирования / среды, в которой вы его используете:

  • клиент отправляет вам данные по сети
  • когда вы читаете это, вы записываете его в локальный файл

Независимо от языка / инструментов / среды, соединение может быть прервано или потеряно, клиент может разорваться, диск погибнет или возникнет любая другая ошибка. Ошибки ввода / вывода могут возникать в любых средах.

То, что вы можете сделать в этой ситуации, сильно зависит от ситуации и возникшей ошибки. Например, структурированы ли данные таким образом, чтобы вы могли попросить пользователя возобновить загрузку, например, с записи 1000? Однако, здесь нет единого решения, которое бы подходило всем.

...