Как создать файл только один раз, когда он нужен?JAVA

Программисты JAVA общаются здесь
Anonymous
Как создать файл только один раз, когда он нужен?

Сообщение Anonymous »

Я работаю над утилитой Java. Эта утилита должна прочитать некоторые входные файлы (один или несколько). Каждый входной файл содержит три типа строк, представляющих целое число, плавание и строку. Утилита должна фильтровать входные строки в соответствии с их типом и записывать все из них в 3 отдельных файлах (INT, поплавок, строки). < /P>
Утилита не должна создавать выходной файл, если нет конкретной представления строки при вводе. Другими словами, если ни один из входных файлов не содержит строки типа целочисленного типа, файл integer_output.txt »не должен быть создан. И вы не можете знать, когда именно это произойдет, и если это даже произойдет.for (String inputFile : validInputFiles) {
try (
BufferedReader reader = Files.newBufferedReader(Paths.get(inputFile))
) {
String line;
while ((line = reader.readLine()) != null) {
if (line.matches("[+-]?\\d+")) { // integer
BigInteger num = new BigInteger(line);
try {
if (integerCount == 0) {
integerWriter = new FileWriter(fullIntegerFileName);
}
integerCount++;
integerWriter.write(line);
integerWriter.write(System.lineSeparator());
integerWriter.flush();
} catch (IOException e) {
System.out.println("Error while writing to file: " + inputFile);
}

} else if (line.matches("[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?")) { // float
BigDecimal num = new BigDecimal(line);
try {
if (floatCount == 0) {
floatWriter = new FileWriter(fullFloatFileName);
}
floatCount++;
floatWriter.write(line);
floatWriter.write(System.lineSeparator());
floatWriter.flush();
} catch (IOException e) {
System.out.println("Error while writing to file: " + inputFile);
}

} else { // string
try {
if (stats.stringCount == 0) {
stringWriter = new FileWriter(fullStringFileName);
}
stringCount++;
stringWriter.write(line);
stringWriter.write(System.lineSeparator());
stringWriter.flush();
} catch (IOException e) {
System.out.println("Error while writing to file: " + inputFile);
}
}
}

} catch (IOException e) {
System.err.println("Error while reading input file: " + e.getMessage());
}
}

try {
if (integerWriter != null) {
integerWriter.close();
}
} catch (IOException e) {
System.out.println("Error while closing file: " + fullIntegerFileName);
}

try {
if (floatWriter != null) {
floatWriter.close();
}
} catch (IOException e) {
System.out.println("Error while closing file: " + fullFloatFileName);
}

try {
if (stringWriter != null) {
stringWriter.close();
}
} catch (IOException e) {
System.out.println("Error while closing file: " + fullStringFileName);
}
< /code>
Основные шаги здесь: < /h3>

[*] Читать строку из ввода < /li>
Определите, представляет ли строка Integer /float /String. < /li>
При определении:

. Файл < /li>
Напишите строку в указанный выходной файл (при условии, что он был открыт ранее) < /li>
< /ul>
< /li>
Закройте все выходные файлы (если это необходимо) после того, как все входные файлы были отфильтрованы. Autoclosable, но если я сделаю это, то: < /p>

либо я должен открыть все выходные файлы с TWR один раз перед всеми фильтрационными действиями, и создать один большой блок TWR, покрывающий все действия. Но я не могу, потому что я могу обнаружить, нужен ли выходной файл только во время работы с входом;
[*] или я должен открыть и использовать каждый выходной файл с TWR каждый раз, когда это необходимо (то есть каждый раз, когда я распознавал int/float/string, я пишу эту конкретную строку в указанном выходе). Но в этом случае выходные файлы будут открыты огромным количеством раз для каждой входной строки. Разве это не приводит к большому накладным расходу? Потому что теперь я должен управлять открытием/закрытием вручную, и моя идея IntelliJ предупреждает меня, что я должен использовать TWR. Похоже, это плохая практика.
Я подумал о другом способе сделать это:

Сначала прочитать входные файлы, чтобы исследовать, содержат ли они хотя бы один int/float/flock/string, но не фильтрация
[*] Откройте необходимые файлы с Twr-block . строки. < /li>
< /ul>
Но этот способ приводит к двойной чтению, что, я думаю, тоже плохо. Файлы в истинные выходные файлы (но только если они не пустые)>

Подробнее здесь: https://stackoverflow.com/questions/796 ... its-needed

Вернуться в «JAVA»