Цикл while для создания нескольких файлов - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь создать приложение 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 голосов
/ 25 июня 2018

Вы можете использовать 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());
        }
    }
}
0 голосов
/ 25 июня 2018

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

int i = 0;

за пределы цикла while:

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

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

Еще лучшим подходом было бы использование for:

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

, что оставляет вас с хорошей областью видимости переменной iдоступно только внутри цикла

...