Synchronous vs. asynchronous
Blocking or blocking, polling or event driven
Netty is event-driven
Buffer and Stream
Java has both kinds of classes for input and output (I/O): Streams and readers/writers.
Streams (InputStream, outputstream and everything that extends these) is for reading and writing binary data from files, The network, or whatever other device.
Readers and writers is for reading and writing text (characters). They is a layer on top of streams, which converts binary data (bytes) to characters and back, using a character encoding.
Reading data from disk byte-by-byte is very inefficient. One-to-speed it-to-use-buffer:instead of reading one byte at a time, you read a few thousand bytes at once, a nd put them in a buffer, in memory. Then you can look at the bytes in the buffer one by one.
Channel and Stream
The difference between channel and stream is that the channel is bidirectional, and stream can only be one-way
The channel is read and written in a chunk-chunk unit, but the stream is still dependent on a byte buffer of byte
As previously mentioned, original I/O deals with data on streams, whereas NIO deals with data in blocks.
Several important IO concepts in Java