3

たとえば、「people.txt」というテキスト ファイルがあり、次の情報が含まれているとします。

 1 adam 20 M
 2 betty 49 F
 3 charles 9 M
 4 david 22 M
 5 ethan 41 M
 6 faith 23 F
 7 greg 22 M
 8 heidi 63 F

基本的に、最初の数字はその人の ID で、次にその人の名前、年齢、性別が続きます。行 2、または ID 番号 2 の人を別の値に置き換えたいとします。RandomAccessFile名前は常に同じバイト数であるとは限らず、年齢も同じではないため、これを使用できないことはわかっています。ランダムな Java フォーラムを検索しているときに、自分のニーズにはStringBuilderorStringBufferで十分であることがわかりましたが、どちらも実装方法がわかりません。テキストファイルに直接書き込むために使用できますか? これをユーザー入力から直接機能させたい。

4

2 に答える 2

7

あなたのための例を作成しました

public static void main(String args[]) {
        try {
            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream("d:/new6.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String strLine;
            StringBuilder fileContent = new StringBuilder();
            //Read File Line By Line
            while ((strLine = br.readLine()) != null) {
                // Print the content on the console
                System.out.println(strLine);
                String tokens[] = strLine.split(" ");
                if (tokens.length > 0) {
                    // Here tokens[0] will have value of ID
                    if (tokens[0].equals("2")) {
                        tokens[1] = "betty-updated";
                        tokens[2] = "499";
                        String newLine = tokens[0] + " " + tokens[1] + " " + tokens[2] + " " + tokens[3];
                        fileContent.append(newLine);
                        fileContent.append("\n");
                    } else {
                        // update content as it is
                        fileContent.append(strLine);
                        fileContent.append("\n");
                    }
                }
            }
            // Now fileContent will have updated content , which you can override into file
            FileWriter fstreamWrite = new FileWriter("d:/new6.txt");
            BufferedWriter out = new BufferedWriter(fstreamWrite);
            out.write(fileContent.toString());
            out.close();
            //Close the input stream
            in.close();
        } catch (Exception e) {//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }
于 2012-06-19T12:19:06.443 に答える
0

1 つの解決策として、ファイルを 1 行ずつ読み込み、必要な行を操作し (ID/名前などを取得するために解析/トークン化を実行します)、すべての行をファイルに書き込みます (現在のファイルを上書きします)。コンテンツ)。この解決策は、作業しているファイルのサイズによって異なります。ファイルが大きすぎると、すべてのコンテンツを一度にメモリに保持するため、大量のメモリが消費されます。

(メモリ要件を削減するための)別のアプローチは、ファイルを行ごとに処理することですが、すべての行をメモリに保持する代わりに、各行の処理後に現在の行を一時ファイルに書き込み、一時ファイルを移動します入力ファイルの場所に移動します (そのファイルを上書きします)。

クラスFileReaderFileWriterファイルの読み取り/書き込みを支援する必要があります。パフォーマンスを向上させるために、それらをBufferedReader/でラップすることをお勧めします。BufferedWriter

また、ファイルの読み取り (書き込み) が完了したら、リーダー (ライターも) を閉じることを忘れないでください。そのため、ファイルがまだ開いているためにファイルへの結果的なアクセスがブロックされることはありません。

于 2012-06-19T12:00:06.270 に答える