Presentation is loading. Please wait.

Presentation is loading. Please wait.

Java Metroplex User's Group

Similar presentations


Presentation on theme: "Java Metroplex User's Group"— Presentation transcript:

1 Java Metroplex User's Group
Java New I/O Ron Hitchens Java NIO Book Website Java Metroplex User's Group May 14, 2003 © 2003, Ronsoft Technologies

2

3 See http://javanio.info for details
Pig-Footed Bandicoot See for details

4 Check Your Local Bookstore

5 Speaker Bio 25+ Years Computer Experience 5+ Years Java Experience
Mainframe to Micro Unix/Linux kernel, academic, internet ~20 years 5+ Years Java Experience Heavy server-side, web apps, startups Independent Consultant “Bit twiddling at it's finest” Will hack NIO for fun and profit Hook ‘Em Horns Ronsoft Technologies

6 Why NIO? Where did it come from? What does it do for me?
When should I use it? Should I stop using java.io? Ronsoft Technologies

7 Efficiency – Scalability – Reliability
Efficiency – The Need For Speed Why should the JVM do what the OS can do better? Scalability – Livin' Large Big applications have big appetites Reliability – Enough Wheels Invented The infrastructure exists – concentrate on the app No Longer CPU Bound JSR 51 ( Ronsoft Technologies

8 What Does NIO Do For Me? New Abstractions New Capabilities
Buffers, Channels and Selectors New Capabilities Non-Blocking Sockets File Locking Memory Mapping Readiness Selection Regular Expressions Pluggable Charset Transcoders Ronsoft Technologies

9 Regular Expressions? Specified in JSR 51
JSR 51 is a laundry list of features Java was missing – Regex was on that list Implemented by the same Expert Group Shares the new CharSequence interface Same deal for Charsets Ronsoft Technologies

10 Use NIO When You Need To:
Move large amounts of data efficiently NIO is primarily block oriented – java.io uses streams Uses direct buffers to do raw I/O – bypassing the JVM Multiplex large numbers of open sockets Operates in non-blocking mode One thread can manage huge numbers of socket channels Use OS-level file locking or memory mapping Do character set Transcoding Ronsoft Technologies

11 Should I Stop Using java.io?
Nope java.nio is not a replacement for java.io NIO addresses different needs java.io is not going away Ronsoft Technologies

12 What Makes Up NIO? Buffers Channels Selectors Regular Expressions
Character Set Coding Ronsoft Technologies

13 NIO Buffers Fixed size containers of primitive data types
ByteBuffer, CharBuffer, FloatBuffer, etc. Byte buffers are special, used for I/O with channels Direct and Non-direct ByteBuffers Direct ByteBuffers address raw memory – direct I/O Buffers can be views of other buffers or wrap arrays Byte order (endian-ness) Affects byte swabbing in views of ByteBuffers Ronsoft Technologies

14 Buffer Classes Ronsoft Technologies

15 Buffer Objects (Empty/Fill)
Ronsoft Technologies

16 Buffer Objects (Flip) Ronsoft Technologies

17 Buffer Views (Dupe/Slice)
Ronsoft Technologies

18 Buffer Views (Char View)
Ronsoft Technologies

19 I'm Confused...Show Me Ronsoft Technologies

20 Show Me Some Code, Dammit!
Ronsoft Technologies

21 Hello? Ronsoft Technologies public class HelloWorld {
public static void main (String [] argv) System.out.println ("Hello World"); } Ronsoft Technologies

22 Hello NIO? Ronsoft Technologies import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel; import java.nio.channels.Channels; public class HelloWorldNio { public static void main (String [] argv) throws Exception String hello = "Hello World" + System.getProperty ("line.separator"); ByteBuffer bb = ByteBuffer.wrap (hello.getBytes ("UTF-8")); WritableByteChannel wbc = Channels.newChannel (System.out); wbc.write (bb); wbc.close(); } Ronsoft Technologies

23 Real Code? Show Me Some REAL Code Ronsoft Technologies
(BufferFillDrain) Ronsoft Technologies

