Java ввода / вывода, запись массива в текстовый файл - PullRequest
3 голосов
/ 07 августа 2010

Я использую следующий код для записи массива в файл:

FileWriter fstream1=new FileWriter("outx.txt");
BufferedWriter out1= new BufferedWriter(fstream1);
FileWriter fstream2=new FileWriter("outy.txt");
BufferedWriter out2= new BufferedWriter(fstream2);
for(int i=0;i<320*240;i++)
{

        out1.write(0+System.getProperty("line.separator"));//
       // out1.write("\n");
        out2.write(0+System.getProperty("line.separator"));
//out2.write("\n");

}

: здесь в приведенном выше коде я ставлю все нули файл должен содержать 76800 строк (0 с), но в моем файле всего 69932 строки. в чем проблема, и если вы можете предложить другой способ сделать это.

Ответы [ 3 ]

5 голосов
/ 07 августа 2010

Вы помните, чтобы закрыть выходные потоки?Ваш пример не перечисляет вызовы close (), которые также должны очищать потоки.Поведение BufferedWriter по умолчанию - очистить (записать) оставшееся содержимое перед закрытием потока, который он буферизует.

Возможно, вам следует добавить:

out1.close ();out2.close ();

Это очень распространенный случай, когда конец файла обрезается, когда вы забыли закрыть средство записи, использованное для его создания, особенно если вы использовали BufferedOutputStream или BufferedWriter.который не может очистить свой буфер (записать его в файл), пока он не будет явно очищен (или, чаще, закрыт).

Это очень хорошая привычка - сразу писать вызов close () после открытия потока, а затем писать весь код для работы с потоком между вызовами.Принимая во внимание исключения, стандартные вызовы используют следующую идиому:

Writer myOutWriter = null;
try {
   myOutWriter = new BufferedWriter(new FileWriter("..."));
   // Write to myOutWriter here
} catch (IOException ioe) {
   // Handle any exceptions here
} finally { 
   try {
      if (myOutWriter != null) {
         myOutWriter.close();
      }
   } catch (IOException ioe) {
      // Not much you can do here
   }
}

Проект ввода-вывода Apache Commons (http://commons.apache.org/io/) имеет замечательную утилиту IOUtils.closeQuietly (), которая очищает блок finallyвключив try catch, null check и вызов close в один вызов метода. Пример использования этой библиотеки будет выглядеть так:

Writer myOutWriter = null;
try {
   myOutWriter = new BufferedWriter(new FileWriter("..."));
   // Write to myOutWriter here
} catch (IOException ioe) {
   // Handle any exceptions here
} finally { 
   IOUtils.closeQuietly(myOutWriter);
}
4 голосов
/ 07 августа 2010

Добавить:

out1.flush();
out2.flush();

После цикла for.

Вероятно, ваша программа завершает работу до того, как буферы в BufferedReader были сброшены, что является распространенной проблемой при работе с буферизованнымивывод.

Редактировать: более правильное решение будет:

public static void main(String[] args) throws IOException {
    final String outputString = "0" + System.getProperty("line.separator");
    BufferedWriter out1 = null;
    BufferedWriter out2 = null;
    try {
        out1 = new BufferedWriter(new FileWriter("outx.txt"));
        out2 = new BufferedWriter(new FileWriter("outy.txt"));
        for(int i = 0; i < 320 * 240; i++) {
            out1.write(outputString);
            out2.write(outputString);
        }
        out1.flush(); // Not really needed as close will flush, but it is 
        out2.flush(); // useful for describing the intent of the code
    } finally {
        closeQuietly(out1);
        closeQuietly(out2);
    }
}

private static void closeQuietly(Closeable c) {
    try {
        if (c != null) {
            c.close();
        }
    } catch (Exception e) {
        // No-op
    }
}
1 голос
/ 07 августа 2010

Как уже отмечали другие, вполне вероятно, что в ваших буферах есть незаполненные данные.

Допустимый способ переписать ваш код будет выглядеть так:

Writer out1 = new FileWriter("outx.txt");
try {
  out1 = new BufferedWriter(out1);
  Writer out2 = new FileWriter("outy.txt");
  try {
    out2 = new BufferedWriter(out2);
    for (int i = 0; i < 320 * 240; i++) {
      out1.write(0 + System.getProperty("line.separator"));
      out2.write(0 + System.getProperty("line.separator"));
    }
  } finally {
    out2.close();
  }
} finally {
  out1.close();
}

Этот код:

  • будет сбрасывать данные с помощью close
  • всегда будет освобождать файловые дескрипторы с помощью close, даже если произойдет ошибка (при использовании finally)
  • подчиняется контракту для Closeable классов
  • не обходится без исключений null или ласточка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...