0

「END OF CUSTOMER STATEMENT」行に沿ってディレクトリ内のテキスト ファイルを分割しようとしています。結果ファイルを一時ディレクトリに保存します。分割は最初のファイルに対してのみ発生し、他のファイルは無視されます。私のコードの問題は何ですか。forループがディレクトリ内のすべてのファイルを飲み込むと思っていましたか? これが私のコードです。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 *
 * @author Administrator
 */
public class SplitFiles {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        File f = new File("D:/statements/");
        String[] filenames = f.list();
        File[] texts = f.listFiles();
        String lines = "";
        for (int m = 0; m < filenames.length; m++) {
            try {
                 int count = 0;
                FileInputStream fs = new FileInputStream("D:/statements/" + filenames[m]);
                BufferedReader br = new BufferedReader(new InputStreamReader(fs));

                FileOutputStream fos = new FileOutputStream("D:/DFCU Statements/statement" + count + ".RPT");
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

                while ((lines = br.readLine()) != null) {
                    String mine = lines.trim();

                    if (mine.startsWith("END OF CUSTOMER STATEMENT")) {
                        bw.close();
                        count++;
                        fos = new FileOutputStream("D:/DFCU Statements/statement" + count + ".RPT");
                        bw = new BufferedWriter(new OutputStreamWriter(fos));
                        continue;
                    }
                    if (mine.isEmpty()) {
                        continue;
                    } else {
                        bw.write(lines);
                        bw.newLine();
                        bw.flush();
                    }
                }
                fos.close();
                fs.close();
                br.close();
                bw.close();
            } catch (Exception ag) {
                System.out.println(ag);
            }
        }
    }
}
4

3 に答える 3

3

そもそもこれを行うべきだと思います(おそらくもっと多くのバグがあります)

int count = 0;
for (int m = 0; m < filenames.length; m++) {
   ...

さらに、 count ++を削除し、ファイルを作成するたびに配置します。

FileOutputStream fos = new FileOutputStream("D:/DFCU Statements/statement" + count + ".RPT");
count++;

その後、期待どおりに動作します

于 2012-12-17T11:40:06.153 に答える
3

ターゲットファイルには互いに区別するものがないため(すべて名前が付けられていstatementX.RPTます)、最後のファイルが実際に出力にあるファイルであると想定していますが、これは推測にすぎません。

出力ファイルに名前"statement." + m + "." + count ".RPT"を付けるように変更してみてください。そうすれば、一意の出力ファイルが作成されます。

また、次のコメントにも注意してください。

  1. Fileクラスを使用する場合、API はより便利です (私の意見では)。取得した各ファイルから、クエリをlistFiles実行して.getNamegetPath
  2. この行について: FileInputStream fs = new FileInputStream("D:/statements/" + filenames[m]);- 得られた結果を使用した場合は、listFilesそれを置き換えることができますFileInputStream fs = new FileInputStream(files[m]);- パスをハードコーディングする必要はありません。
于 2012-12-17T11:42:57.120 に答える
1

コードを変更する必要があります。それ以外の場合、コードは 2 つの出力ファイルを作成する代わりに、3 つの出力ファイルを作成します。ここに正しいコードがあります

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 *
 * @author Administrator
 */
public class SplitFiles {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        File f = new File("D:/statements/");
        String[] filenames = f.list();
        File[] texts = f.listFiles();
        String lines = "";
         int count = 0;
        for (int m = 0; m < filenames.length; m++) {
            try {

                FileInputStream fs = new FileInputStream("D:/statements/" + filenames[m]);
                BufferedReader br = new BufferedReader(new InputStreamReader(fs));

                FileOutputStream fos = null;
                BufferedWriter bw = null;

                while ((lines = br.readLine()) != null) {
                    String mine = lines.trim();

                    if (mine.startsWith("END OF CUSTOMER STATEMENT")) {
                        if(bw!=null)
                        {
                        bw.close();
                        }
                        count++;

                        continue;
                    }
                    if (mine.isEmpty()) {
                        continue;
                    } else {
                        if(bw==null)
                        {
                             fos = new FileOutputStream("D:/DFCU Statements/statement" + count + ".RPT");
                             bw = new BufferedWriter(new OutputStreamWriter(fos));
                        }
                        bw.write(lines);
                        bw.newLine();
                        bw.flush();
                    }
                }
                fos.close();
                fs.close();
                br.close();
                bw.close();
            } catch (Exception ag) {
                System.out.println(ag);
            }
        }
    }
}
于 2012-12-17T12:11:07.227 に答える