0

我正在尝试沿“客户声明结束”行拆分目录中的文本文件,并将结果文件存储到临时目录中。拆分仅针对第一个文件发生,而忽略另一个文件,我的代码有什么问题。我期待 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该类时,listFilesAPI 更有用(在我看来) - 从您获得的每个文件中,您可以查询getNamegetPath.
  2. 关于这一行:FileInputStream fs = new FileInputStream("D:/statements/" + filenames[m]);- 如果您使用了从listFiles您那里获得的结果,则可以将其替换为FileInputStream fs = new FileInputStream(files[m]);- 无需对路径进行硬编码。
于 2012-12-17T11:42:57.120 回答
1

你应该修改你的代码。否则,您的代码将创建三个输出文件,而不是创建两个输出文件。这是正确的代码

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 回答