Diskuze: Praca z textovim suborom
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.
Zkus načítat řádek po řádku a který řádek potřebuješ, tak tam se zastav.
ok ale ja poviem programu ze chcem riadok 5 a on nacita 1-5 a potom sa
zastavi to by aj isle ale ked mu poviem ze cgcem riadok 555 tak to bude nacitat
riadok 1 az riadok 555 a medi tim mi zaplni ramku ani nigdi nedostane
ja chcem priamo len ten riadok ok ?
Ahoj, přímo na daný řádek se nedostaneš. Jediný způsob Ti tu už napsali a to načítat soubor řádek po řádku dokud se nedostaneš tam kam potřebuješ.
Tak bych se chtěl opravit. Trošku jsem zagooglil a přeci jenom jsem něco
našel.
Pro načítání malých souborů můžeš použít toto:
String line = Files.readAllLines(Paths.get("file.txt")).get(555);
Pro načítání větších souborů pak toto:
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
String line = lines.skip(555).findFirst().get());
} catch (IOException e) {
e.printStackTrace();
}
Skús toto:
String text_riadka="";
try (BufferedReader reader = new BufferedReader(new FileReader(Nejaky súbor)))
{
int pocet_riadkov_suboru=0;
while(reader.readLine() != null)
{
pocet_riadkov_suboru++;
}
for(int i=0;i<pocet_riadkov_suboru; i++)
{
String s=reader.readLine();
if(i==Pozadovany_riadok)
{
text_riadka=s;
}
}
}catch(Exception e){e.printStackTrace();}
Trocha nepraktické ale hádam pôjde
Takže se zeptáš streamu n-krát, jestli má ještě řádek, on ti pak řekne u n+1 pokusu, že nemá a ty se ho ještě n krát budeš zkusit přesvědčit, jestli tam fakt nic nemá? Tohle fungovat opravdu nebude
to sice vypadá elegantně, ale je to dost hnusné. protože toto načte do paměti všechny řádky.
Oprava toho hore:
while(reader.readLine() != null)
{
pocet_riadkov_suboru++;
System.out.println(pocet_riadkov_suboru);
String s=reader.readLine();
if(pocet_riadkov_suboru==Pozadovany riadok)
{
text_riadka=s;
break;
}
}
Tentoraz odskúšané
to ale podle mě nebude fungovat, nevrátí to 555 řádek ale 1110 řádek. readLine přečte řádek a ty ho v jedné iteraci voláš 2× (v podmínce cyklu a při ukládání do proměnné s)
a co to napsat jednoduše
int hleadanyRadek = 555;
for (int i = 0; i < hleadnyRadek - 1; i++) {
if (reader.readLine() == null) {
return null;
}
}
return reader.readLine();
i když ta podmínky v cyklu je zbytečná.... Po úpravě:
int hleadanyRadek = 555;
for (int i = 0; i < hleadnyRadek - 1; i++) {
reader.readLine();
}
return reader.readLine();
while(hledanyRadek-->0) reader.readLine();
return reader.readLine();
Otázka je, jak se chová stream v Javě, když už jsi na konci a pořád po něm něco chceš
to je sice krátké, ale pak už nemůžeš pracovat s proměnnou hledanyRadek. Osobně takové řešení nemám moc rád.
Já myslel, že zadání bylo jen získat daný řádek ze souboru.
ok diky moc za mnoztvo napadou
a ano ide mi len o to nacitat ten dani riadok a nic viac ale asi mi nedoslo
ktore z tich vsetkych rieseni je spravne tak viskusam vsetky
a je zaujimave ako tagmer vsade ste davali priamo riadok cislo 555 aj ked to
bolo prve velke cislo co som natukal
jo a ten return je aky datovi tip ? alebo je to podla toho do akeho datoveho
tipu ho necham vratit ?
Zobrazeno 19 zpráv z 19.