Zapis i odczyt binarny pliku

Spis treści

Zadanie

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.

Rozwiązanie

W tym zadaniu korzystać należy z DataInputStream/DataOutputStream lub RandomAccessFile.

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FileWriter {
    public static void main(String[] args) {
        RandomAccessFile stream = null;
        int readBytesCount = 0;

        try {
            stream = new RandomAccessFile("daneBinarne.txt", "rw");
        } catch (FileNotFoundException e) {
            System.out.println("Błąd otwierania strumienia");
        }

        try {
            stream.writeUTF("Dawid");
            stream.writeInt(2021); // tutaj można również skorzystać z Java Time API
            stream.writeDouble(50 / 4);

            stream = new RandomAccessFile("daneBinarne.txt", "rw");
            while (stream.read() != -1)
                readBytesCount++;
        } catch (IOException e) {
            System.out.println("Błąd wejścia-wyjścia");
        }

        try {
            stream.close();
        } catch (IOException e) {
            System.out.println("Błąd zamykania strumeinia");
        }

        System.out.println("Liczba bajtów wynosi: " + readBytesCount);
    }

}

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

snt.banzai

Co może być nie tak z poniższym kodem? Przy wykonywaniu programu zwracana wartość bajtów wynosi: "java.io.DataInputStream@..." i dalej jakieś pierdoły. try{ zapisRoku.writeUTF(Integer.toString(podanyRok)); zapisRoku.close(); System.out.print("Ilość bajtów jakie zajmuje zapisany w pliku rok wynosi: "); odczytRoku = new DataInputStream(new FileInputStream("binarne.txt")); while(odczytRoku.read() != -1){ zczytaneBajty++; } System.out.print(odczytRoku); odczytRoku.close();

Dawid Kunert

Spróbuj wyświetlić zczytaneBajty, a nie odczytRoku :) I daj odczytRoku.close(); w bloku try i po tym bloku catch(IOException e){} i powinno być ok.

snt.banzai

Aaaa, dzięki. Tak też myślałem, ze to jakaś oczywista oczywistość, tylko tego nie dostrzegam:)

Łepcio

W pliku .txt mam wszystko wykrzaczone - Dawid Ţ@( W czym problem? Pobierałem nawet Notepad++ i formatowałem w nim plik na UTF-8, ale nic to nie dało..

Dawid Kunert

W tym zadaniu ćwiczyliśmy zapis binarny. W twoim pliku dane zostały zapisane binarnie, czyli jak to powiedziałeś są wykrzaczone :) Aby je odczytać musisz napisać odpowiednią metodę w programie :) Nie jesteś w stanie po normalnym otworzeniu pliku odczytać zawartości.