logData, java, csv - PullRequest
       7

logData, java, csv

1 голос
/ 08 января 2020

Я новичок здесь и учусь Java. Мой engli sh не самый лучший.

Мне нужна помощь, и я был бы признателен, если бы вы мне помогли.

Я хочу написать в Java программу, в которой хранятся данные журнала. в CSV-файл. Приложение запускается, если я включаю компьютер.

Программа создает CSV-файл для текущего месяца и, прежде чем это произойдет, должна проверить, существует ли он в текущем месяце.

Дата и время должно быть сохранено. это также необходимо проверить, если эта текущая дата существует. Я хочу сохранить дату и время включения и выключения. Внимание: я могу выключаться много раз, но они хранят дату обновления.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.io.BufferedReader;

public class LoggerApp {

    public static void main(String[] args) {

        // Creates a CSV File with current Year and Month
        String fileName = new SimpleDateFormat("MM-yyyy'.csv'").format(new Date());

        // Proof of File exist and read the file
        File f = new File(fileName);
        if (f.exists() && !f.isDirectory()) {
            FileReader fr = null;
            try {
                fr = new FileReader(f);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            BufferedReader br = new BufferedReader(fr);

        } else {
            String fileName1 = new SimpleDateFormat("MM-yyyy'.csv'").format(new Date());
        }

        FileWriter writer;
        File datei = new File(fileName);
        // LocalDateTime currentDateTime = LocalDateTime.now();

        try {
            LocalDateTime currentDateTime = LocalDateTime.now();
            // System.out.println("Before formatting: " + currentDateTime);

            writer = new FileWriter(datei);
            // writer.write(currentDateTime.toString());
            DateTimeFormatter changeDateTimeFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
            writer.write(System.getProperty("line.separator"));

            String formattedDate = changeDateTimeFormat.format(currentDateTime);
            writer.write(formattedDate);
            writer.flush();
            writer.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

}

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Избегайте устаревших классов даты и времени

Вы смешиваете проблемные устаревшие классы даты и времени, такие как SimpleDateFormat и Date, с их современными заменами в java .time * 1006. * пакеты. Не делай этого. Используйте только классы java .time .

Имя файла

Я предлагаю использовать стиль именования файлов ISO 8601 . Текст в этих форматах при сортировке в алфавитном порядке будет в хронологическом порядке.

Очевидно, вы хотите только год и месяц для имени файла. Стандарт ISO 8601 для этого - ГГГГ-ММ.

Для получения текущего года-месяца требуется часовой пояс. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Если текущий момент близок к концу / началу месяца, год-месяц может быть в следующем месяце в одном месте, а в последний месяц - в другом.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
YearMonth yearMonth = YearMonth.now( z ) ;       // Get current year-month as seen in a particular time zone.

Сделать имя файла текстовым.

String fileName = yearMonth.toString() + ".csv" ;

Чтобы сгенерировать текст, представляющий дату и время суток, используйте ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.now( z ) ;
String output = zdt.toString() ;

Вы можете получить YearMonth с этого момента.

YearMonth yearMonth = YearMonth.from( zdt ) ;

Существование файла

Очевидно, вы хотите создать файл, только если он еще не существует.

Java имеет несколько устаревших классов для работы с файлами, таких как java.io.File. И Java имеет более новый, более современный набор классов для файлов и ввода / вывода, который называется «NIO» (неблокирующий ввод / вывод) . См. Oracle Учебное пособие .

String filePathString = "/Users/basilbourque/" + fileName ;
Path path = Paths.get( filePathString );

if ( Files.exists(path) ) {
     … do nothing
}

if ( Files.notExists(path) ) {
     … proceed with creating new file
}

CSV

Создание CSV-файлов многократно освещалось при переполнении стека. Поиск, чтобы узнать больше.

Я предлагаю использовать библиотеку, чтобы облегчить рутинную работу по генерации или синтаксическому анализу CSV или файлов с разделителями табуляции. Я хорошо использовал Apache Commons CSV . И есть и другие.

Я сам поделился примером демонстрации написания файлов CSV здесь , здесь , здесь и, вероятно, других .

Загрузка / выключение машины

Приложение запускается, если я включаю компьютер.

Дата и время должны быть сохранены. Это также необходимо проверить если эта текущая дата существует. Я хочу сохранить дату и время включения и выключения.

Я не могу вам там помочь. Я не знаю, как подключиться к загрузке / выключению через Java. Я полагаю, вы могли бы написать сценарий оболочки для вызова вашего Java приложения. Затем настройте какой-либо механизм, определяемый ОС c, для запуска сценария оболочки в соответствующее время.

0 голосов
/ 28 января 2020

Я предлагаю изучить существующие инструменты ведения журнала, Log4J является одним из наиболее часто используемых, в зависимости от того, что и как вы хотите поместить в этот журнал, вы можете получить содержимое этого журнала как CSV, если это ваше требование, или эти журналы могут изменить быть преобразованным в CSV через программу, если вы продолжаете их обрабатывать.

...