0

最近、アプリケーション コードを見直したところ、コードに 1 つの問題が見つかりました。

/**
 * truncate cat tree(s) from the import file
 */
private void truncateCatTreesInFile(File file, String userImplCode) throws Exception
 {
     String rowStr = null, treeCode = null;
     BufferedReader reader = new BufferedReader(new FileReader(file));
     rowStr = reader.readLine(); // skip 1st row - header
     Impl impl;
     List<String> row = null;
     Set<String> truncatedTrees = new HashSet<String>();
     while ((rowStr = reader.readLine()) != null)
     {
         row = CrudServiceHelper.getRowFromFile(rowStr);
         if (row == null) continue;

         impl = getCatImportImpl(row.get(ECatTreeExportImportData.IMPL.getIndex()), userImplCode);
         treeCode = row.get(ECatTreeExportImportData.TREE_CODE.getIndex());
         if(truncatedTrees.contains(treeCode)) continue;

         truncatedTrees.add(treeCode);             
         CatTree catTree = _treeDao.findByCodeAndImpl(treeCode, impl.getId());
         if(catTree!= null) _treeDao.makeTransient(catTree);             
     }
     _treeDao.flush();   
 }

上記のコードを見ると、「リーダー」は閉じられていませんでした。問題があるのではないかと思っていましたが、実際には問題なく動作し、Tomcat でファイルを削除できます。

 javax.servlet.context.tempdir>
 [java] 2013-03-27 17:45:54,285 INFO [org.apache.struts2.dispatcher.Dispatch

ええと] -

基本的に、私がやろうとしているのは、ブラウザから 1 つのファイルをアップロードし、そのファイルに基づいて SQL を生成して、データをデータベースに挿入することです。すべて完了したら、ファイルを削除します。

このコードが正常に機能することに驚いています。誰かここにアイデアがありますか? ググってみましたが、さっぱりわかりませんでした。

ありがとう、ジャック

4

1 に答える 1

1

リーダーを閉じないと、リソース リークが発生する可能性があります。開いているファイルを削除しても、まったく問題ない場合があります。

Linux (およびその他の Unix バリアント) では、ファイルから名前のリンクを解除するだけでファイルが削除されます。名前が残っていないファイルは実際に解放されます。そのため、ファイルを開き、削除 (名前を削除) してから読み書きすることは、一時ファイルを取得するよく知られた方法です。ファイルが閉じられると、スペースは解放されますが、それ以前ではありません。

Windows では、特定のプログラムが読み取りファイルをロックします。これにより、他のプロセスがそのようなファイルを削除できなくなります。しかし、すべてのプログラムがそうしているわけではありません。Javaがこれをどのように処理するかを実際にテストするためのWindowsマシンはありません。

コードがクラッシュしないという事実は、コードが完全に正しく機能することを意味しません。リークが原因でアプリが RAM をますます多く消費している場合、気付いた問題はずっと後になって初めて目に見えるようになる可能性があります。ただし、これはありそうにありません: ガベージ コレクターは最終的にはリーダーを閉じますが、おそらくすぐに閉じますreader

于 2013-03-28T17:18:55.300 に答える