2016-04-28 6 views
0

私のプログラムでテキストファイルを読み込んでいて、ファイルを変更した後、プログラムを停止せずにファイルを繰り返し読み込みます。私はファイルの最新バージョンを読むことができるはずです。しかし、最初にファイルを変更した後は、まだそのファイルのバージョンを取得していますが、他の変更が適用されていないようです。ここ は、私は、ファイルを読み込む方法です:プログラムを停止せずに反復してテキストファイルを更新した後に読む

public static Map<String, Float> readOwnersBiasFile() throws IOException { 
FileInputStream file = new FileInputStream("ownersBias.txt"); 
Map<String, Float> ownerBiasMap = new HashMap<String, Float>(); 
//Construct BufferedReader from InputStreamReader 
BufferedReader br = new BufferedReader(new InputStreamReader(file)); 

    String line = null; 
    while ((line = br.readLine()) != null) { 
     String[] var = line.split("\\^"); 
     ownerBiasMap.put(var[0], Float.valueOf(var[1])); 
    } 

    br.close(); 
    return ownerBiasMap; 

} 、ここでは、私は私の変更を保存する方法です:

public static void storeOwnersUtilityMap(Map<String, Float> ownersUtilityMap) throws IOException { 
    FileInputStream fileInputStream = null; 
    InputStreamReader inputStreamReader = null; 
    BufferedReader bufferedReader = null; 
    List<String> lines = new ArrayList<String>(); 
    try { 
     fileInputStream = new FileInputStream("ownersBias.txt"); 
     inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8"); 
     bufferedReader = new BufferedReader(inputStreamReader); 

     String s; 

     String[] var; 
     if (bufferedReader.readLine() == null) { 
      for (Map.Entry<String, Float> entry : ownersUtilityMap.entrySet()) { 
       lines.add(entry.getKey().concat("^").concat(String.valueOf(entry.getValue()))); 
      } 
     } else 
      while ((s = bufferedReader.readLine()) != null) { 

       var = s.split("\\^"); 
       if (ownersUtilityMap.containsKey(var[0])) 
        s = var[0].concat("^").concat(String.valueOf(ownersUtilityMap.get(var[0]))); 
       lines.add(s); 
      } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     IOUtils.closeQuietly(bufferedReader); 
     IOUtils.closeQuietly(inputStreamReader); 
     IOUtils.closeQuietly(fileInputStream); 
    } 

    fileWriter(lines, "ownersBias.txt"); 

}

private static void fileWriter(List<String> list, String fileName) throws IOException { 
    File fout = new File(fileName); 
    FileOutputStream fos = new FileOutputStream(fout); 

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos)); 
    Iterator<String> iterator = list.iterator(); 
    while (iterator.hasNext()) { 
     bw.write(iterator.next()); 
     bw.newLine(); 
    } 

    bw.close(); 
} 

そして、私が持っている私のメインの方法でテキストファイルの読み込みと変更に伴ういくつかの処理を行うループです。

public static void main(String[] args) throws IOException, TasteException { 
for(int i=0;i<10;i++){ 
map= readOwnersBiasFile(); 
do some stuff; 
storeOwnersUtilityMap(map); 
} 
} 
+0

コンパイルする実際のコードを教えてください。それはあなたが2つの方法を統合したようです – Dici

+0

私は説明を更新しました。 – HimanAB

+0

ファイルを繰り返し読み込んだ後、ファイルに書き戻そうとするのではなく、RandomAccessFileを使用してファイルに追加するだけです。 – pczeus

答えて

0

再読み込みの間にプログラムを終了する必要はありません。同じファイルを読み込んで外部的な変更を行うプログラムを作成しました。それで私は作品を知っている部分です。

トップメソッドのreadOwnersBiasFile()は、すべてを明示的に閉じるとは思われません。 BufferedReaderは閉じられていますが、InputStreamReaderまたはFileInputStreamは閉じられていません。メソッドを終了するとき、オブジェクトには参照がないため、ガベージコレクションでそれらを見つける必要があります。タイミングが問題になる可能性があります。私は、Closeableのものを試してみることをお勧めします。

特に、同じJVMからの書き込みと読み取りの両方を行っている場合は、オペレーティングシステムによって違いが生じる場合があります。たとえば、Windowsでは既に開いているファイルを削除/移動/名前変更することはできませんが、* nixできます。私が知りません(部分的に私はあなたがランタイムプラットフォームであるかどうかわからないからです)JVMがファイルハンドルを扱いにくくなっているかどうかと、変更がファイルの前に書かれたものから書き出されないように再利用しようとしているかどうかです読んだり何でも。

Fileオブジェクトのプロパティを調べる価値がある場合は、サイズの変更が表示されているか、最後に変更された日付が変更されたか、または実際に差分を取得している可能性があることを確認してください。

マルチスレッドや何をしているのかにかかわらず、あなたが呼び出している順序(特にコードの最初の2ブロック)については何も教えてくれません。マルチスレッド環境でのオープン/読み取り/書き込みに問題がある可能性があります

関連する問題