Zapis danych codziennie do nowego pliku

0

Witam

Jak zrobić coś takiego z automatu (przy pracy ciągłej programu)? Jakiś scheduler? Najlepiej, żeby w nazwie pliku była data.

Pozdrawiam i z góry dziękuje za wszystkie odpowiedzi

1
DateFormat dateFrm = new SimpleDateFormat("_yyyyMMdd_HHmmss");
Date dt = new Date();
String fileName = dateFrm.format(dt);

To czy zmienił się dzień, też możesz odczytać z obiektu klasy Date.

0

Chyba trochę się nie zrozumieliśmy. Bardziej zastanawia mnie to jak sprawdzać kiedy zmieniła się data (dzień). W osobnym wątku? Jakiś scheduler?

0

A to sobie zrób jak uważasz, skąd mamy wiedzieć jak wygląda aplikacja i do czego ma służyć? Możesz zastosować scheduler, możesz sprawdzać gdzieś gdzie coś się kręci, możesz dodać wpis do crona i triggerować...

0

Możesz użyć Timera.

0

Dane lecą do pliku 24/7/365 :-) Jakoś sprawdzam kiedy zmienia się data (czyli wybiła północ). Zamykam stary plik (strumień). Tworzę nowy plik z nowa datą i dalej lecą tam dane (bez żadnej ich utraty w międzyczasie). i Tak codziennie nowy plik z nowa datą.

0

Jak dużej dokładności potrzebujesz? Timer wykonuje kod co pewien czas. W tym kodzie możesz odczytać aktualna datę, jeśli jest inna niż zapamiętana to zamykasz plik, otwierasz nowy i zapamiętujesz nową datę. Wykonywanie Timera będzie zapewne obciążające jeśli będziesz sprawdzał czas co 1ms.

0

Dokładność nie musi być duża. Kwestia minut. Sprawdzać mogę nawet co pół godziny czy godzinę.

0

To java.util.Timer załatwi sprawę. http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

1

Przecież to są podstawowe rzeczy, które wykonuje java.util.logging.Logger. Przy konfiguracji określa się rozmiar daty, maksymalny rozmiar pliku, sposób numeracji kolejnych, format wiersza i nie wiem co jeszcze... Po to jest ta klasa, żeby tego samemu na nowo nie wymyślać. A jak to jest mało, to są zewnętrzne systemy do logowania, np. log4j, albo osadzone we frameworku.

0

Też nad tym się zastanawiałem. Tylko myślałem, że loggery to bardziej do logów, diagnostycznie, a nie do spływających danych.

0

Można to osiągnąć na kilka sposobów:

  1. Log4J choć osobiście uważam, że lepszym rozwiązaniem (nowocześniejszym) jest użycie dodatkowo SJF4J, które ujednolica API dla różnych bibliotek.
  2. Pisanie timera. Dobre rozwiązanie jeżeli chcesz się pobawić różnymi "niskopoziomowymi" rozwiązaniami. IMO, kiepski pomysł.
  3. Obudowanie klasy zapisującej dane do pliku. Niech przed zapisem sprawdza czy plik do którego chcesz pisać ma poprawną datę tzn. czy data z nazwy pliku równa się dzisiejszej dacie dziennej. Jeżeli nie otwierasz nowy plik i do niego piszesz.
0

Logowanie zawsze mi się kojarzyło z komunikatami i ich poziomami debug, warning czy error. Do tego konfiguracja z poziomu, której można by było pewnie całkiem wyłączyć to logowanie. Ja chcę zapisywać dane - powiedzmy do formatu zbliżonego do csv, żeby móc coś z nimi później zrobić. Podoba mi się 3 sposób, choć dane w pewnych momentach mogą spływać często - takie sprawdzanie przed każdym zapisem pewnie będzie miało swój narzut.

0

Narzut będzie o wiele mniejszy niż samo zapisywanie danych. Ogólnie w przypadku optymalizacji pod względem wydajności można sobie przyjąć trzy zasady:

  1. Nie optymalizuj.
  2. Nie optymalizuj teraz.
  3. Optymalizuj tylko to, co daje wymierny efekt.
0

Narzut będzie niewielki w porównaniu z zapisem ponieważ operacje dyskowe są znacznie wolniejsze niż działania w pamięci RAM. Jeżeli już coś należało by optymalizować to zazwyczaj problemem jest sposób budowania rekordu do zapisu oparty o dodawanie Stringów, a nie StringBuildera. Jednak by osiągnąć efekt "przymulania" w wyniku takiego postępowania należy się nieźle postarać.

0
Koziołek napisał(a):

Narzut będzie niewielki w porównaniu z zapisem ponieważ operacje dyskowe są znacznie wolniejsze niż działania w pamięci RAM.

Ale w ostateczności i tak dane mają znaleźć się na dysku. Poza tym z wydajnością nie jest tak do końca. Zapis strumienia do pliku nie oznacza, że w tej chwili odbywają się operacje na io ( no chyba, że użyjesz klasy RandomAccessFile z synchronicznym zapisem "rws" ) one idą do bufora, a synchronizacją z dyskiem zajmuje się system.

0

W ostateczności tak lecz tu chodzi o operację w stylu:

if(currentDate().notEquals(lastFileDate)){
   openNewFile();
}

wykonywaną przed każdym zapisem. Takie coś jest znacznie szybsze niż operacja i/o (niezależnie od tego kiedy będzie realizowana), nawet w przypadku gdy porównanie będzie wykonywane na obiektach typu Date.

0

Formatować datę i czas można poprzez klasę SimpleDateFormat. Odpada narzut dodatkowej zewnętrznej biblioteki JodaTime. No chyba, że JodaTime jest o wiele lepsza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1