java IO流

java IO流:

      • 1、文件是什么?
      • 2、文件流
      • 3、IO流原理及分类
      • 4、节点流和处理流
      • 5、字节流如何转为字符流?
      • 6、流关闭
      • 7、IO中flush()和close()的区别
      • 8、序列化和反序列化
      • 9、如何实现对象克隆?
      • 10、System.out.println 是什么
      • 11、PrintStream BufferedWriter PrintWriter 有什么不同?
      • 12、RandomAccessFile
      • 13、BIO、NIO、AIO有什么区别?

1、文件是什么?

文件是存储数据的地方,如word文档,txt文件等都是文件

2、文件流

  • 流:数据在数据源(文件)和程序(内存)之间经历的路径
  • 输入流:数据从数据源(文件)到程序(内存)的路径
  • 输出流:数据从程序(内存)到数据源(文件)的路径

Filter Stream 是一种 IO 流主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。

3、IO流原理及分类

原理:

文件在程序中是以流的形式来操作的。I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输;如读写文件,网络通信等。
Java程序中,对于数据的输入/输出操作以“流(stream)”的方式进行。
Java.io包下提供了各种流类和接口。用以获取不同种类的数据,不通过方法输入或输出数据。

分类:

  • 按照流向分,可分为输入流和输出流(读入写出)

    输出流:从内存读出到文件。只能进行写操作。
    输入流:从文件读入到内存。只能进行读操作。

  • 按照操作单元分,可分为字节流和字符流

    字节流 :以字节为单位,每次次读入或读出是 8 位数据。可以读任何类型数据,图片、文件、音乐视频等。
    字符流:以字符为单位,每次次读入或读出是 16 位数据。其只能读取字符类型数据。

  • 按照流的角色分,可分为节点流和处理流

    节点流:直接与数据源相连,读入或读出。
    处理流:也叫包装流,是对一个对于已存在的流的连接进行封装,通过所封装的流的功能调用实现数据读写。

java IO流_第1张图片

4、节点流和处理流

  • 节点流可以从一个特定的数据源读取数据,如FileReader、FileWrite;
  • 节点流是底层流/低级流,直接跟数据源相接。
  • 处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter,属于字符流,是按照字符来读取数据,不能用来操作二进制文件,否则可能会造成文件损坏。
  • 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  • 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连。

处理流的功能:

  • 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
  • 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便。

5、字节流如何转为字符流?

  • 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入InputStream 对象。
  • 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入OutputStream 对象。

6、流关闭

流用完之后必须关闭,否则数据没有写入文件,实际写入的方法在在关闭的方法close()中完成的。

处理流关闭只需要调用外层的close()关闭方法即可,因其底层就是调用的节点流中的close()方法进行关闭。

7、IO中flush()和close()的区别

  • close()方法具备刷新功能,在关闭流之前就会先刷新缓冲区,将缓冲区的字节全部刷新到文件上,在关闭流。(close()方法包含一次flush()方法)
  • flush()方法可以刷新,并且刷新之后可以继续写,而close()方法刷新之后就不能继续写了。

8、序列化和反序列化

  • 序列化就是在保存数据时,保存数据的值和数据类型(ObjectOutputStream)
  • 反序列化就是在恢复数据时,恢复数据的值和数据类型(ObjectInputStream)
  • 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
    1)Serializable
    2)Externalizable

注意事项

  • 读写顺序要一致
  • 要求序列化或反序列化对象需要实现Serializable接口
  • 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
  • 序列化对象时,默认将里面所有属性都进行序列化,但除了static或teansient修饰的成员
  • 序列化对象时,要求里面的属性的类型也需要实现序列化接口
  • 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

9、如何实现对象克隆?

有两种方式:

  • 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
  • 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

10、System.out.println 是什么

  • System.in 编译类型是 InputStream、运行类型是 BufferedInputStream
  • System.out 编译类型是 PrintStream、运行类型是 PrintStream
  • println 是 PrintStream 的一个方法。out 是一个静态 PrintStream 类型的成员变量
  • System 是一个 java.lang 包中的类,用于和底层的操作系统进行交互。

11、PrintStream BufferedWriter PrintWriter 有什么不同?

  • PrintStream 类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成 PrintStream 后进行输出。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream。
  • BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入。通过 write()方法可以将获取到的字符输出,然后通过 newLine()进行换行操作。BufferedWriter 中的字符流必须通过调用 flush 方法才能将其刷出去。并且BufferedWriter 只能对字符流进行操作。如果要对字节流操作,则使用BufferedInputStream。
  • PrintWriter 的 println 方法自动添加换行,不会抛异常,若关心异常,需要调用
    checkError 方法看是否有异常发生,PrintWriter 构造方法可指定参数,实现自动刷新缓存(autoflush)。

12、RandomAccessFile

  • 在java.io包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。
  • 它是Object的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是RandomAccessFile类既可以读文件,也可以写文件。
  • DataInputStream和DataOutputStream有的方法,在RandomAccessFile中都存在。

13、BIO、NIO、AIO有什么区别?

java IO流_第2张图片

你可能感兴趣的:(Java,java,jvm,开发语言)