IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Zmena nazvu txt suboru

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
dzavatar.peto:15.8.2017 15:48

Ahojte,

Mám menší problém. Logujem si nejaké používateľské aktivity do logovacieho súboru s názvom "logPredaj.txt". Keď sa dostanem do nového mesiaca tak potrebujem premenovať tento súbor na nejaký rozumný názov (napríklad "08/2017") a potom vytvoriť nový textový súbor s názvom "logPredaj.txt" , kde budem pokračovať v logovaní aktivít pre ďalší mesiac. Nový názov si ale chcem automaticky generovať podľa aktuálneho mesiaca. Tu mi ale program nefunguje. Takto vyzerá môj kód:

File f1 = new File("logPredaj.txt");
        boolean exists=f1.exists();
        if (exists==true) {

            String poslednyZaznam=poslednyZaznamZLogPredaj(); //vytiahne posledný záznam z logovacieho súboru a uloží si číslo mesiaca
            String nazov=getFileDate(); //generuje názov podľa aktuálneho mesiaca vo formáte MM/yyyy
            nazov=nazov.concat(".txt"); //pripojí príponu .txt

            if(poslednyZaznam.equals(aktualnyMesiac)){ //ak sa rovná cislo aktuálneho mesiaca s mesiacom v poslednom zázname z logu
                //nerob nič
            }else{

                File filePredaj = new File(nazov); //vo všetkých examploch na internete sa zadáva názov natvrdo "08/2017" - myslím že problém bude tu...
                f1.renameTo(filePredaj);
                vytvorSubor("logPredaj.txt");

            }

        } else {
            vytvorSubor("logPredaj.txt");
        }

prikladám aj telo metódy vytvorSubor() - > ta mi funguje

public static void vytvorSubor(String meno) {
        try {
            PrintWriter writer = new PrintWriter(meno, "UTF-8");
        } catch (IOException e) {

        }
    }

ďakujem za prípadné odpovede

Peťo

 
Odpovědět
15.8.2017 15:48
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:15.8.2017 16:26

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....

Nahoru Odpovědět
15.8.2017 16:26
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:15.8.2017 16:34

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;8581­2238945;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

 
Nahoru Odpovědět
15.8.2017 16:34
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:15.8.2017 16:38

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?

Nahoru Odpovědět
15.8.2017 16:38
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:15.8.2017 16:40

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?

Nahoru Odpovědět
15.8.2017 16:40
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:15.8.2017 16:42

Ano, presne tak... :)

 
Nahoru Odpovědět
15.8.2017 16:42
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:15.8.2017 16:43

poslední otázka a pakt to postnu
Jak a proč v tom figuruje ten poslední záznam?

Nahoru Odpovědět
15.8.2017 16:43
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:15.8.2017 16:46

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...

 
Nahoru Odpovědět
15.8.2017 16:46
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:15.8.2017 17:35

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ě PoslednyZaznam­LogPredaj() 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ář:)

Editováno 15.8.2017 17:37
Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět
15.8.2017 17:35
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:15.8.2017 17:51

dakujem. ked pridem z roboty vyskusam to. ale ked som si kod pozrel dava mi vyznam. zatial vam dakujem :)

 
Nahoru Odpovědět
15.8.2017 17:51
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:15.8.2017 17:51

č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:)

Nahoru Odpovědět
15.8.2017 17:51
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na dzavatar.peto
Lubor Pešek:15.8.2017 17:52

není zač a PS: ITáci si mezi sebou tykaji;) (to aby se lépe mohli posílat do řiti:) )

Nahoru Odpovědět
15.8.2017 17:52
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na dzavatar.peto
Lubor Pešek:15.8.2017 17:58

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.

Nahoru Odpovědět
15.8.2017 17:58
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:16.8.2017 9:34

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.rename­To(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 UserActivites­FileGenerator()

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 :)

 
Nahoru Odpovědět
16.8.2017 9:34
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na dzavatar.peto
Lubor Pešek:16.8.2017 9:53

:) 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 statickaMetodaK­teraPripraviMa­ximalniVyskuClo­veka(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í....

  • vyhoď to z metody main a dej to do konstruktoru nebo jiné metody
  • změň název metody toString() na nějaký jiný a přidej tam slovo static. Pak tě IDE bude upozorňovat na to, u jakých proměnných ten static musíš dát taky.

PS: UserActivites­FileGenerator() 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;)

Nahoru Odpovědět
16.8.2017 9:53
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:16.8.2017 10:46

No uz mam o tom lepsiu predstavu. Vyskúšam to prerobiť a napíšem ako to dopadlo :)

 
Nahoru Odpovědět
16.8.2017 10:46
Avatar
dzavatar.peto:16.8.2017 13:42

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 poslednyZaznam­ZLogPredaj(); a dateFormat.for­mat(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

 
Nahoru Odpovědět
16.8.2017 13:42
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na dzavatar.peto
Lubor Pešek:16.8.2017 14:10

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...

Nahoru Odpovědět
16.8.2017 14:10
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dzavatar.peto:16.8.2017 14:16

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.

 
Nahoru Odpovědět
16.8.2017 14:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.