Описание задачи < /h1>
Я сейчас работаю над java-обязанностью.
Эта утилита прочитала некоторые входные файлы (один или несколько). Каждый входной файл содержит 3 типа строк: представление целого числа, плавания и строки.
Утилита должна фильтровать входные строки в соответствии с их типом и записать все их в 3 отдельных файлах (INT, поплавки, строки). < /P>
Важные условия, которые вызывали проблему: < /prost>
utility может быть < /br /> utility может быть < /br />. Строка во входе.
Другими словами, если ни один из входных файлов не содержит строки целочисленного типа - No «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>
Основные шаги здесь: < /strong> < /p>
[*] Прочитайте строку из ввода < /li>
Определить, представляет ли строка integer /float /string. < /li>
Когда определено: < /li>
< /ol>
< /li>
int/float/string - тогда нам нужно открыть выходной файл
[*] Написать строку в указанный выходной файл (при условии, что он был открыт ранее)
[*] Закрыть все файлы ouptut (если это необходимо) после того, как все файлы ввода были отфильтрованы. Я знаю, что это рекомендуется использовать Try-with-resources (TWR) с AutoClosable. < /strong>
Но если я это сделаю, то: < /p>
либо я должен открыть все выходные файлы с TWR, прежде чем все предыдущие действия фильтрации, и создать один большой блок TWR, покрывать все действия. Но я не могу, потому что я могу обнаружить, необходим ли выходной файл только при работе с входом [/b];
[*] или я должен открывать и использовать каждый выходной файл с TWR каждый раз, когда это необходимо (то есть каждый раз, когда я распознавал int/float/string - я пишу эту конкретную строку в указанном выводе). Но в этом случае выходные файлы будут открыты огромное количество раз, для каждой входной строки . Это не приводит к большому накладным расходам? Дважды Seems like it's bad practice.
I thought of another way to do this:
firstly read input files to investigate if they contain at least one int/float/string, but not filtering anything
[*]open necessary output files with TWR-block
read input again to filter and write all Из строк
Но таким образом приводит к двойной чтению, что, я думаю, тоже плохо. /> Скопируйте временные файлы to true output < /strong> файлы (но только если они не пусты)
, но я думаю, что это вроде как то же самое - какой -то двойную работу. Первый пост здесь, так что извините, если есть некоторые проблемы с тем, как я написал
Подробнее здесь: https://stackoverflow.com/questions/796 ... ocloseable