IO流可以根据不同的角度分类,下面是几种常见的IO流分类方式:
- 根据数据类型分类:
- 字节流(Byte Stream):以字节为单位进行读写操作,适用于处理二进制数据或者未经过编码的字符数据。
- 字符流(Character Stream):以字符为单位进行读写操作,适用于处理文本数据,能够自动处理字符编码和解码的问题。
- 根据数据流向分类:
- 输入流(Input Stream):用于从外部获取数据,读取数据到程序中。
- 输出流(Output Stream):用于将数据输出到外部,将程序中的数据写入到外部。
- 根据功能分类:
- 节点流(Node Stream):直接和数据源或目标进行交互,如FileInputStream、FileOutputStream等。
- 处理流(Processing Stream):对节点流进行封装,提供更高层次的功能,如BufferedInputStream、BufferedOutputStream等。
- 根据处理对象的不同分类:
- 文件流(File Stream):用于读写文件的IO流,如FileInputStream、FileOutputStream、FileReader、FileWriter等。
- 字节数组流(Byte Array Stream):将数据读写到字节数组中,如ByteArrayInputStream、ByteArrayOutputStream。
- 字符数组流(Char Array Stream):将数据读写到字符数组中,如CharArrayReader、CharArrayWriter。
- 字符串流(String Stream):将数据读写到字符串中,如StringReader、StringWriter。
- 管道流(Pipe Stream):用于两个线程之间进行通信,一个线程输出数据到管道,另一个线程从管道中读取数据。
这些分类方式可以帮助我们更好地理解和选择适合的IO流来处理不同的需求和数据类型。在实际应用中,根据具体情况选择合适的IO流非常重要,以提高效率和灵活性。
Java NIO(New Input/Output)是Java提供的一种基于块(Block)或缓冲区(Buffer)的IO操作方式,于JDK 1.4中引入。相比传统的IO流方式,Java NIO提供了更高效、更灵活的IO操作方式,并且支持非阻塞IO。
Java NIO的核心概念包括以下几个部分:
- 通道(Channel):通道是数据源与目标的双向连接,可以通过通道读取和写入数据。通道可以是文件、网络Socket或其他IO设备。
- FileChannel:用于文件IO操作。
- SocketChannel:用于网络Socket的IO操作。
- ServerSocketChannel:用于监听新进来的TCP连接的网络通道。
- DatagramChannel:用于UDP网络数据的IO操作。
- 缓冲区(Buffer):缓冲区是存储数据的容器,可以在缓冲区中进行读写操作。使用缓冲区可以提高IO操作的效率。
- ByteBuffer:用于字节数据的缓冲区。
- CharBuffer:用于字符数据的缓冲区。
- IntBuffer、LongBuffer、DoubleBuffer等:用于其他基本数据类型的缓冲区。
- 选择器(Selector):选择器用于检测一个或多个通道上的IO事件,比如连接打开、数据到达等。通过选择器,可以实现单线程处理多个通道的IO操作,提高系统的性能和资源利用率。
Java NIO的工作方式是通过将数据从通道读取到缓冲区,或将数据从缓冲区写入到通道,实现数据的读写操作。使用选择器可以实现非阻塞IO,从而允许单线程同时处理多个通道的IO事件。
总而言之,Java NIO提供了一种灵活高效的IO操作方式,适用于网络编程、服务器编程等场景。它的核心是通道、缓冲区和选择器,通过这些组件可以实现高性能的IO处理。