Wytłumaczenie kodu binarnego zapisu i odczytu z plików

0

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:

  1. 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:

  1. W jakim celu na początku importujemy instancje: java.io.FileNotFoundException; i java.io.IOException; i za co one odpowiadają?
  2. Dlaczego na początku ustalamy wartość tej zmiennej na null RandomAccessFile strumień = null; ?
  3. Co powoduje instrukcja catch w klauzuli try i dlaczego w nawiasie obok niej jest FileNotFoundException e ?
  4. Dlaczego w kolejnej klauzuli try napisane jest strumień.writeUTF("Dawid"); a nie strumień.writeString("Dawid"); ?
  5. Co oznacza to polecenie while (strumień.read() != -1) ?
  6. Co oznacza polecenie catch (IOException e) ?

Drugie ćwiczenie brzmi tak:

  1. 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ń:

  1. Co znacza ten zapis byte[] bufor = new byte[1024]; i dlaczego w kwadratowym nawiasie jest akurat liczba 1024?
  2. Tak samo ten strumieńWyjściowy.write(bufor, 0, ilośćSczytanychBajtów); .
  3. 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?
0

Jezu, błagam nie piszcie polskich znaków w kodzie.
A po drugie skoro nie wiesz co to znaczy:

byte[] bufor  = new byte[1024]

To wróć do poprzednich lekcji bo tablice to podstawy. A pytanie z puktu 3 to już naprawde słabo, najpierw naucz sie podstaw a później zagłębiaj się dalej, no i generalnie jest dokumentacja Oracla:
https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html#read-byte:A-int-int-

0

A próbowałeś na forum tego kursu zapytać?
http://tinyurl.com/java-spam

1 użytkowników online, w tym zalogowanych: 0, gości: 1