I/O

Q:Java中的I/O可以分为几类?

  • 磁盘操作:File
  • 字节操作:InputStream 和 OutputStream
  • 字符操作:Reader 和 Writer
  • 对象操作:Serializable
  • 网络操作:Socket
  • 新的输入/输出:NIO

Q:NIO和普通I/O区别?

  • NIO 是非阻塞的;只有套接字 Channel 才能配置为非阻塞,而 FileChannel 不能,为 FileChannel 配置非阻塞也没有意义
  • NIO 面向块,I/O 面向流。

Q:字符流和字节流有什么区别?如何选择字节流或者字符流?什么是缓冲区,有什么作用?

  • 区别:
    • 字符流和字节流的使用非常相似,但是实际上字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件
    • 字符流是对字节流的包装
  • 如何选择字节流或者字符流?
    • 字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的
    • 如果是音频文件、图片、歌曲,就用字节流好点(避免数据丢失)
    • 如果是关系到中文(文本)的,用字符流好点
  • 什么是缓冲区,有什么作用?
    • 缓冲区就是一段特殊的内存区域,很多情况下当程序需要频繁地操作一个资源(如文件或数据库)则性能会很低,所以为了提升性能就可以将一部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可,这样就显著提升了性能。
    • 对于 Java 字符流的操作都是在缓冲区操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用 flush() 方法操作