#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
, чтобы поддерживать несколько выходов журнала и каждый раз добавлять их в файл.