Существует ли другая библиотека, которая может разрешить запись в документ (например, журнал) типов «Дата», поскольку поток вывода файлов не позволяет этого?

#java

Вопрос:

У меня есть следующий код, и я хотел, чтобы в мой файл (например, atm.log) была записана информация, такая как дата, количество и значение true (дата, int и логические типы). Кроме того, когда я удаляю дату и логический тип, компиляция выполняется, но в файле оказывается, что на нем нет номера счетчика. Я не уверен, почему он не включает число подсчета, когда дата и логическое значение не указаны, так как у меня есть метод » закрыть ()».

Главная:

 import java.io.File;  // Import the File class
import java.io.FileNotFoundException;  // Import this class to handle errors
import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        try {
            File myObj = new File("atm.log");
            Scanner myReader = new Scanner(myObj);
            while (myReader.hasNextLine()) {
                String data = myReader.nextLine();
                System.out.println(data);
            }
            myReader.close();
        } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
        //while(true)
        //{
            ATM atm = new ATM();
            atm.init();
            atm.run();
        //}
    }
}
 

класс:

 import java.util.Date;
import java.util.ArrayList;

public class UserInfo
{
    private final Date date;
    private final int count;
    private final boolean correct;

    public UserInfo(Date date, int count, boolean correct)
    {
        this.date = date;
        this.count = count;
        this.correct = correct;
    }

    public Date getDate()
    {
        return date;

    }

    public int getCount()
    {
        return count;
    }

    public boolean isCorrect()
    {
        return correct;
    }
}
 

класс:

 import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.*;
import java.io.FileOutputStream;

public class Logger
{
    ArrayList<UserInfo> obj = new ArrayList<>();

    public Logger(Date date, int count, boolean correct){
        //obj.get(0).setValue(date,count, correct);
        obj.add(new UserInfo(date, count, correct));

        try (FileOutputStream out = new FileOutputStream("atm.log")) {


            for (UserInfo s : obj)//int i = 0; i < obj.size(); i  
                {
                out.write(s.getCount());
                out.write(s.getDate());
                out.write(s.isCorrect());
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

}
 

Ошибка:

 java: no suitable method found for write(java.util.Date)
    method java.io.FileOutputStream.write(int) is not applicable
      (argument mismatch; java.util.Date cannot be converted to int)
    method java.io.FileOutputStream.write(byte[]) is not applicable
      (argument mismatch; java.util.Date cannot be converted to byte[])
 

Комментарии:

1. Найдите минутку, чтобы посмотреть на JavaDocs для FileOutputStream — вы заметите, что write принимает только byte[] параметр, а не Date или boolean . Все, что вам нужно сделать, это преобразовать эти значения в представление, которое можно записать в файл. В зависимости от того, хотите ли вы, чтобы он был удобочитаемым или нет, будет зависеть от формата(ов), который вы можете выбрать. Итак, короткий ответ на ваш вопрос: нет, длинный ответ: ну, может быть, но что вы теряете в этом процессе?

2. Вам придется преобразовать свои свойства в строки, а затем в байты: как записать в файл с помощью FileOutputStream .

Ответ №1:

Либо вы записываете в поток (например, FileoutputSteam) только байты. Или вы позволяете Java выполнять работу по генерации байтов и просто писать символы — но в этом случае вам нужно использовать писатель. PrintWriter должен быть вам знаком — вы используете его во время System.out.println(…)

 try (
    OutputStream outstream = new FileOutputStream(...);
    PrintWriter out = new PrintWriter(outstream);
) {
    out.println(new Date());
}
 

Комментарии:

1. Просто придирка, System.out на самом деле является потоком печати, а не печатником; но это незначительное различие. Ваш ответ пока единственный, который является кратким и полезным.

2. Просто я сам кое-чему научился. Спасибо, что указали на это. 🙂

3. @k314159 Ну, это сурово — за исключением того, что вывод зависит от Date() системы, так что в качестве долгосрочного решения, вероятно, не лучший выбор — ИМХО 😉

4. Я уже использовал printwriter раньше. Я увлекся потоком вывода файлов. Это именно то, что я искал

Ответ №2:

В общем, запись в файл не зависит от формата, то есть это зависит от вас. Можно использовать такие вещи, как JSON, XML, CSV и т.д., Для применения общих форматов, но все эти решения добавляют разные уровни сложности.

Так, например, простым решением может быть, например, определение удобочитаемого формата…

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        Logger logger = new Logger();
        logger.log(LocalDateTime.now(), 100, true);
        logger.log(LocalDateTime.now(), 200, false);
        logger.log(LocalDateTime.now(), 300, true);
        logger.log(LocalDateTime.now(), 400, false);
        logger.log(LocalDateTime.now(), 500, true);

        logger.dump();
    }

    public class Logger {

        private ArrayList<UserInfo> obj = new ArrayList<>();
        private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd-HH:mm:ss");

        public Logger() {
        }

        public void log(LocalDateTime date, int count, boolean correct) {
            UserInfo info = new UserInfo(date, count, correct);
            obj.add(info);
            // You could keep the file open until the class in closed
            try (BufferedWriter bw = new BufferedWriter(new FileWriter("atm.log", true))) {
                String text = String.format("[%s] M %s", formatter.format(info.getDate()), info.getCount(), info.isCorrect() ? "Yes" : "No");
                bw.write(text);
                bw.newLine();;
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        public void dump() {
            try (BufferedReader br = new BufferedReader(new FileReader("atm.log"))) {
                String text = null;
                while ((text = br.readLine()) != null) {
                    System.out.println(text);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public class UserInfo {

        private final LocalDateTime date;
        private final int count;
        private final boolean correct;

        public UserInfo(LocalDateTime date, int count, boolean correct) {
            this.date = date;
            this.count = count;
            this.correct = correct;
        }

        public LocalDateTime getDate() {
            return date;

        }

        public int getCount() {
            return count;
        }

        public boolean isCorrect() {
            return correct;
        }
    }
}
 

Который напечатает что-то вроде…

 [2021/10/08-08:46:15]  100 Yes
[2021/10/08-08:46:15]  200 No
[2021/10/08-08:46:15]  300 Yes
[2021/10/08-08:46:15]  400 No
[2021/10/08-08:46:15]  500 Yes
 

Несколько заметок…

Я использовал LocalDateTime в качестве предпочтения то Date , что мы должны делать сейчас, но основная концепция будет работать с Date и. SimpleDateFormatter

Не имеет смысла, что мне нужно создать новый экземпляр Logger , чтобы добавить новую запись в журнал, которая затем добавляется в a List … и каждый Logger экземпляр перезаписывает предыдущий файл.

Поэтому вместо этого я создал Logger , чтобы поддерживать несколько выходов журнала и каждый раз добавлять их в файл.