Robot Revue 07/2010
Objektové programování v Javě (6. část – práce se soubory III)
9.7.2024
Dnešní práce se bude zabývat opět datovými proudy. Nejprve se pokusíme vyřešit jednoduchý úkol. Kolik znaků obsahuje daný soubor? Postup bude jednoduchý. Otevřeme vstupní proud <b>InputStream</b> a znaky načteme jeden po druhém. <pre>
package data;
.
import java.io.FileReader;
import java.io.IOException;
.
public class CharacterCounter {
.
/**
* Vytvoříme metodu, která vrátí počet
* znaků v souboru
*
* @param file
* @return
* @throws IOException
*/
.
public int getNumberOfCharactersInFile(
String file) throws IOException {
.
FileReader inputStream = null;
// Vytvořím si proměnnou, do které
// budeme ukládat počet načtených
// znaků
int counter = 0;
try {
// Vytvořím vstupní proud
inputStream = new FileReader(file);
.
int c;
// čtu znak po zanku metodou read
// (pokud vrátí -1 pak už není možné
// další znak číst = jsme na konci
// souboru)
while ((c = inputStream.read()) != -1)
{
// zvednu hodnotu proměnné counter o
// jednotku
counter++;
// nebo provedu konstrukci (counter
// =
// counter + 1);
// nebo provedu tuto konstrukci
// (counter +=counter);
}
}
finally {
if (inputStream != null) {
inputStream.close();
}
}
return counter;
}
}
</pre> ...
Soubory ke stažení
CountTester.java
CharacterCounter.java
Diskuse
připomínky ke kódu
17.8.2024 20:24, Lojza
Myslím, že zvolené příklady nejsou napsány zrovna dobře a jako výuková ukázka tak IMHO nejsou vhodné 1. výtka - chyba v ukázce kódu v komentáři konstrukce counter += counter jako náhrada counter++ je IMO špatně 2. výtka - použité prostředky Použité prostředky by měly odpovídat účelu. Detekce číslic pomocí Regexpu je neefektivní atomovka na vrabce. Navíc je regexp uveden jako jediné možné a zmíněné využití výjimky je v tomto případě šílenost. Možný lepší kód: ----- public int getNumberOfDigitsInFile2(String file) throws IOException{ FileReader inputStream = null; int counter = 0; try{ inputStream = new FileReader(file); int c; while( (c = inputStream.read())!=-1){ byte znak = (byte)c; // lze porovnavat primo znaky, regexp na detekci cislice je atomovka na vrabce if(znak >= '0' && znak <= '9') counter++; } }finally{ if(inputStream != null) inputStream.close(); } return counter; } ----- 3. výtka - optimalizace kódu Vytvářet konstantní regexp v každém cyklu je IMO zbytečné ------ public int getNumberOfPatterns2(String file, String pattern)throws IOException{ FileReader inputStream = null; int counter = 0; try{ inputStream = new FileReader(file); int c; // Pattern vytvarime jen jednou pred cyklem Pattern p = Pattern.compile(pattern); while( (c = inputStream.read())!=-1){ String value = new String(new byte[]{(byte) c}); Matcher m = p.matcher(value); if(m.find()) counter++; } }finally{ if(inputStream != null) inputStream.close(); } return counter; } ------ Za případné chyby se omlouvám, v javě neprogramuji. Ale podstata je doufám zřejmá.




