[ Pobierz całość w formacie PDF ]
jest taka sama dla ka dej warto ci danego typu, to wczytanie ich z powrotem b dzie szybsze
ni parsowanie zapisu tekstowego.
Zale nie od platformy u ytkownika, liczby ca kowite i zmiennoprzecinkowe mog by
przechowywane w pami ci na dwa ró ne sposoby. Za ó my, e pracujesz z cztero-
bajtow warto ci , tak jak int, na przyk ad 1234, czyli 4D2 w zapisie szesnastkowym
(1234 = 4256+1316+2). Mo e ona zosta przechowana w ten sposób, e pierwszym
z czterech bajtów pami ci b dzie bajt najbardziej znacz cy (ang. most significant byte,
MSB): 00 00 04 D2. Albo w taki sposób, e b dzie to bajt najm odszy (ang. least signifi-
cant byte, LSB): D2 04 00 00. Pierwszy sposób stosowany jest przez maszyny SPARC,
a drugi przez procesory Pentium. Mo e to powodowa problemy z przenoszeniem nawet
najprostszych plików danych pomi dzy ró nymi platformami. W j zyku Java zawsze sto-
sowany jest pierwszy sposób, niezale nie od procesora. Dzi ki temu pliki danych progra-
mów w j zyku Java s niezale ne od platformy.
Metoda writeUTF zapisuje a cuchy, u ywaj c zmodyfikowanej wersji 8-bitowego kodu UTF
(ang. Unicode Text Format). Zamiast po prostu zastosowa od razu standardowe kodowanie
UTF-8 (przedstawione w tabeli 1.4), znaki a cucha s najpierw reprezentowane w kodzie
UTF-16 (patrz tabela 1.5), a dopiero potem przekodowywane na UTF-8. Wynik takiego kodo-
wania ró ni si dla znaków o kodach wi kszych od 0xFFFF. Kodowanie takie stosuje si dla
zachowania zgodno ci z maszynami wirtualnymi powsta ymi, gdy Unicode zadowala si
tylko 16 bitami.
Poniewa opisana modyfikacja kodowania UTF-8 stosowana jest wy cznie na platformie Java,
to metody writeUTF powinni my u ywa tylko do zapisu a cuchów przetwarzanych przez
programy wykonywane przez maszyn wirtualn Java. W pozosta ych przypadkach nale y
u ywa metody writeChars.
Rozdzia 1. Strumienie i pliki 41
Tabela 1.4. Kodowanie UTF-8
Zakres znaków Kodowanie
0...7F 0a6a5a4a3a2a1a0
80...7FF 110a10a9a8a7a6 10a5a4a3a2a1a0
800...FFFF 1110a15a14a13a12 10a11a10a9a8a7a6 10a5a4a3a2a1a0
10000...10FFFF 11110a20a19a18 10a17a16a15a14a13a12 10a11a10a9a8a7a6 10a5a4a3a2a1a0
Tabela 1.5. Kodowanie UTF-16
Zakres znaków Kodowanie
0...FFFF a15a14a13a12a11a10a9a8 a7a6a5a4a3a2a1a0
10000...10FFFF 110110b19b18b17b16a15a14a13a12a11a10 110111a9a8 a7a65a4a3a2a1a0 gdzie b19b18b17b16 =
a20a19a18a17a16 - 1
Definicje kodów UTF-8 i UTF-16 znajdziesz w dokumentach, odpowiednio: RFC 2279
(http://ietf.org/rfc/rfc2279.txt) i RFC 2781 (http://ietf.org/rfc/rfc2781.txt).
Aby odczyta dane, korzystamy z poni szych metod interfejsu DataInput:
readInt
readShort
readLong
readFloat
readDouble
readChar
readBoolean
readUTF
Klasa DataInputStream implementuje interfejs DataInput. Aby odczyta dane binarne z pli-
ku, czymy obiekt klasy DataInputStream ze ród em bajtów, takim jak na przyk ad obiekt
klasy FileInputStream:
DataInputStream in = new DataInputStream(new FileInputStream("employee.dat"));
Podobnie, aby zapisa dane binarne, u ywamy klasy DataOutputStream implementuj cej
interfejs DataOutput:
DataOutputStream out = new DataOutputStream(new FileOutputStream("employee.dat"));
java.io.DataInput 1.0
boolean readBoolean()
byte readByte()
char readChar()
double readDouble()
float readFloat()
42 Java. Techniki zaawansowane
int readInt()
long readLong()
short readShort()
wczytuje warto okre lonego typu.
void readFully(byte[] b)
wczytuje bajty do tablicy b, blokuj c w tek, dopóki wszystkie bajty nie zostan
wczytane.
Parametry: b bufor, do którego zapisywane s dane.
void readFully(byte[] b, int off, int len)
wczytuje bajty do tablicy b, blokuj c w tek, dopóki wszystkie bajty nie zostan
wczytane.
Parametry: b bufor, do którego zapisywane s dane.
off indeks pierwszego bajta.
len maksymalna ilo odczytanych bajtów.
String readUTF()
wczytuje a cuch znaków zapisanych w zmodyfikowanym formacie UTF-8.
int skipBytes(int n)
ignoruje n bajtów, blokuj c w tek, dopóki wszystkie bajty nie zostan
zignorowane.
Parametry: n liczba ignorowanych bajtów.
java.io.DataOutput 1.0
void writeBoolean(boolean b)
void writeByte(int b)
void writeChar(char c)
void writeDouble(double d)
void writeFloat(float f)
void writeInt(int i)
void writeLong(long l)
void writeShort(short s)
zapisuj warto okre lonego typu.
void writeChars(String s)
zapisuje wszystkie znaki podanego a cucha.
void writeUTF(String s)
zapisuje a cuch znaków w zmodyfikowanym formacie UTF-8.
Rozdzia 1. Strumienie i pliki 43
Strumienie plików o swobodnym dost pie
Strumie RandomAccessFile pozwala pobra lub zapisa dane w dowolnym miejscu pliku.
Do plików dyskowych mo emy uzyska swobodny dost p, inaczej ni w przypadku strumieni
danych pochodz cych z sieci. Plik o swobodnym dost pie mo emy otworzy w trybie tylko
do odczytu albo zarówno do odczytu, jak i do zapisu. Okre lamy to, u ywaj c jako drugiego
argumentu konstruktora a cucha "r" (odczyt) lub "rw" (odczyt i zapis).
RandomAccesFile in = new RandomAccesFile("employee.dat", "r");
RandomAccesFile inOut = new RandomAccesFile("employee.dat", "rw");
Otwarcie istniej cego pliku przy u yciu RandomAccessFile nie powoduje jego skasowania.
Plik o swobodnym dost pie posiada wska nik pliku. Wska nik pliku opisuje pozycj nast p-
nego bajta, który zostanie wczytany lub zapisany. Metoda seek zmienia po o enie wska nika,
okre laj c numer bajta, na który wskazuje. Argumentem metody seek jest liczba typu long
z przedzia u od 0 do d ugo ci pliku w bajtach.
Metoda getFilePointer zwraca aktualne po o enie wska nika pliku.
Klasa RandomAccessFile implementuje zarówno interfejs DataInput, jak i DataOutput. Aby
czyta z pliku o swobodnym dost pie, u ywamy tych samych metod, np. readInt/writeInt
lub readChar/writeChar, które omówili my w poprzednim podrozdziale.
Prze ledzimy teraz dzia anie programu, który przechowuje rekordy pracowników w pliku
[ Pobierz całość w formacie PDF ]