While循环创建多个文件

时间:2018-06-25 14:38:13

标签: java stringtokenizer

我正在尝试制作一个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();
            }   

        }
    }
}

2 个答案:

答案 0 :(得分:4)

移动i的声明:

int i = 0;

while循环之外:

int i = 0;
while(st.hasMoreTokens(){
    ...
}

这样,您就不会在每次迭代时都覆盖它。始终将其保留为1的值。

更好的方法是使用for

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

这给您留下了一个范围很广的变量i,只能在循环内访问

答案 1 :(得分:1)

您可以在外部循环中使用try-with-resource和 setDisplayName: (args, state, utils) => { const { firstname, lastname } = state.fields; const currentFirstName = firstname.lastFieldState.value; const currentLastName = lastname.lastFieldState.value; utils.changeValue(state, 'displayName', () => `${currentFirstName} ${currentLastName}`); }, 来简化代码。

i