0

10000 乱数の行を生成してファイルに保存しようとしています。スペースで区切られた行に新しい乱数を追加し続けます。しかし、数回繰り返した後、追加された文字列が空 (?) になり、System.out.println を使用してコンソールに行を出力しようとしても表示されず、ファイルには何も書き込まれません。このコードは、n=10、n=100、n=1000 の場合、まったく問題なく動作します。

私のコードの下を見つけてください

import java.io.BufferedWriter;
import java.io.FileWriter;

public class RandomNumber {

    public static void main(String[] args) {

    try {

        int n = 10000;
        String line = ""; // Have tried StringBuilder too, doesn't help
        for (int i = 0; i < n; i++) {
            int temp = (int) Math.ceil((Math.random() * n));
            line = line+temp+" ";
            System.out.println(line);
        }
        FileWriter fstream = new FileWriter("input" + n + ".txt");
        BufferedWriter out = new BufferedWriter(fstream);
        out.write(line);
        out.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
    }
}

編集: out.write に使用されていた for ループを削除しました。不要でした。String 配列を使用していたときに使用していました。

4

4 に答える 4

0

ループ内で連結を使用しないでください。次のように使用StringBuilderします。

import java.io.BufferedWriter;
import java.io.FileWriter;

public class RandomNumber {

    public static void main(String[] args) {

    try {

        int n = 10000;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            int temp = (int) Math.ceil((Math.random() * n));
            sb.append(temp).append(" ");
        }
        FileWriter fstream = new FileWriter("input" + n + ".txt");
        BufferedWriter out = new BufferedWriter(fstream);
        out.write(sb.toString());
        out.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
    }
}
于 2012-12-01T08:08:45.693 に答える
0

1000個の乱数で単一のファイルを作成する代わりに、1000個のファイルを作成していますこれを確認してください。これを実行してみてください。役に立ちます。

try {

    int n = 10;
    String line = "";
    for (int i = 0; i < n; i++) {
        int temp = (int) Math.ceil((Math.random() * n));
        line = line+temp+" ";
        System.out.println(line);
    }
    FileWriter fstream = new FileWriter("D:/workspace/StackOverflow/src/fileread/test.txt");
    BufferedWriter out = new BufferedWriter(fstream);
              out.write(line);

    out.close();
} catch (Exception e) {
    System.err.println("Error: " + e.getMessage());
}

コンソール出力:

4 
4 10 
4 10 7 
4 10 7 1 
4 10 7 1 4 
4 10 7 1 4 5 
4 10 7 1 4 5 1 
4 10 7 1 4 5 1 4 
4 10 7 1 4 5 1 4 8 
4 10 7 1 4 5 1 4 8 4 

test.txt -- コンテンツ

4 10 7 1 4 5 1 4 8 4 
于 2012-12-01T07:55:48.190 に答える
0

これを試して

import java.io.BufferedWriter;
import java.io.FileWriter;

public class RandomNumber {

    public static void main(String[] args) {

    try {

        int n = 10000;
        String line = "";
        for (int i = 0; i < n; i++) {
            int temp = (int) Math.ceil((Math.random() * n));
            line = line+temp+" ";
            System.out.println(line);
        }

        System.out.println("file name is :: input" + n + ".txt");
        FileWriter fstream = new FileWriter("input" + n + ".txt");
        BufferedWriter out = new BufferedWriter(fstream);
        // till here you were correct.
        // you don't need the loop here...
        out.write(line);
        out.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
    }
}

こちらもご覧ください。


編集 1

あなたのプログラムは n=10、n=100、n=1000 で正常に動作しているため、Eclipse のヒープ サイズを増やすことをお勧めします。

于 2012-12-01T08:19:59.830 に答える
-1

本当に長い行が 1 つだけ必要な場合は、変数に格納するのではなく、ループに記述する必要があります。

問題は、文字列が非常に長くなり(以下のコードで48kbのファイルを取得した)、メモリ不足になることだと思います。OutOfMemoryException などをスローしないのは奇妙ですが。

public static void main(String[] args) {

    try {

        int n = 10000;
        FileWriter fstream = new FileWriter("input" + n + ".txt");
        BufferedWriter out = new BufferedWriter(fstream);

        for (int i = 0; i < n; i++) {
            int temp = (int) Math.ceil((Math.random() * n));
            out.write(temp+" ");
            out.flush();
        }
        out.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}
于 2012-12-01T08:02:00.680 に答える