Temat: Czytanie zapis binarnych danych do pliku

Java nie ma struktur, więc odpada proste wczytanie do struktury np. jakiegoś nagłówka. Używa się readInt,readDouble. Jak z wydajnością przy użyciu new DataInputStream(new BufferedInputStream(new FileInputStream ?
Czy jest możliwość mapowania do pamięci (CreateFileMapping,MapViewOfFile)? chociaż i tak na wiele to się nie przyda. Jak wykonać seek pliku? Czy zamiast tego trzeba będzie użyć mark dla początkowej pozycji a potem wielokrotnie wracać przez reset i skipBytes?
Następną sprawą jest to że Java używa big endian. Jak konwertować przy odczycie, są do tego funkcje? Czy liczby zmiennoprzecinkowe w Javie zapisywane są tak jak w komputerze tylko dokładnie odwrotna kolejność bajtów, czy też dla zmiennoprzecinkowych nie ma różnicy?

Temat: Czytanie zapis binarnych danych do pliku

Jeszcze jest klasa RandomAccessFile, ale co z buforowaniem w przypadku jej użycia?
Piotr Nowicki

Piotr Nowicki JFB Systems,
właściciel

Temat: Czytanie zapis binarnych danych do pliku

jeśli chcesz konwertować na little endian to looknij tutaj:
http://piotr-nowicki.pl/dobre-praktyki/zapis-liczby-ca...

seek pliku za pomocą RandomAccessFile, ale nie da się jej buforować

Temat: Czytanie zapis binarnych danych do pliku

Czy to będzie wolniej działało jeśli nie będzie buforowania? System operacyjny powinien buforować. Z drugiej strony gdyby używać mark/reset ?

konto usunięte

Temat: Czytanie zapis binarnych danych do pliku

a BufferedInputStream?

Temat: Czytanie zapis binarnych danych do pliku

Łukasz Grabski:
a BufferedInputStream?

Widzę że jest wiele możliwości do wyboru.
Problem przedstawia się następująco: ma być tworzony i czytany w pliku katalog płyt CD. Mamy tam wielokrotnie czytanie małych porcji danych jak rozmiar, czas czy indeks w pliku a także jednobajtową długość nazwy. Zależy mi więc na tym aby zapis był buforowany.
new DataInputStream(new FileInputStream(fileName));
nie jest buforowany
BufferedReader nie nadaje się bo zwraca łańcuchy char zamiast danych.
A jeszcze jest BufferedInputStream.
A może BufferedInputStream+DataInputStream ?
new DataInputStream(new BufferedInputStream(new FileInputStream()))
wtedy można by czytać np. inta z bufora.
A co z użyciem surowego BufferedInputStream? Ma funkcję read:
public int read(byte[] b, int off, int len) throws IOException
Jak konwertujemy tablicę 4 bajtów na inta, nie możemy po prostu rzutować, czy konwertuje do Big Endian?
Może BufferedInputStream będzie szybsze niż DataInputStream bo to drugie czyta po bajcie i konwertuje na Big Endian. (a w jakim formacie Java trzyma double i float?). Użycie samego BufferedInputStream nie wymusza Big Endian?

Drugą sprawą są łańcuchy.
Trzymane są jako UTF8, przy czym w większości przypadków nie występują znaki spoza 7-bitowego ASCII. Czy wszystkie czytać jako UTF8, bo w klasie DataInputStream jest readUTF a nie ma tego w BufferedInputStream?
Czyli, myślę że rozwiązaniem będzie:
- new DataInputStream(new BufferedInputStream(new FileInputStream()))
- Big Endian bo jest obsługiwane przez DataInputStream
- wszystkie ciągi znakowe traktowane jako UTF8
W jakim formacie plikowym musi być string?
Źródła pokazują:
int utflen = in.readUnsignedShort();
czyli na początku muszą być dwa bajty określające długośćAndrzej Borucki edytował(a) ten post dnia 07.06.11 o godzinie 16:38
Szymon Biliński

Szymon Biliński Programista Java

Temat: Czytanie zapis binarnych danych do pliku

Andrzej Borucki:
Problem przedstawia się następująco: ma być tworzony i czytany w pliku katalog płyt CD. Mamy tam wielokrotnie czytanie małych porcji danych jak rozmiar, czas czy indeks w pliku a także jednobajtową długość nazwy. Zależy mi więc na tym aby zapis był buforowany.

Jeżeli to nie jest aplikacja szkoleniowa/na zaliczenie (wnioskuję po płytach CD :), to proponowałbym pomyśleć nad bazą danych (np. sqllite).
A może BufferedInputStream+DataInputStream ?
new DataInputStream(new BufferedInputStream(new FileInputStream()))

Strumienie w Javie mogą być łączone w łańcuch (stream chaining) - tj. możesz je ustawić w dowolnej konfiguracji, tak by było to zgodne z oczekiwaniami aplikacji (np. tak jak podałeś plik->bufor->jakieś formatowanie). Przy czym panuje tu zasada, że 1 narzędzie służy do 1 rzeczy.

Możesz też skorzystać z Java NIO, które bazuje na trochę innych założeniach.
Drugą sprawą są łańcuchy.
Trzymane są jako UTF8, przy czym w większości przypadków nie występują znaki spoza 7-bitowego ASCII. Czy wszystkie czytać jako UTF8, bo w klasie DataInputStream jest readUTF a nie ma tego w BufferedInputStream?

BufferedInputStream jedynie *buforuje* wyniki. Interpretacją zajmuje się DataInputStream, ObjectInputStream (to tak a propos braku struktur) lub jakiś *Reader, który jest kolejnym elementem łańcucha.
W jakim formacie plikowym musi być string?

UTF8 jest zasadniczo bezpiecznym założeniem. Dane możesz wczytywać metodą readUTF z DataInputStream - szczegóły formatu znajdziesz w javadoc tej klasy.Szymon Biliński edytował(a) ten post dnia 07.06.11 o godzinie 18:24

Temat: Czytanie zapis binarnych danych do pliku

Szymon Biliński:
Jeżeli to nie jest aplikacja szkoleniowa/na zaliczenie (wnioskuję po płytach CD :), to proponowałbym pomyśleć nad bazą danych (np. sqllite).

Ta baza CD to praktyczny program przy którym chcę się podszkolić w Javie. Myślę że jeszcze napotkam pewne trudności, np. przy skanowaniu lista logicznych dysków, informacje o dysku:label, wolne sektory,rozmiar sektora itp. Te funkcje wiem jak można zrobić w WinApi, nie wiem jak w Javie, zwłaszcza gdy program miał by być przenośny do Linuksa.
To raczej ma działać na plikach, SQLite może być ciekawą sprawą, myślę że nadawał by się do programu zarządzającego budżetem domowym. Nigdy dotąd nie używałem JDBC, jak zacząć? Są jakieś przykłady do tego?
Czy warto używać JDBC, czy może dla dll-ki SQLite jest jakiś wrapper eksportujący metody natywne Javy?

konto usunięte

Temat: Czytanie zapis binarnych danych do pliku

Defaultem stal sie juz jdbc a nawet warstwy powyzej ;)
Widze, ze interesuja cie bebechy, wiec pewnie warto bedzie postawic na jdbc (ofkors jezeli chodzi o nauke javy jako javy ;)).

Tutoriali w sieci mase.

A jezeli chodzi o czytanie informacji o dyskach - z tego co mi wiadomo to juz raczej wbudowane w api, jezeli nie to istnieja zapewne rozwiazania third party.

PS
Jezeli chcialbys jednak postawic na cos niestandardowego, polecam np grafy ;)Łukasz Grabski edytował(a) ten post dnia 07.06.11 o godzinie 21:02

Temat: Czytanie zapis binarnych danych do pliku

Znalazłem coś: http://www.ii.uni.wroc.pl/~prz/200405/2005lato/java/jd...
Jest opisane m.in.w Java. Techniki zaawansowane. Cay S. Horstmann, Gary Cornell, to II - drogi, mam tylko pierwszy tom
A Api do dysków można znaleźć może szukając w http://download.java.net/jdk7/docs/



Wyślij zaproszenie do