Czytanie z pliku binarnego

Dyskusje na temat Javy.
Malutki
Bywalec
Bywalec
Posty: 46
Dołączył(a): czwartek, 7 sierpnia 2008, 10:46

Czytanie z pliku binarnego

Post przez Malutki »

Witam mam pewien problem a dokładniej to jak czytać z pliku binarnego określoną strukturę danych i zamienianie tego na odpowiednie typy.
Dokładniej to mam plik binarny z którego powinienem przeczytać w taki sposób:

3 bajty - powie mi ilu jest użytkowników do wczytania z pliku.
a dalej mamy juz strukturę która się powtórzy * ilość użytkowników.

a struktura wygląda tak :
5 bajtów to numer klienta (int)
5 bajtów to hasło (int)
10 bajtów jego nazwa (char)

nie wiem jak to zrobić aby czytać po kolei ilość bajtów i przekonwertowywać tą ilość bajtów na dany typ.

Proszę o pomoc.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Czytanie z pliku binarnego

Post przez Morfidon »

Musisz dokonać serializacji obiektu. Pokazuje jak to zrobić w video kursie java strumienie lekcja 9.
Malutki
Bywalec
Bywalec
Posty: 46
Dołączył(a): czwartek, 7 sierpnia 2008, 10:46

Re: Czytanie z pliku binarnego

Post przez Malutki »

Obejrzałem ale mam taki oto problem trochę z innej beczki używam metody int read( byte bufor[ ], int poz, int ile )
i jak czytam od 0 do 3 bitu to jest ok a jak chce wczytac dalej czyli od4 bitu do 9 to pisze mi ze nie ma pliku.
Mój programik .

Code: Zaznacz cały

package plik;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Plik {

    public static void main(String[] args) {

        int licznik = 0;
        
        String CurDir = System.getProperty("user.dir");
       

        try {
         
            FileOutputStream plik2 = new FileOutputStream("plik.txt");
            FileInputStream plik = new FileInputStream("BAK.YG2");
            byte[] vec = new byte[3];
            plik.read(vec, 0, 3);
            // int read( byte bufor[ ], int poz, int ile )
           
           
         
            for (int i = 0; i < vec.length; i++) 
            {
                short read;
                licznik =  read = (short) (vec[i]& 255 );
                 
            }
             System.out.println("Liczba wczytanych uzytkowników: " + licznik);
             plik2.write(licznik);
        } catch (Exception ex) {
            System.out.println("Brak pliku ! w lokalizacji " +CurDir);
        }




    }
}
Jest tam trochę nadmiarowości ale to chyba nie przeszkadza.
Panie Arkadiuszu proszę jeszcze o dalsza pomoc.
Malutki
Bywalec
Bywalec
Posty: 46
Dołączył(a): czwartek, 7 sierpnia 2008, 10:46

Re: Czytanie z pliku binarnego

Post przez Malutki »

Jeszcze w woli sprostowania chodzi mi o taki kawałek kodu:
byte[] vec = new byte[3];
plik.read(vec, 0, 3);
to działa

i teraz jak bym chiał od 4 do 9 byta wczytywać.
byte[] vec = new byte[5];
plik.read(vec, 4, 9);

to zwraca ze nie może znaleźć pliku.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Czytanie z pliku binarnego

Post przez Morfidon »

Te parametry działają zdecydowanie inaczej:
public int read(byte[] b,
int off,
int len)
throws IOException
Parameters:
b - the buffer into which the data is read.
off - the start offset in array b at which the data is written.
len - the maximum number of bytes to read.
źródło:
http://docs.oracle.com/javase/1.4.2/doc ... tml#read()

Czemu nie skorzystasz z serializacji tak jak powiedziałem?
Malutki
Bywalec
Bywalec
Posty: 46
Dołączył(a): czwartek, 7 sierpnia 2008, 10:46

Re: Czytanie z pliku binarnego

Post przez Malutki »

Chyba serializacja nie pasuje oglądam tą lekcje ale chyb nie będzie to dobre dla takiej struktury:
Plik jest już dany bo jest z urządzenia.Nie wiem dalej jak takie coś czytać. Proszę nadal o pomoc ,lub podpowiedz.

The number of the users(m): 3B // The first 3 bytes of the *.yg file
Staffer information data: 28B*m // Each staffer has 27 bytes data.

Staffer ID: 5B // The first 3 bytes of staffer information data is the staffer ID
The length of the password+password: 3B // The frist bytes's higher 4 bits are the length of the password. If the staffer does not have a password,it is "ffffff".
Card number: 4B //If the staffer does not have the card number, it is "ffffffff".
Name: 10B
Department: 1B
Group Number: 1B
T&A Mode: 1B
Fingerprint enrollment: 2B //Each user can enroll two fingerprints.If the bit0 = 1, the first fingerprint is enrolled. If the bit1=1, the second fingerprint is enrolled.
Special information: 1B //(Binary system)Check the bit7-bit6. If it is 01, the staffer is normal user. If it is 11, the staffer is the manager. Check the bit4. If it is 1, the wiegand output is WG34. If it is 0, the wiegand output is WG26.
Malutki
Bywalec
Bywalec
Posty: 46
Dołączył(a): czwartek, 7 sierpnia 2008, 10:46

Re: Czytanie z pliku binarnego

Post przez Malutki »

OK Panie Arkadiuszu już zajarzyłem jak to działa dziękuje za pomoc.
Mój sposób to czytanie do tablicy od bajtu 3 metodą read i co któryś bajt przerywanie i znów czytanie i jeśli jakiś bajt zostanie wczytany to powtarzam.
czyli czytam od 4 do 9 i zapisuje metoda sumuj bajty wynik i tak wkółko :)
Mam nadzieje że dobrze myślę ale to już jutro sprawdzę do końca czy działa ok narazie czytałem od bajtu 0 do 3 i dało mi w wyniku to co chciałem.
Post Reply