В то время как цикл для создания нескольких файлов

43
2

Я пытаюсь сделать приложение 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();
}

}
}
}

спросил(а) 2018-06-25T17:38:00+03:00 1 год, 5 месяцев назад
2
Решение
74

переместите объявление i:

int i = 0;

вне в while цикла:

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

Таким образом, вы не переписываете его для каждой итерации. Оставляя это всегда со значением 1.

Еще лучший подход - использовать for:

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

Который оставляет вас с хорошо знакомой переменной i доступной только внутри цикла

ответил(а) 2018-06-25T17:40:00+03:00 1 год, 5 месяцев назад
Еще 1 ответ
47

Вы можете использовать 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());
}
}
}

ответил(а) 2018-06-25T18:00:00+03:00 1 год, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема