NIO (New Input/Output)
Det här API:et finns från och med SDK 1.4. Syftet är att
utgöra ett Java API för IO-funktionalitet i operativsystemet. NIO
består alltså mer av direkta operativsystemsanrop än tidigare
IO-API:er som implementerade funktionalitet direkt i Java.
Den största fördelen med NIO jämfört med tidigare IO-hantering
är att NIO är snabbare. Dessutom tillkommer en del ny funktionalitet.
Nackdelen är att det beter sig olika i olika operativ och att vi får
sämre koll på vad som egentligen händer.
Buffertar
I java.io är strömmarna konstruerade så att en byte i taget
flyttas från ström till ström och processas på något
sätt i varje ström. I java.nio hanteras i stället operativsystemets
buffertar. Här kommer ett program som jämför prestanda hos
olika IO-API:er genom att kopiera en fil. Det visar också hur buffertar
används i java.nio. Starta det genom att skriva java FileCopyTest
<frånfil> <tillfil> FileCopyTimer.java
Med 1024 byte stor buffert i java.nio blev resultatet på RedHat 8.0
att java.nio är dubbelt så snabbt som InpuStream/OutputStream i
java.io som i sin tur är dubbelt så snabbt som Reader/Writer i
java.io. Det blev ingen större skillnad om en direkt buffer användas
i java.nio eller inte.
Fillås
Det går att låsa en angiven del av en fil, se klassen java.nio.channels.FileLock.
Det finns exclusive och shared locks. Shared locks kan låsas flera gånger
medans exclusive locks bara kan låsas en gång och desutom bara
om det inte finns något shared lock.
Mycket av funktionaliteten är plattformsberoende:
- Ifall låsen är mandatory (förhindrar åtkomst
av det låsta filavsnittet) eller advisory (förhindrar låsning
av det låsta filavsnittet)
- Om alla lås på en viss fil släpps när en kanal
till filen stängs.
- Vilka lås som är tillåtna vid nätverksbaserade
filsystem.
Om ett program ska ha en rimlig chans att vara plattformsoberoende är
det bäst att följa dessa regler:
- Använd bara exclusive locks.
- Antag att alla lås är advisory.
- Antag att låsen endast gäller en process.
Nonblocking I/O
Det går att vänta på att något ska hända på
någon av ett antal angivna Channel. Detta hanteras av klassen
Selector. Metoden Selector.select() liknar systemanropet
select() i UNIX. Metoden returnerar när något hänt
med någon av Selectorns registrerade kanaler. Det gör
det möjligt att skriva en flertrådad server där en och samma
tråd vänta på alla öppna förbindelser. Vi slipper
då den stora mängden trådar i den tidigare klassiska lösningen
där en tråd väntade på varje klient.
Här kommer en flertrådad chatserver med en Selector,
MultiplexedChatServer.java, och
här kommer en klient till den, ChatClient.java.
MappedByteBuffer
En fil kan mappas mot en bytearray i minnet. Ändringar i arrayen medför
då automatiskt uppdateringar i filen och tvärtom. Endast delar
av filen som accessas läses in i bufferten.
Omvandling mellan bytes och olika teckenuppsättningar
Paketet java.nio.charset innehåller funktionalitet för
att omvandla mellan råa bytes och olika teckenuppsättningar. Detta
utförs lite här och där i Java men detta torde vara det enklaste
API:et.
Här kommer ett program som använder både Charset
och MappedByteBuffer. Det byter alla förekomster av en angiven
sträng i en fil, Replace.java. Starta det
genom att skriva java se.kth.isk.leffe.fileutil.Replace <fileName>
<character encoding> <oldString> <newString>. Character
encoding kan vara tex ISO-8859-1.
Nätverksinterface
En dator kan ha flera olika nätverksinterface, tex olika nätverkskort
och ett loopback-interface. Det går nu att hantera dessa, tex lista
dem eller lyssna efter anrop på angivna interface. Detta sköts
av klassen java.net.NetworkInterface.