Заменить временную метку в записанном текстовом файле

#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. Это должно было быть )). Исправлено