#java #datetime
#java #дата и время
Вопрос:
Мне нужно прочитать файл и записать его в новый файл, файл, который я прочитал, имеет собственную временную метку, но в записанном файле мне нужно заменить его на текущее время, например (2020-09-20 19:30 измените его на 2020-09-30 01:30) Я смог прочитать инапишите его, используя следующий код, но я борюсь с частью изменения метки времени
FileInputStream inputRead = null;
FileOutputStream outWrite = null;
try{
File infile =new File("test.txt");
File outfile =new File("test_log.txt");
inputRead = new FileInputStream(infile);
outWrite = new FileOutputStream(outfile);
byte[] buffer = new byte[2048];
int length;
while ((length = inputRead.read(buffer)) > 0){
System.getProperty("line.separator");
outWrite.write(buffer, 0, length);
}
inputRead.close();
outWrite.close();
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
Извините, забыл упомянуть, что прочитанная строка выглядит следующим образом » 20-09-2020 19:30 (некоторый параметр) » на » (текущая дата) (некоторый параметр)
Комментарии:
1. Ммм, я не понимаю. Вы хотите изменить ее на 12-часовую временную метку с 24-часовой нотации? Какова необходимая логика для изменения временной метки?
2. Я хочу изменить временную метку из файла, который был прочитан, на текущее время в новом письменном тексте
3. о, извините. Похоже, я неправильно понял вашу проблему. Вы можете взглянуть на ответы других участников, используя подход поиска и замены. Я думаю, что они полезны
4. Все в порядке, спасибо, я рассмотрю другие предложенные ответы
Ответ №1:
Попробуйте это
File infile = new File("test.txt");
File outfile = new File("test_log.txt");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
try (
BufferedReader inputRead = new BufferedReader(new InputStreamReader(new FileInputStream(infile)));
BufferedWriter outWrite = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outfile)))
) {
String line;
while ((line = inputRead.readLine()) != null) {
outWrite.write(System.lineSeparator());
String modifiedString = line.replaceAll("\d{4}-\d{2}-\d{2} \d{2}:\d{2}", dateTimeFormatter.format(LocalDateTime.now()));
outWrite.write(modifiedString);
}
}
Немного расширяю свой ответ для ясности.
Я добавил try-with-resources, вам не нужно закрывать потоки вручную, что в противном случае должно быть сделано в finally (если он выходит из строя, они остаются открытыми).
Я добавил readers, который является API более высокого уровня поверх потока. для удобства.
Я добавил поиск и замену в строке, используя регулярное выражение, соответствующее вашей строке примера. В моем примере выше я использую строки, которые, вероятно, могут быть оптимизированы при необходимости.
Комментарии:
1. Привет, я пытался использовать вашу кодировку, но почему-то она не заменила дату. возможно ли также просто заменить частичную часть строки? например, «2020-10-30 08:30 Дополнительное слово» на «2020-10-31 11:30 дополнительное слово»?
2. Если он не заменил указанный вами формат, он отличается от того, что у вас есть. Регулярное выражение ищет 4 цифры-2 цифры-2 цифры 2 цифры: 2 цифры. Если вы хотите добавить слово, необходимо добавить 2 группы захвата, где первая заменяется, а вторая сохраняется
3. Я вижу, да, формат отличается, ха-ха, но, к сожалению, я не понимаю эту часть «Если вы хотите добавить слово, тогда необходимо добавить 2 группы захвата, где первая заменяется, а вторая сохраняется» надеюсь, вы сможете объяснить это дальше.
4. взгляните на это regex101.com/r/4X0Abk/1 и посмотрите на правую сторону. там вы увидите группы захвата, в которых вы можете увидеть группы
5. Привет, я пытаюсь использовать предоставленный вами код, даже изменить формат даты, но он все равно не смог изменить дату на текущую дату
Ответ №2:
String nextTimeStamp = "2020-09-30 01:30";
Path infile = Paths.get("test.txt");
Path outfile = Paths.get("test_log.txt");
try (Stream<String> lines = Files.lines(infile, Charset.defaultCharset());
PrintWriter out = new PrintWriter(outfile.toFile()) {
lines.map(line -> line.replaceAll("\d{4}-\d{2}-\d{2} \d{2}:\d{2}", nextTimeStamp)
.forEach(line -> out.println(line));
}
(Для фиксированной кодировки добавьте дополнительный параметр с этой кодировкой и в PrintWriter.
Java String
предназначена для текста, byte[]
для двоичных данных. И в строке можно выполнять замену и другие текстовые операции.
line.replaceAll
использует регулярное выражение для сопоставления. Если у вас есть точная строка, которую нужно заменить, вы можете использовать line.replace
.
Синтаксис того, что называется try-with-resources, принимает автоматически закрываемые внутри try (...)
и гарантирует, что объекты будут закрыты даже при исключении или возврате / разрыве.
Комментарии:
1. Привет, спасибо, но что, если я заменю только часть строки? например, «2020-09-20 19:30 Дополнительное слово» на «2020-09-30 01:30 Дополнительное слово»?
2. Я не понимаю,
"foobarfoobarfoo",replaceAll("bar", "BAZ")
дал"fooBAZfooBAZfoo"
бы .3. Я пытаюсь использовать предоставленный вами код, но в строке
.forEach(line -> out.println(line);
` }` выдает ошибкуMultiple markers at this line - Syntax error, insert "SimpleName" to complete QualifiedName - Syntax error, insert ")" to complete MethodDeclaration - Syntax error, insert ")" to complete MethodInvocation - Syntax error, insert "Identifier (" to complete MethodHeaderName - Syntax error, insert ")" to complete SingleMemberAnnotation
4. Это должно было быть )). Исправлено