2014-11-20 2 views
1

Я умеренно опытный парень C++, медленно изучающий Java. Я пишу программу, которая должна сделать следующее:Неоднократно записывать в файл

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

Я изучал различные способы сделать это, и это рабочий код, который я придумал. Есть два файла, «PeteProgram.java» и «PeteFileMgr.java»:

/* 
"PeteProgram.java" 
*/ 

import java.io.*; 
import java.lang.String; 

public class PeteProgram { 

    public static void main(String[] args) throws IOException { 

     String PeteFilename="MyRecordsFile.txt"; 
     Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(PeteFilename), "utf-8")); 
     PeteFileMgr MyPeteFileMgr = new PeteFileMgr(writer); 

     MyPeteFileMgr.AddThisString(writer, "Add this line #1\n"); 
     MyPeteFileMgr.AddThisString(writer, "Add this line #2\n"); 
     MyPeteFileMgr.AddThisString(writer, "Add this line #3\n"); 

    } 
} 


//===================================================================================================== 
//===================================================================================================== 


/* 
"PeteFileMgr.java" 
*/ 

import java.io.*; 

public class PeteFileMgr { 

    public PeteFileMgr(Writer writer) { 

     try { 
      writer.write("File created!"); 

      } catch (IOException ex) { 
      // report 
      } finally { 
      try {writer.close();} catch (Exception ex) {} 
      } 
     } 

    void AddThisString(Writer writer, String AddThis) { 

    try { 
      writer.append(AddThis); 

      } catch (IOException ex) { 
      // report 
      } finally { 
      try {writer.close();} catch (Exception ex) {} 
      } 
     } 
    } 

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

Кто-нибудь видит мою ошибку?

 Many thanks! 
      -P 

ответ

3

Это потому, что вы не смываете Writer. Вы должны позвонить по телефону flush время от времени. Кроме того, вы должны closeв конце вашего приложения, а не после записи в него содержимого. close метод автоматически очищает содержимое записи.

Итак, это то, как ваш код должен выглядеть следующим образом:

public class PeteProgram { 
    public static void main(String[] args) { 
     String peteFilename = "MyRecordsFile.txt"; 
     //here's when the physical file is created 
     Writer writer = null; 
     try { 
      writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(peteFilename), "utf-8")); 
     PeteFileMgr peteFileMgr = new PeteFileMgr(writer); 

     peteFileMgr.addThisString(writer, "Add this line #1\n"); 
     peteFileMgr.addThisString(writer, "Add this line #2\n"); 
     peteFileMgr.addThisString(writer, "Add this line #3\n"); 
     } catch (IOException e) { 
      //handle the exception 
      //basic handling 
      e.printStacktrace(); 
     } finally { 
      //this is a must! 
      try { writer.close(); } catch(IOException silent) { } 
     } 
    } 
} 

public class PeteFileMgr { 
    public PeteFileMgr(Writer writer) { 
     try { 
      //this method is not creating the physical file 
      writer.write("File created!"); 
     } catch (IOException ex) { 
      // report 
     } finally { 
      //remove this call to close 
      //try {writer.close();} catch (Exception ex) {} 
     } 
    } 

    public void addThisString(Writer writer, String addThis) { 
     try { 
      writer.append(addThis); 
     } catch (IOException ex) { 
      // report 
     } finally { 
      //remove this call to close 
      //try {writer.close();} catch (Exception ex) {} 
     } 
    } 
} 

Или при использовании Java 7 или выше с помощью try-with-resources:

public class PeteProgram { 
    public static void main(String[] args) { 
     String peteFilename = "MyRecordsFile.txt"; 
     //here's when the physical file is created 
     try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(peteFilename), "utf-8"))) { 
     PeteFileMgr peteFileMgr = new PeteFileMgr(writer); 

     peteFileMgr.addThisString(writer, "Add this line #1\n"); 
     peteFileMgr.addThisString(writer, "Add this line #2\n"); 
     peteFileMgr.addThisString(writer, "Add this line #3\n"); 
     } catch (IOException e) { 
      //handle the exception 
      //basic handling 
      e.printStacktrace(); 
     } 
    } 
} 
+0

Вызов 'writer.close()' должен все еще находятся в блоке 'finally' в' main'. –

+0

Отлично! Это сработало блестяще ...! Большое спасибо :) – Pete

Смежные вопросы