24 NIO Channels New I/O metaphor: Conduit to an I/O service (“nexus”)
Channels do bulk data transfers to and from buffers channel.write (buffer) ~= buffer.get (byteArray) channel.read (buffer) ~= buffer.put (byteArray) Scatter/gather, channel-to-channel transfers Three primary channel implementations FileChannel: File locks, memory mapping, cross-connect transfers Sockets: Non-blocking, selectable, async connections, peers Pipe: loopback channel pair, selectable, generic channels Selectable Channel Implementations are pluggable (SPI) Ronsoft Technologies

25 Channel Copy – Simple #1*
public void channelCopy (ReadableByteChannel src, WritableByteChannel dest) throws IOException { ByteBuffer buffer = ByteBuffer.allocate (16 * 1024); while (src.read (buffer) != -1) { // prepare the buffer to be drained buffer.flip(); // make sure the buffer was fully drained. while (buffer.hasRemaining()) { dest.write (buffer); } // make the buffer empty, ready for filling buffer.clear(); * No buffer copies, but potentially more system calls. Ronsoft Technologies

26 Channel Copy – Simple #2*
public void channelCopy (ReadableByteChannel src, WritableByteChannel dest) throws IOException { ByteBuffer buffer = ByteBuffer.allocate (16 * 1024); while (src.read (buffer) != -1) { // prepare the buffer to be drained buffer.flip(); // write to the channel, may block dest.write (buffer); // if partial transfer, shift remaining elements down // if buffer was empty, same as doing clear buffer.compact(); } buffer.flip(); // EOF leaves buffer in fill state while (buffer.hasRemaining()) { * Minimal system calls, but may do buffer copies. Post loop cleanup needed. Ronsoft Technologies

27 Channel Copy – Transfer*
public void channelCopy (FileChannel src, WritableByteChannel dest) throws IOException { src.transferTo (0, src.size(), dest); } public void channelCopy (ReadableByteChannel src, FileChannel dest) dest.transferFrom (src, 0, Long.MAX_VALUE); * Very easy, but one end must always be a FileChannel. Transfer could occur entirely in kernel space. Ronsoft Technologies

28 Memory Mapped Buffers Ronsoft Technologies
RandomAccessFile raf = new RandomAccessFile (fileName, "rw"); FileChannel fc = raf.getChannel(); MappedByteBuffer buffer = fc.map (FileChannel.MapMode.READ_WRITE, 0, fc.size()); byte b = buffer.get(); // reads from file ... buffer.put (someOtherByte); // writes to file The content of buffer is the content of fileName Any change to one affects the other Ronsoft Technologies

29 Non-Blocking Sockets – Simple Really
ByteBuffer buffer = ByteBuffer.allocate (1024); SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking (false); ... while (true) { if (socketChannel.read (buffer) != 0) { processInput (buffer); } Ronsoft Technologies

30 Non-Blocking Server Socket
ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind (new InetSocketAddress (port)); ssc.configureBlocking (false); while (true) { SocketChannel newConnection = ssc.accept(); if (newConnection == null) { doSomethingToKeepBusy(); } else { doSomethingWithSocket (newConnection); } Ronsoft Technologies

31 NIO Selectors Multiplexing Channels – Readiness Selection
Selectable Channels are registered with Selectors SelectionKey encapsulates selector/channel relationship A subset of ready channels is selected from the Selector's set of registered channels (Selector.select()) Selected Set contains those keys with non-empty Ready Sets Each SelectionKey holds an Interest Set and a Ready Set Possible members of Interest Set: accept, read, write, connect Ready set is a subset of interest set –as-of the last select() call Readiness Selection means less work – ignore idle channels Ronsoft Technologies

32 Selectors, Keys and Channels
Ronsoft Technologies

33 Registering With a Selector
ServerSocketChannel serverChannel = ServerSocketChannel.open(); Selector selector = Selector.open(); serverChannel.socket().bind (new InetSocketAddress (port)); serverChannel.configureBlocking (false); serverChannel.register (selector, SelectionKey.OP_ACCEPT); Ronsoft Technologies

34 The Selection Process Create a Selector and register channels with it
The register() method is on SelectableChannel, not Selector Invoke select() on the Selector object Retrieve the Selected Set of keys from the Selector Selected set: Registered keys with non-empty Ready Sets keys = selector.selectedKeys() Iterate over the Selected Set Check each key's Ready Set (set of operations ready to go as-of last select()) Remove the key from the Selected Set (iterator.remove()) Bits in the Ready Sets are never reset while the key is in the Selected Set The Selector never removes keys from the Selected Set – you must do so Service the channel (key.channel()) as appropriate (read, write, etc) Ronsoft Technologies

35 Running a Selection Loop
while (true) { selector.select(); Iterator it = selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey key = (SelectionKey) it.next(); it.remove(); if (key.isAcceptable()) { ServerSocketChannel server = (ServerSocketChannel) key.channel(); SocketChannel channel = server.accept(); channel.configureBlocking (false); channel.register (selector, SelectionKey.OP_READ); } if (key.isReadable()) readDataFromSocket (key); Ronsoft Technologies

36 Scalability With Selectors
One Thread to Rule Them All More threads != More Efficient – Context Switching, CPU Availability OS and/or JVM do the hard work for you Only the kernel can efficiently do Readiness Selection No more thread-per-socket nonsense Simpler, easier to maintain code Less concurrency hassles – locking overhead, thread races Single point of dispatch Not necessarily single-threaded Single selection thread can dispatch to multiple worker threads Ronsoft Technologies

37 How Does That Work...Exactly?
Ronsoft Technologies

38 NIO Regular Expressions
Perl 5-ish syntax New CharSequence interface in java.lang Pattern and Matcher objects String class has regex convenience methods added Ronsoft Technologies

39 java.lang.CharSequence
Package java.lang; public interface CharSequence { int length(); char charAt(int index); CharSequence subSequence(int start, int end); public String toString(); } Implemented by String, StringBuffer and CharBuffer Ronsoft Technologies

40 Regex CSV Tokenizer String [] tokens = lineBuffer.split ("\\s*,\\s*");
for (int i = 0; i < tokens.length; i++) { System.out.println ("" + i + ": " + tokens [i]); } Ronsoft Technologies

41 Regex Email Address Parsing
public static final String VALID_ _PATTERN = + "{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))" + "([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)"; ... public void setupPerson (Person person, ..., String Address) { if ( Address.matches (VALID_ _PATTERN)) { person.set Address ( Address); } else { throw new IllegalArgumentException ( Address); } Ronsoft Technologies

42 (BackSlashes, SimpleGrep, RegexAppend, RegexMatches)
More Regex Code Gimme More Code (BackSlashes, SimpleGrep, RegexAppend, RegexMatches) Ronsoft Technologies

43 NIO Charsets Character Set Coding
Character Set, Coded Character Set, Coding Scheme Encoding and decoding objects Character sets are pluggable (SPI) Ronsoft Technologies

44 The JNI Connection Java Code Can Allocate Native Memory (Direct)
Native Code Can Create and/or Use Buffers Buffers Can Wrap Arbitrary Memory Spaces Video memory, device controllers, etc. All Buffers Are Java Objects Scoping, Garbage Collection, Typing, Etc. Zoom Zoom OpenGL For Java ( JCanyon F16 Flight Simulator Ronsoft Technologies

45 What Did They Leave Out? Formatted I/O (ala printf/scanf)
Will leverage Regular Expressions Enhanced Filesystem Interface More consistent across OS platforms Better access to file/directory attributes Pluggable access to new filesystem types True Asynchronous I/O Under consideration, may never happen Ronsoft Technologies

46 Questions ? ? ? ? ? ? ? ? ? ?

47 Bye Bye Buy my Daddy's book. I think I see one right over there.
Ron (and Miranda) Hitchens


Download ppt "Java Metroplex User's Group"

Similar presentations


Ads by Google