<<< Powrót do przedmiotu Programowanie obiektowe
<<< Powrót do wykładu Strumienie
Zadanie 1
Napisz program odczytujący plik class, którego nazwę podano jako parametr wywołania i wypisujący na standardowe wyjście cztery pierwsze bajty tego pliku w zapisie szenastkowym.
Rozwiązanie
import java.io.*;
public class Zad1 {
public static void main(String[] args) throws IOException {
BufferedInputStream is = new BufferedInputStream(new FileInputStream(args[0]));
for (int i = 1; i <= 4; i++)
System.out.print( Integer.toHexString(is.read()) );
is.close();
}
}
Zadanie 2
Napisz program, który czyta plik tekstowy linia po linii i wypisuje jego zawartość na konsolę. Nazwa pliku do odczytania powinna być przekazywana jako parametr wywołania. Do wypisywania użyj obiektu klasy PrintWriter.
Rozwiązanie
import java.io.*;
public class Zad2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(args[0]));
// dzięki podaniu drugiego parametru,
// bufor będzie opróżniany po wypisaniu każdej linii
PrintWriter pw = new PrintWriter(System.out, true);
String s;
while ( (s = br.readLine()) != null )
pw.println(s);
br.close();
}
}
Zadanie 3
Zmodyfikuj rozwiązanie poprzedniego zadania, tak aby program pytał o nazwę pliku do wypisania oraz czy wypisywać kolejny plik. Obsłuż mogące się pojawiać wyjątki.
Rozwiązanie
import java.io.*;
public class Zad3 {
static BufferedReader sin;
public static BufferedReader plikDoOdczytania() {
String odp = "";
while (true)
try {
System.out.println("Podaj nazwę pliku do wypisania.");
System.out.println("Jeżeli chcesz zakończyć wpisz \"koniec\".");
odp = sin.readLine();
if (odp.equals("koniec"))
return null;
else
return new BufferedReader(new FileReader(odp));
} catch (IOException e) {
System.out.println("Błąd: Nie udało się otworzyć pliku: "+odp);
}
}
public static void main(String[] args) {
sin = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br;
while ( (br = plikDoOdczytania()) != null )
try {
// dzięki podaniu drugiego parametru,
// bufor będzie opróżniany po wypisaniu każdej linii
PrintWriter pw = new PrintWriter(System.out, true);
String s;
while ( (s = br.readLine()) != null )
pw.println(s);
br.close();
} catch (IOException e) {
System.out.println("Błąd: Nie udało się odczytywanie pliku.");
}
System.out.println("Do następnego razu!");
}
}
Zadanie 4
Rozszerz przykład KompresjaGZIP o kod potwierdzający, czy rzeczywiście kompresja jest odwracalna. Do weryfikacji użyj sumy kontrolnej CRC32.
Rozwiązanie
import java.io.*;
import java.util.zip.*;
public class Zad4 {
public static void main(String[] args) throws IOException {
// wersja dla Linuxa
String nazwaPliku = "/tmp/io_test.gzip";
// wersja dla Windows
//String nazwaPliku = "c:\\io_test.gzip";
CheckedOutputStream cos = new CheckedOutputStream(
new GZIPOutputStream(new FileOutputStream(nazwaPliku)),
new CRC32());
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(
new BufferedOutputStream(cos)));
pw.write("kompresja w Javie jest prosta");
pw.flush();
Checksum outCs = cos.getChecksum();
pw.close();
// dekompresja
CheckedInputStream cis = new CheckedInputStream(
new GZIPInputStream(new FileInputStream(nazwaPliku)),
new CRC32());
BufferedReader br = new BufferedReader(
new InputStreamReader(
new BufferedInputStream(cis)));
String s;
while ( (s = br.readLine()) != null )
System.out.println(s);
Checksum inCs = cis.getChecksum();
br.close();
if ( outCs.getValue() != inCs.getValue() )
System.err.println("Sumy kontrolne się nie zgadzają");
}
}
Zadanie 5
Przygotuj program kopiujący znak po znaku pliki tekstowe. Za kopiowanie powinna odpowiadać wydzielona metoda echo(Reader, Writer). Nazwa pliku źródłowego i docelowego powinny być przekazywane jako parametr wywołania. Nie obsługuj żadnych wyjątków, ale pamiętaj o właściwym zamykaniu obu plików.
Rozwiązanie
import java.io.*;
public class Zad5 {
public static void echo(Reader r, Writer w) throws IOException {
int i;
while ( (i = r.read()) != -1 )
w.write((char) i);
}
public static void main(String[] args) throws Exception {
Reader r = null;
Writer w = null;
try {
r = new BufferedReader(new FileReader(args[0]));
w = new PrintWriter(args[1]);
echo(r, w);
} finally {
try {
r.close();
} catch (IOException e) {
System.out.println("Wystąpił błąd przy zamykaniu pliku wejściowego.");
}
try {
w.close();
} catch (IOException e) {
System.out.println("Wystąpił błąd przy zamykaniu pliku wyjściowego.");
}
}
}
}
Zadanie 6
Rozszerz poprzednie zadanie tak, aby czas kopiowania był mierzony i wypisywany na konsolę. Sprawdź jaki wpływ na efektywność ma użycie buforowania.
Rozwiązanie
import java.io.*;
import java.util.Date;
public class Zad6 {
public static void echo(Reader r, Writer w) throws IOException {
int i;
while ( (i = r.read()) != -1 )
w.write((char) i);
}
public static void main(String[] args) throws Exception {
Date d1 = new Date();
Reader r = null;
Writer w = null;
try {
//r = new FileReader(args[0]);
r = new BufferedReader(new FileReader(args[0]));
//w = new FileWriter(args[1]);
w = new PrintWriter(args[1]);
echo(r, w);
} finally {
try {
r.close();
} catch (IOException e) {
System.out.println("Wystąpił błąd przy zamykaniu pliku wejściowego.");
}
try {
w.close();
} catch (IOException e) {
System.out.println("Wystąpił błąd przy zamykaniu pliku wyjściowego.");
}
}
Date d2 = new Date();
System.out.println("Kopiowanie trwało: " + (d2.getTime()-d1.getTime()));
}
}