|
|
(Nie pokazano 3 pośrednich wersji utworzonych przez tego samego użytkownika) |
Linia 96: |
Linia 96: |
| Rozszerz przykład ''KompresjaGZIP'' o kod potwierdzający, czy rzeczywiście kompresja jest odwracalna. Do weryfikacji użyj sumy kontrolnej ''CRC32''. | | Rozszerz przykład ''KompresjaGZIP'' o kod potwierdzający, czy rzeczywiście kompresja jest odwracalna. Do weryfikacji użyj sumy kontrolnej ''CRC32''. |
|
| |
|
| {{rozwiazanie|||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
| | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> |
| | <span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> |
| | <div class="mw-collapsible-content" style="display:none"> |
| '''import''' java.io.*; | | '''import''' java.io.*; |
| '''import''' java.util.zip.*; | | '''import''' java.util.zip.*; |
Linia 136: |
Linia 138: |
| } | | } |
| </div> | | </div> |
| </div>}} | | </div> |
|
| |
|
| == Zadanie 5 == | | == 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. | | 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. |
| | | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> |
| {{rozwiazanie|||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
| | <span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> |
| | <div class="mw-collapsible-content" style="display:none"> |
| '''import''' java.io.*; | | '''import''' java.io.*; |
| | | |
Linia 173: |
Linia 176: |
| } | | } |
| </div> | | </div> |
| </div>}} | | </div> |
|
| |
|
| == Zadanie 6 == | | == 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. | | Rozszerz poprzednie zadanie tak, aby czas kopiowania był mierzony i wypisywany na konsolę. Sprawdź jaki wpływ na efektywność ma użycie buforowania. |
| | | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> |
| {{rozwiazanie|||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
| | <span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> |
| | <div class="mw-collapsible-content" style="display:none"> |
| '''import''' java.io.*; | | '''import''' java.io.*; |
| '''import''' java.util.Date; | | '''import''' java.util.Date; |
Linia 216: |
Linia 220: |
| } | | } |
| </div> | | </div> |
| </div>}} | | </div> |
Aktualna wersja na dzień 21:26, 28 maj 2020
<<< 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()));
}
}