PO Strumienie - ćwiczenia

From Studia Informatyczne

<<< Powrót do przedmiotu Programowanie obiektowe

<<< Powrót do wykładu Strumienie

Spis treści

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()));
  }
}