0

私のプログラムは、PhotoAlbumに写真のコレクションを保持することを想定しています。写真のフォルダを読み取ることから始めて、それらを私のPhotoAlbumに追加します。次に、ユーザーがすべての写真を一覧表示し、写真を追加し、写真を検索し、保存して、プログラムを終了できるメニューを印刷します。現在、プログラムを実行すると100枚の写真がPhotoAlbumに追加されますが、保存せずにプログラムを終了すると、写真を追加したりPhotoAlbumに何もしていなくても、読み取っているファイルがクリアされます。理由はわかりません。

これがファイルに印刷するための私の方法です:

private static void saveFile(PrintWriter writer) {
 String result;
  ArrayList<Photo> temp = album.getPhotoAlbum();
  for (int i = 0; i < temp.size(); i++){
   result = temp.get(i).toString() + "\n";
   writer.println(result);
  }
  writer.close();
 }

そして、PrintWriterがインスタンス化される場所:

File file = new File(args[0] + File.separator + "album.dat");

try {
   PrintWriter fout =  
new PrintWriter(new FileWriter(file));
   fileWriter = fout;
  } catch (IOException e){
   System.out.println("ReadFromFile: Folder " + args[0]
                          + " is not found.");
   System.exit(0);
  }

そして、それが私のrunMenuメソッドで呼び出される場所:

private static void runMainMenu(Scanner scan) {
  String input;
  do {
   showMainMenu();
  input = scan.nextLine().toLowerCase();
  switch (input.charAt(0)) {
  case 'p':
   System.out.println(album.toString());
   break;
  case 'a': 
  album.addPhoto(readPhoto(scan, t));
   break;
  case 'f':
  findMenu(scan);
   break;
  case 's':
   saveFile(fileWriter);
   System.exit(0);
   break;
  case 'q':
   break;
  default:
   System.out.println("Invalid entry: " + 
     input.charAt(0));
   break;
  }
  } while (!input.equalsIgnoreCase("q"));
 }
4

3 に答える 3

3

おそらく、ストリームを開いた後、ストリームを閉じていません。開いている場合は、(実際に変更するときだけでなく)どのような場合でも実行する必要があります。

そのため、finallyブロックはJavaで役立ちます。ここで、Javaストリームの使用に関する優れたプラクティスを確認してください。

于 2010-04-19T16:21:53.230 に答える
0

FileオブジェクトをPrintWriterに渡してファイルを開くと、基本的にPrintWriterにファイルの開き方(ほとんどの場合Create)を制御させ、既存のファイルを削除して新しいファイルを書き込みの準備をします。

保存(ストリームを閉じる)しないため、PrintWriterにバッファリングされたデータはファイルに出力されません。

File.Open(...)関数を使用する場合は、追加セッションを指定できるため、ファイルアプローチをリファクタリングする必要があります。

FileStream outStream = File.Open(myFileName, FileMode.Append);
PrintWriter pw = new PrintWriter(outStream);

このように、ファイルを開くだけでファイルがクリアされることはなく、最後に追加することができます。

または、FileMode.Createでファイルを開くことにより、必要なときにファイルを強制的にクリアすることができます。

PSあなたはusingブロックについて学ぶべきです、それは非常に便利です。

于 2010-04-19T16:29:05.420 に答える
0

ストリームを閉じていることを確認してください。また、元のファイルを上書きしていないことを確認してください。Aren BはいくつかのC#コードを提供しましたが、Javaに相当するものは次のようになります。

PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
于 2010-04-19T17:17:44.990 に答える