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