Java While循环创建多个文件

Java While循环创建多个文件,java,stringtokenizer,Java,Stringtokenizer,我正在尝试制作一个Java应用程序,它将接收包含多条消息的大容量文件,然后将它们拆分并将每条消息写入自己的文件。我遇到的问题是,它只创建了一个包含最后一条消息的文件,所以我认为它在while循环的每次迭代中都会被覆盖。我的代码如下: public void writeFile(StringBuilder contents, String outputFilePath) throws IOException { String messages = contents.toString();

我正在尝试制作一个Java应用程序,它将接收包含多条消息的大容量文件,然后将它们拆分并将每条消息写入自己的文件。我遇到的问题是,它只创建了一个包含最后一条消息的文件,所以我认为它在while循环的每次迭代中都会被覆盖。我的代码如下:

public void writeFile(StringBuilder contents, String outputFilePath) throws IOException {

    String messages = contents.toString();
    StringTokenizer st = new StringTokenizer(messages, "$");

    FileWriter fileWriter = null;
    BufferedWriter bufferedFileWriter = null;

    while (st.hasMoreTokens()) {

        int i = 0;
        i++;

        File output = new File(outputFilePath + "_" + i + ".txt");

        try {       
            fileWriter = new FileWriter(output);
            bufferedFileWriter = new BufferedWriter(fileWriter);
            bufferedFileWriter.append(st.nextToken());
        }
        finally {
            if (bufferedFileWriter != null) {
                bufferedFileWriter.close();
            }
            if (fileWriter != null) {
                fileWriter.close();
            }   

        }
    }
}

移动
i
的声明:

int i = 0;
while
循环之外:

int i = 0;
while(st.hasMoreTokens(){
    ...
}
这样,您就不会在每次迭代中都覆盖它。始终将其值保留为
1

更好的方法是为使用

for(int i = 1; st.hasMoreTokens(); i++){
    ...
}

这就给您留下了一个范围很好的变量
i
,只能在循环内部访问移动
i
的声明:

int i = 0;
while
循环之外:

int i = 0;
while(st.hasMoreTokens(){
    ...
}
这样,您就不会在每次迭代中都覆盖它。始终将其值保留为
1

更好的方法是为
使用

for(int i = 1; st.hasMoreTokens(); i++){
    ...
}

这就给您留下了一个范围很好的变量
i
,只能在循环内部访问您可以使用try with resource和外部循环中的
i
来简化代码

public void writeFile(StringBuilder contents, String outputFilePath) throws IOException {

    StringTokenizer st = new StringTokenizer(contents.toString(), "$");

    for (int i = 0; st.hasMoreTokens(); i++) {
        File output = new File(outputFilePath + "_" + i + ".txt");
        try(FileWriter fileWriter = new FileWriter(output)) {
            fileWriter.append(st.nextToken());
        }
    }
}

您可以在外部循环中使用try with resource和
i
,以简化代码

public void writeFile(StringBuilder contents, String outputFilePath) throws IOException {

    StringTokenizer st = new StringTokenizer(contents.toString(), "$");

    for (int i = 0; st.hasMoreTokens(); i++) {
        File output = new File(outputFilePath + "_" + i + ".txt");
        try(FileWriter fileWriter = new FileWriter(output)) {
            fileWriter.append(st.nextToken());
        }
    }
}

完美的非常感谢你。现在可以了,太好了!非常感谢你。现在可以工作了。在这里,使用调试器单步检查代码可能比在此处发布代码更快地发现问题。每次运行
inti=0它将
i
设置为
0
。注意:创建大量文件需要很长时间,尤其是在旋转磁盘上。我尝试过调试,但我想我今天感觉有点困。是的,我这样做只是为了测试标记器基本上能正常工作,我将来还会用消息做其他事情,因此,我并不太担心创建文件时的速度。如果使用try with resource替换大约一半的代码,那么使用调试器单步执行代码可能比在此处发布代码更快地发现问题。每次运行
inti=0它将
i
设置为
0
。注意:创建大量文件需要很长时间,尤其是在旋转磁盘上。我尝试过调试,但我想我今天感觉有点困。是的,我这样做只是为了测试标记器基本上能正常工作,我将来还会用消息做其他事情,因此,我并不太担心创建文件的速度。如果您使用try with resource替换大约一半的代码。那么这会自动关闭循环每次迭代的编写器吗?@AdamH是的,会。如果第一个写入程序出现异常,它将无法关闭缓冲写入程序。顺便说一句,BufferedWriter不会做任何有用的事情,因为您只对它调用一次append,如果没有BufferedWriter,就会发生这种情况。因此,这会自动关闭循环每次迭代的写入程序吗?@AdamH是的,会。如果第一个写入程序出现异常,它将无法关闭缓冲写入程序。顺便说一句,BufferedWriter不会做任何有用的事情,因为您只对它调用一次append,如果没有BufferedWriter,就会发生这种情况。