Witam. Przerabiam kurs Javy na javastart.pl, jednak kompletnie nie pojmuję zagadnień binarnego zapisu i odczytu z plików. Po tej lekcji są dwa ćwiczenia do wykonania. Pierwsze brzmi:
- Do pliku daneBinarne.txt zapisz swoje imię, aktualny rok i wynik dzielenia 50/4. Następnie z tego samego pliku odczytaj ile znajduje się w nim bajtów.
Jako, że nie wiedziałem nawet od czego zacząć, kliknąłem w rozwiązanie. Kod wygląda tak:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Zapisywanie {
public static void main(String[] args) {
RandomAccessFile strumień = null;
int ilośćSczytanychBajtów = 0;
try {
strumień = new RandomAccessFile("daneBinarne.txt", "rw");
} catch (FileNotFoundException e) {
System.out.println("Błąd otwierania strumienia");
}
try {
strumień.writeUTF("Dawid");
strumień.writeInt(2014);
strumień.writeDouble(50 / 4);
strumień = new RandomAccessFile("daneBinarne.txt", "rw");
while (strumień.read() != -1)
ilośćSczytanychBajtów++;
} catch (IOException e) {
System.out.println("Błąd wejścia-wyjścia");
}
try {
strumień.close();
} catch (IOException e) {
System.out.println("Błąd zamykania strumeinia");
}
System.out.println("Ilość bajtów wynosi: " + ilośćSczytanychBajtów);
}
}
Mimo usilnych prób nie jestem w stanie zrozumieć niektórych elementów kodu. W związku z tym mam prośbę o wytłumaczenie mi tych elementów:
- W jakim celu na początku importujemy instancje:
java.io.FileNotFoundException;
ijava.io.IOException;
i za co one odpowiadają? - Dlaczego na początku ustalamy wartość tej zmiennej na null
RandomAccessFile strumień = null;
? - Co powoduje instrukcja
catch
w klauzulitry
i dlaczego w nawiasie obok niej jestFileNotFoundException e
? - Dlaczego w kolejnej klauzuli
try
napisane jeststrumień.writeUTF("Dawid");
a niestrumień.writeString("Dawid");
? - Co oznacza to polecenie
while (strumień.read() != -1)
? - Co oznacza polecenie
catch (IOException e)
?
Drugie ćwiczenie brzmi tak:
- Korzystając z własnego buforowania przekopiuj dane znajdujące się w pliku binarnie.txt do przekopiowane.txt. Dodatkowo zlicz ilość skopiowanych bajtów.
(Podpowiedź: użyj metody write(byte[] b, int off, int len), dostępnej w każdej z dzisiaj omówionych klas).
Kod z rozwiązania:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class KopiowanieBinarne {
public static void main(String[] args) {
DataInputStream strumieńWejściowy = null;
DataOutputStream strumieńWyjściowy = null;
try {
strumieńWejściowy = new DataInputStream(new FileInputStream("binarnie.txt"));
strumieńWyjściowy = new DataOutputStream(new FileOutputStream("przekopiowane.txt"));
} catch (FileNotFoundException e) {
System.out.println("Nie znaleziono takiego pliku");
}
int ilośćSczytanychBajtów = 0;
int całkowitaIlośćBajtów = 0;
byte[] bufor = new byte[1024];
try {
while ((ilośćSczytanychBajtów = strumieńWejściowy.read(bufor)) != -1) {
strumieńWyjściowy.write(bufor, 0, ilośćSczytanychBajtów);
całkowitaIlośćBajtów += ilośćSczytanychBajtów;
}
} catch (IOException e) {
System.out.println("Bład wejścia-wyjścia");
}
try {
if(strumieńWejściowy != null) strumieńWejściowy.close();
if(strumieńWyjściowy != null) strumieńWyjściowy.close();
} catch (IOException e) {
System.out.println("Błąd zamykania strumieni");
}
System.out.println(całkowitaIlośćBajtów);
}
}
Co do tego kodu też mam parę pytań:
- Co znacza ten zapis
byte[] bufor = new byte[1024];
i dlaczego w kwadratowym nawiasie jest akurat liczba 1024? - Tak samo ten
strumieńWyjściowy.write(bufor, 0, ilośćSczytanychBajtów);
. - Co oznacza ta linijka kodu
całkowitaIlośćBajtów += ilośćSczytanychBajtów;
. Czy chodzi tu od dodanie do siebie wartości tych dwóch zmiennych?