Diskuze: Zmena nazvu txt suboru
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Menší poznámka úvodem.... proč používáš hodnotu v proměnné, která
je úplně stejná, jako hodnota výstupu metody, kterou tu proměnnou
naplňuješ?:)
Myslím tím toto:
File f1 = new File("logPredaj.txt");
boolean exists=f1.exists();
if (exists==true) {}
můžeš přece zavolat rovnou
File f1 = new File("logPredaj.txt");
if (f1.exist()) {}
(pokud jde o hodnotu boolean, tak tam nemusíš ani psát rovnost, stačí
jen tu hodnotu. Pokud by ses chtěl v podmínce zeptat na tu hodnotu -
respektive by ses chtěl zeptat na negaci, tak stačí před to napsat právě
negaci. if(!f1.exist()){} )
Mimochodem.... excelentní pojmenování proměnné. Ještě že nemáš třídu
Formule. To by se ti krásně mixovalo;)
Právě negaci bys mohl použít v té druhé podmínce. Ono tělo s komentářem: //nerob nič je vcelku nešikovné-.-
Ten záznam je v jakém tvaru? Ať ti podám trošku komplexní řešení na míru....
Ahoj.
Ďakujem za rýchlu odpoveď. No som samouk a Jave sa dlho nevenujem (možno pol roka +-) tak možno aj kôli tomu je v mojom kóde vidieť také nezmyselné chyby. Ale to sa časom a praxou dúfam postupne vytratí. Záznam má tvar:
10.07.2017 09:47:58;85812238945;Tovar6;2.0;2.0;nakup 2ks; aktualny stav: 53ks.
Možno ani neni treba praktické riešenie ako skôr vysvetliť ako to spraviť nech sa s tým môžem potrápiť. Ale ak je to takto jednoduchšie tak pomôže aj praktická ukážka.
Zatiaľ dakujem
Peťo
jj není problém.
Jen mi prosím tě ještě řekni, jaký má být teda výstup, trošku jsem to
poupravil a jsem teď zmatený, protože si vytváříš soubory logPredaj.txt,
ale připravuješ si cestu pro datum. To datum má být záznam v tom souboru?
(jestli jo, proč přidávat příponu .txt)
Jestli to má být nový soubor, proč vždycky nakonec vytvoříš
stejnojmenný soubor?
a jo, už to chápu... ty chceš teda stávající soubor na konci každého měsíce přejmenovat z logPredaj.txt na dejme tomu logPredaj8_2017.txt a pak vytvořit ve stejném adresáři nový soubor logPredaj.txt?
Ano, presne tak...
poslední otázka a pakt to postnu
Jak a proč v tom figuruje ten poslední záznam?
Z posledného záznamu si vytiahnem mesiac (pomocou substring(3,5)) a porovnám ho s aktuálnym mesiacom. ak sa zmenil tak vytvorým nový súbor logPredaj.txt a starý premenujem. Ak sa nezmenil tak logujem do starého súboru nadalej...
Tak uvidíme, otestuj si to, jestli je to to, cos myslel....
Trošku jsem to poupravil a okomentoval, aby ses v tom vyznal. Kdybys to chtěl
pozměnit, stačí napsat;)
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Simple class for creating or renaming new files
*/
public class UserActivitesFileGenerator {
private final String name = "logPredaj"; //basic name for all files. All will contain this name
private final File logFile = new File(name + ".txt"); //if we are going to create a new file, we will use just this one
private final DateFormat dateFormat = new SimpleDateFormat("MM_yyyy"); //global formate for all dates. Attantion! We are working with this formate!!
/**
* I am lazy so I defined everything in a basic constructor:) It will just
* create or rename files (It could be split in separate methods)
*/
public UserActivitesFileGenerator() {
try {
// && means that If condition doesnt pass by first option, comparing ends and jump to else branch
if (logFile.exists() && !poslednyZaznamZLogPredaj().equals(dateFormat.format(new Date()))) {
logFile.renameTo(new File(toString()));
logFile.createNewFile();
} else {
logFile.createNewFile(); //this branch works only if logFile doesn't exists
}
} catch (IOException ex) {
}
}
/**
* If you want use definition in previous concstructor where you want. I
* started project with that:)
*
* @param args Arguments you do not have to set
*/
public static void main(String[] args) {
new UserActivitesFileGenerator();
}
/**
* I did not define this method so I just used the String output for testing
*
* @return String output. Your method should generate your own output
*/
private String poslednyZaznamZLogPredaj() {
//return "08_2017";
return "09_2017";
}
/**
* Better to use parent's method;)
*
* @return formatted output for old file
*/
@Override
public String toString() {
return name + dateFormat.format(new Date()) + ".txt";
}
}
Jo a při generování toho data v metodě PoslednyZaznamLogPredaj() si dej bacha. Porovnáváš teď datum ve tvaru MM_yyyy tak ať ti to neháže chybu. Lomítko není moc dobrý nápad. Některé systémy nedbají na lomítka a mohly by to brát jako další adresář:)
dakujem. ked pridem z roboty vyskusam to. ale ked som si kod pozrel dava mi vyznam. zatial vam dakujem
čtu si to po sobě a zapomněl jsem okomentovat ještě tu branch v té
podmínce jednou věcí...
Když používám metodu createNewFile(), tak kdyby sis tuto metodu v nějakém
IDE rozklikl, tak zjistíš, že je datového typu boolean. To i znamená, že
sama tato metoda obsahuje podmínku, jestli soubor se stejným názvem existuje
- nedělej nic, jestli ne, tak jej vytvoř. Pochopitelně by se to dalo zapsat
rovnou i takhle:
if (logFile.createNewFile() && !poslednyZaznamZLogPredaj().equals(dateFormat.format(new Date()))) {
logFile.renameTo(new File(toString()));
logFile.createNewFile();
}
Ale ono je zkracování a zkracování. Ideální je to v tom případě,
když užetříš víc jak 4 řádky nebo hodně závorek. Ale zase musíš
myslet i na to, aby se v kódu programátor vyznal. Takže proto jsem to tak
napsal;)
To jen tak pro info a nové poznátko:)
není zač a PS: ITáci si mezi sebou tykaji;) (to aby se lépe mohli posílat do řiti:) )
Jo a ještě mě teď při odchodu napadla jedna věc... kdyžtak se můžeš jak říkáš "potrápit" a ošetři si, pokud ten nový soubor s datem existuje a tobě se vytvoří nový soubor "logPredaj.txt"... tak když bys tuto aplikaci spustil znovu, tak ti to přepíše ten starý soubor s datem úplně prázdným souborem a data máš komplet v háji. Což je docela podstatný bug. Takže ještě toto je třeba ošetřit, ale to stačí jen přetížit ještě tu podmínku.
Ahoj,
Mam ešte jednu otázku. Keď si vytvorím nový projekt a skopírujem tam tvoj kód tak všetko fugnuje... Keď to ale chcem implementovať do môjho riešenia tak mi vyhadzuje chybu ktorú neviem odstrániť a to v riadku kde premenuvávam textový súbor
logFile.renameTo(new File(toString()));
NetBeans mi vyhadzuje chybu: non-static method toString() cannot be referenced from a static content
Ty v tvojom riešení definuješ metódu
public UserActivitesFileGenerator()
ja v mojom riešení ale implementujem iba telo tejto metódy v main class. (nevytváram metódu ako ty)
Už z toho začínam byť dosť popletený Asi by som si mal ešte raz preisť teóriou
v poho, už jak ti
napovídá netbeans - non tatic method toString()
Metoda main je statická a ty nemůžeš do statické metody rvát instanční
metody.
Proč?
static a instance - to je ten zásadní rozdíl
Instance je objekt, který MUSÍŠ vytvořit (operátorem new). Kdybys to chtěl
podrobněji, tak objekt je něco, co je už specifické a můžeš to změřit,
zkontrolovat, používat atd.
No a static (neboli třídní něco) znamená, že pracuješ s něčím, aniž
bys k tomu potřeboval vytvořit instanci.
To se používá v praxi hlavně, když chceš vytvořit nějakou proceduru a
až potom instanci. Příklad:
public class InstanceVsStatic {
private static int vyskaCloveka;
public static void statickaMetodaKteraPripraviMaximalniVyskuCloveka(int vyska) {
vyskaCloveka = vyska;
}
public InstanceVsStatic() {
zprava();
}
public void zprava() {
System.out.println("Človíček poroste do výšky " + vyskaCloveka);
}
public static void main(String[] args) {
new InstanceVsStatic();
}
}
Kdybys metodu zprava() zavolal v metodě main nebo
statickaMetodaKteraPripraviMaximalniVyskuCloveka(int), tak ti to vyhodí
stejnou chybu. Protože bys chtěl použít nesmysl.
Chtěl bys použít metodu objektu, který ještě není vytvořený v metodě,
kterou můžeš používat kdykoliv. Snad vidíš ten nesmysl.
Takže řešení....
PS: UserActivitesFileGenerator() není jen tak obyčejná metoda:) je to konstruktor, což je speciální případ metody. Konstruktor na rozdíl od třídních či instančních metod voláš právě operátorem new. Proto může být být v metodě main;)
No uz mam o tom lepsiu predstavu. Vyskúšam to prerobiť a napíšem ako to dopadlo
Tak som to teda skusil prerobit podla toho co si mi povedal. Ale nevedel som to nejak dat dohromady. Vytvoril som si teda novu triedu overTxtSubor() kde som umiestnil tvoj kod ktory vyzera nasledovne:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class overTxtSubor {
private final String name = "logPredaj"; //basic name for all files. All will contain this name
private final File logFile = new File(name + ".txt"); //if we are going to create a new file, we will use just this one
private final DateFormat dateFormat = new SimpleDateFormat("MM");
public overTxtSubor() {
try {
// && means that If condition doesnt pass by first option, comparing ends and jump to else branch
if (logFile.exists() && !poslednyZaznamZLogPredaj().equals(dateFormat.format(new Date()))) {
logFile.renameTo(new File(toString()));
logFile.createNewFile();
} else {
logFile.createNewFile(); //this branch works only if logFile doesn't exists
}
} catch (IOException ex) {
}
}
public static String poslednyZaznamZLogPredaj(){
String poslednyZaznam=null;
String temp=null;
try {
BufferedReader in = new BufferedReader(new FileReader("logPredaj.txt"));
String str;
while ((str = in.readLine()) != null) {
temp=str;
}
poslednyZaznam=temp.substring(3,5);
} catch (IOException e) {
}
return poslednyZaznam;
}
@Override public String toString() {
return name + dateFormat.format(new Date()) + ".txt";
}
}
Nasledne v main triede volam iba prikaz
new overTxtsubor();
Ak subor logPredaj.txt neexistuje tak ho program vytvorí. Čiže else vetva podmienky funguje. Ak nie je rozdiel medzi mesiacom z posledneho logu a aktualneho mesiaca tak sa nestane nič. to je tiež v poriadku. Ale ak nastane situacia ked je treba vytvorit novy subor tak sa súbor nevytvori. Ak si dam vypisat na konzolu toString(); obsah sa vypise spravne. Aj ked vypisem hodnoty poslednyZaznamZLogPredaj(); a dateFormat.format(new Date()); tak tiez sa vypisu spravne udaje ktore ocakavam. NetBeans uz teraz nehlási žiadnu chybu ale súbor sa nevytvorí.
Keď toto iste spravím v novom "čistom" projekte (vytvorím zvlášť triedu s rovnakým telom a zavolám ju v main triede) tak sa súbor vytvorí. Teraz už ozaj neviem kde hladať chybu.
Ak už som otravný tak neodpisuj nejak sa s tým skúsim ešte popasovať.
Peťo
není to třeba i tím formátem? koukám, že máš format pouze MM. Prostě se nesplní ta podmínka, aby se přepsal a vytvořil nový soubor...
Formát bol cielene zmenený pretože z posledného logu vyberám iba číslo mesiaca ("08") a nemozem ho porovnávat s formatom ("08_2017"). Preto je formát zmenený. Telo podmienky je v poriadku a podmienka je funkčná. len ten jeden prikaz na premenovanie nie a nie rozbehat. Viem ze tebe sa takto tazko hlada chyba. Preto uz neziadam zazraky iba keby ta nieco napadlo... Ak to nevyriesim dnes tymto sposobom tak ma este napadlo premenovat subor pomocou cmd prikazoveho riadku. To by tiez mohlo fungovat tak to vyskusam aj takym spôsobom.
Zobrazeno 19 zpráv z 19.