2017-10-02 5 views
2

私は少しstackoverflowを検索しましたが、私はこの問題の答えを見つけることができないようです。プログラムが.txtファイルへの書き込みが遅れていますか?

私のCSクラスの私の現在の宿題は、5000個の乱数のファイルから読み込み、データを配列に入れたり、何回何回何回何回見るか、何が最長の増加シーケンスです。私はそれだけでうまくいったすべてを持っている。

これに加えて、ファイルを上書きして5000の新しい乱数を作成して、自分のコードが複数の異なるテストケースで動作することを確認する方法を追加しています。

ほとんどの場合、このメソッドは機能しますが、呼び出した後はプログラムの残りの部分が終了するまで「アクティブ化」しないように見えます。私がそれを実行して数値を変更するように指示した場合、プログラムで変更された値を実際に見るためには再度実行する必要があります。これを修正する方法はありますか?

は、データhere-制御ケースを変更しようとしていない:データを変更間の遅延を示す

電流出力。

elkshadow5$ ./CompileAndRun.sh 

Create a new set of numbers? Y for yes. n 
What number are you looking for? 66 
66 was found 1 times. 
The longest sequence is [606, 3170, 4469, 4801, 5400, 8014] 
It is 6 numbers long. 

数字はここで変更する必要がありますが、変更する必要はありません。

elkshadow5$ ./CompileAndRun.sh 

Create a new set of numbers? Y for yes. y 
What number are you looking for? 66 
66 was found 1 times. 
The longest sequence is [606, 3170, 4469, 4801, 5400, 8014] 
It is 6 numbers long. 

データは、それが変わったのことを示して今、データの後に実行が変更されている必要があります。

elkshadow5$ ./CompileAndRun.sh 

Create a new set of numbers? Y for yes. n 
What number are you looking for? 1 
1 was found 3 times. 
The longest sequence is [1155, 1501, 4121, 5383, 6000] 
It is 5 numbers long. 

マイコード:

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Scanner; 

public class jeftsdHW2 { 
static Scanner input = new Scanner(System.in); 

public static void main(String args[]) throws Exception { 
    jeftsdHW2 random = new jeftsdHW2(); 
    int[] data; 
    data = new int[5000]; 
    random.readDataFromFile(data); 
    random.overwriteRandNums(); 
} 
public int countingOccurrences(int find, int[] array) { 
    int count = 0; 
    for (int i : array) { 
     if (i == find) { 
      count++; 
     } 
    } 
    return count; 
} 
public int[] longestSequence(int[] array) { 
    int[] sequence; 
    return sequence; 
} 
public void overwriteRandNums() throws Exception { 
    System.out.print("Create a new set of numbers? Y for yes.\t"); 
    String answer = input.next(); 
    char yesOrNo = answer.charAt(0); 
    if (yesOrNo == 'Y' || yesOrNo == 'y') { 
     writeDataToFile(); 
    } 
} 
public void readDataFromFile(int[] data) throws Exception { 
    try { 
     java.io.File infile = new java.io.File("5000RandomNumbers.txt"); 
     Scanner readFile = new Scanner(infile); 

     for (int i = 0; i < data.length; i++) { 
      data[i] = readFile.nextInt(); 
     } 
     readFile.close(); 
    } catch (FileNotFoundException e) { 
     System.out.println("Please make sure the file \"5000RandomNumbers.txt\" is in the correct directory before trying to run this."); 
     System.out.println("Thank you."); 
     System.exit(1); 
    } 
} 
public void writeDataToFile() throws Exception { 
    int j; 
    StringBuilder theNumbers = new StringBuilder(); 
    try { 
     PrintWriter writer = new PrintWriter("5000RandomNumbers.txt", "UTF-8"); 
     for (int i = 0; i < 5000; i++) { 
      if (i > 1 && i % 10 == 0) { 
       theNumbers.append("\n"); 
      } 
      j = (int) (9999 * Math.random()); 
      if (j < 1000) { 
       theNumbers.append(j + "\t\t"); 
      } else { 
       theNumbers.append(j + "\t"); 
      } 
     } 
     writer.print(theNumbers); 
     writer.flush(); 
     writer.close(); 
    } catch (IOException e) { 
     System.out.println("error"); 
    } 
} 
} 
+0

撮影にどれくらいの時間がかかりません。 –

+1

は、あなたの最も_シーケンスです_コードは毎回ファイルから読み取りますか?コードのその部分を共有することはできますか? –

+0

どのくらいの時間がかかるか表示しようとしましたが、プログラムの実行が終了するまでファイルに書き込まれません。 longestSequenceが表示されている番号が次回の実行時まで変更されていないため、「検出」しています – elkshadow5

答えて

-1

ファイルが物理的にディスクに書き込まれていない可能性があるフラッシュを使用すると、Javaドキュメントhereから、このために十分ではありません。

このストリームの目的地が、ファイルなどの基礎となるオペレーティングシステムによって提供される抽象である場合、ストリームをフラッシュすると、以前にストリームに書き込まれたバイトだけがストリームに渡されます。書くためのオペレーティングシステム。実際にディスクドライブなどの物理デバイスに書き込まれることを保証するものではありません。

HDDの読み書き速度のため、できるだけHDDアクセスに依存することをお勧めします。

おそらく、再実行して使用するときに乱数列をリストに格納することは、解決策になります。ディスクにリストを書き込むこともできますが、この方法では、ファイルが書き込まれる時間に依存しません。

EDIT

OPはそれが私の元の答えは、問題にrelatedeされていないことが明らかになったそのコードの多くを掲示した後。それにもかかわらず、それは健全です。

掲載されたコードOPは、書き込み後にファイルをいつ読んでいるのかわかりません。彼は読んだ後にファイルに書いているようですが、もちろん誤りとして認識されています。執筆後に読むことは、あなたが望むことをするプログラムを作り出すはずです。 のId EST、この:

random.readDataFromFile(data); 
random.overwriteRandNums(); 

は、次の実行まで反映されます。これは:

random.overwriteRandNums(); 
random.readDataFromFile(data); 

現在の実行で更新されたファイルを使用します。

+2

問題ではありません。読み込みのためにファイルを再び開くと、ファイルに書き込まれた内容が読み込まれます。 – EJP

+0

私はもちろん、あなたに同意します。私の答えの目的は、OPが問題を解決しようとすることができ、実装を簡素化して試行する理由を提供し、提案されたアプローチが十分でない場合(I/O部分を削除することによって) 。しかし、私はあなたに同意します。 –

関連する問題