java new i o
Download
Skip this Video
Download Presentation
Java New I/O

Loading in 2 Seconds...

play fullscreen
1 / 43

Java New I - PowerPoint PPT Presentation


  • 108 Views
  • Uploaded on

Java New I/O. Ron Hitchens [email protected] http://www.ronsoft.com Java NIO Book Website http://javanio.info Java Metroplex User\'s Group May 14, 2003. © 2003, Ronsoft Technologies. Pig-Footed Bandicoot. See http://javanio.info for details. Check Your Local Bookstore. Speaker Bio.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Java New I' - fathi


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
java new i o
Java New I/O

Ron Hitchens

[email protected]

http://www.ronsoft.com

Java NIO Book Website

http://javanio.info

Java Metroplex User\'s Group

May 14, 2003

© 2003, Ronsoft Technologies

pig footed bandicoot
Pig-Footed Bandicoot

See http://javanio.info for details

speaker bio
Speaker Bio
  • 25+ Years Computer 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

why nio
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

efficiency scalability reliability
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(http://www.jcp.org/en/jsr/detail?id=51)

Ronsoft Technologies

what does nio do for me
What Does NIO Do For Me?
  • New Abstractions
    • Buffers, Channels and Selectors
  • New Capabilities
    • Non-Blocking Sockets
    • File Locking
    • Memory Mapping
    • Readiness Selection
    • Regular Expressions
    • Pluggable Charset Transcoders

Ronsoft Technologies

use nio when you need to
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

should i stop using java io
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

what makes up nio
What Makes Up NIO?
  • Buffers
  • Channels
  • Selectors
  • Regular Expressions
  • Character Set Coding

Ronsoft Technologies

nio buffers
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

buffer classes
Buffer Classes

Ronsoft Technologies

buffer objects empty fill
Buffer Objects (Empty/Fill)

Ronsoft Technologies

buffer objects flip
Buffer Objects (Flip)

Ronsoft Technologies

buffer views dupe slice
Buffer Views (Dupe/Slice)

Ronsoft Technologies

buffer views char view
Buffer Views (Char View)

Ronsoft Technologies

i m confused show me
I\'m Confused...Show Me

Ronsoft Technologies

hello
Hello?

public class HelloWorld

{

public static void main (String [] argv)

{

System.out.println ("Hello World");

}

}

Ronsoft Technologies

hello nio
Hello NIO?

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

nio channels
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

channel copy simple 1
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

channel copy simple 2
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()) {

dest.write (buffer);

}

}

* Minimal system calls, but may do buffer copies. Post loop cleanup needed.

Ronsoft Technologies

channel copy transfer
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)

throws IOException

{

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

memory mapped buffers
Memory Mapped Buffers

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

non blocking sockets simple really
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

non blocking server socket
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

nio selectors
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

selectors keys and channels
Selectors, Keys and Channels

Ronsoft Technologies

registering with a selector
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

the selection process
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

running a selection loop
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

scalability with selectors
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

how does that work exactly
How Does That Work...Exactly?

Ronsoft Technologies

nio regular expressions
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

java lang charsequence
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

regex csv tokenizer
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

regex email address parsing
Regex Email Address Parsing

public static final String VALID_EMAIL_PATTERN =

"([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]"

+ "{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 emailAddress)

{

...

if (emailAddress.matches (VALID_EMAIL_PATTERN)) {

person.setEmailAddress (emailAddress);

} else {

throw new IllegalArgumentException (emailAddress);

}

...

}

Ronsoft Technologies

nio charsets
NIO Charsets
  • Character Set Coding
  • Character Set, Coded Character Set, Coding Scheme
  • Encoding and decoding objects
  • Character sets are pluggable (SPI)

Ronsoft Technologies

the jni connection
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 (http://www.jausoft.com)
    • JCanyon F16 Flight Simulator

Ronsoft Technologies

what did they leave out
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

questions
Questions

?

?

?

?

?

?

?

?

?

?

bye bye buy my daddy s book i think i see one right over there
Bye ByeBuy my Daddy\'s book. I think I see one right over there.

Ron (and Miranda) Hitchens

[email protected]

http://www.ronsoft.com http://javanio.info

ad