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:
Om ett program ska ha en rimlig chans att vara plattformsoberoende är det bäst att följa dessa regler:

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.