java面试之输入输出流

Java中输入输出流主要涉及到的包是Java.io,Java.io中最重要的就是5个类和1个接口:5个类是File、OutputStream、InputStream、Writer、Reader;一个接口是Serializable。

1.1、主要类

  • File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
  • InputStream/OutputStream(字节操作):抽象类,基于字节的输入/输出操作。
  • Reader/Writer(字符操作):抽象类,基于字符的输入/输出操作。
  • OutputStreamWriter/InputStreamReader(字节、字符转换类):分别是Writer/ Reader的子类,需要InputStream/OutputStream类对象做参数。

1.2、File类

1.2.1、File类

File类既可以表示目录也可以表示文件(isFile、isDirectory),可以完成目录和文件的创建(createNewFile、new File(目录))、删除(delete)和查询(list)等操作。

1.2.2、FileInputStream/FileOutputStream类

FileInputStream的read(byte[])方法把生成的文件输入流读入到内存中byte[]数组保存,然后FileOutputStream的writer(byte[])将byte[]数组中保存的字节写入到文件中。

复制文件内容:

java面试之输入输出流_第1张图片

1.2.3、RandomAccessFile类

FileInputStream/FileOutputStream类只能简单的读写文件内容,如果需要随机读取和需要更改文件内容的时候时可以使用RandomAccessFile类。

RandomAccessFile类除了也有read和writer方法之外还有length()、seek(i)方法,其中seek方法可以根据下标数字i来定位。

将文件中所有字母a换成c实例:

java面试之输入输出流_第2张图片

1.3、InputStream/OutputStream

字节流最大的特点是每次输入输出都是一个字节,不关心输入输出具体内容及编码,所有在内存缓存操作、文件复制等不需要关心流的内容的时候使用。

1.3.1、类结构图

java面试之输入输出流_第3张图片

1.3.2、ObjectInputStream/ObjectOutputStream类

在序列化1.6节中详细介绍

1.4、Reader/ Writer

字符流除了有read和writer方法之外,还有一个readLine()方法,因为现在是操作的字符,所以有换行之类的字符。

相对于ObjectInputStream/ObjectOutputStream中读写的单位是byte,Reader/Writer中读写的单位是char。

需要注意的是因为计算机底层都是字节数据,所以在创建字符流对象的时候需要已中间转换类对象为参数,即InputStreamReader/OutputStreamWriter类对象。

java面试之输入输出流_第4张图片

1.4.1、类结构图

java面试之输入输出流_第5张图片

1.4.2、InputStreamReader/OutputStreamWriter类

         在1.5中详细介绍

1.5、InputStreamReader/OutputStreamWriter类

  • OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。
  • InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。

1.5.1、编码问题

在字节与字符的转换过程中肯定会涉及到字符的编码问题。

详见:http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

1.6、序列化

1.6.1、概念

Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的串行化机制是RMI、EJB等技术的技术基础。

用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。

序列化是将java对象内存中的数据变成一串二进制数据,然后把这些数据存放在持久数据存储设备上,当需要还原这些数据的时候,再通过反序列化的过程把对象还原到内存中。

1.6.2、相关技术

将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

1.6.3、Serializable接口

Serializable接口没有任何需要实现的抽象方法,仅仅告诉JVM对象实例可以进行序列化,并通过序列ID标识,它由静态的serialVersionUID变量提供。

1.6.4、ObjectInputStream/ObjectOutputStream类

他们的用法与基本的字节流类似,不过写入和读出方法为:readObject和wirteObject。

1.6.5、实例

java面试之输入输出流_第6张图片



你可能感兴趣的:(java面试)