- 字节流:根据字节输入,输出数据,1个字节等于8个二进制位
-
- 基类
-
- 输入InputStream
- 输出OutputStream
- 字符流:根据字符输入,输出数据。1个字符等于2个字节等于16个二进制位。为了方便根据编码表读取文字,而设立的字节流包装类。
-
- 基类
-
- 输入:Reader
- 输出:Writer
- InputStream
-
- FileInputStream :字节码文件的输入流。
- DataInputStream :操作基本数据类型的输入流。
- ByteArrayInputStream:操作字节数组的输入流,只操作数据不调用底层资源所以没有IOException,close后依然可以继续操作。以内存为源。
- OutputStream
-
- FileOutputStream:字节码文件的输出流。
- DataOutputStream:操作基本数据类型的输出流。
- ByteArrayOutputStream:操作字节数组的输出流,只操作数据不调用底层资源所以没有IOException,close后依然可以继续操作。以内存为源。
- Reader
-
- FileReader
-
- 创建时要保证文件是已经存在的,如果不存在会发生异常FileNotFoundException
- 读取方式
-
- read():一次读取一个字符,并且会自动往下读。返回读取字符的整数类型。
- read(char[]):该read返回的是读取到字符个数。
- BufferedReader
-
- 提高效率的缓存区读取流。特有方法readLine() 读取一行。
- LineNumberReader
-
- 可以获得读取行号的读取流
- InputStreamReader
-
- 转换流将字节流转换成字符流
- CharArrayReader :操作字符数组的输入流,只操作数据不调用底层资源所以没有IOException,close后依然可以继续操作。以内存为源。
- Writer
-
- FileWriter
-
-
- 创建一个FileWriter对象。该对象已初始化就必须要明确被操作的文件。而且该文件会被创建到指定目录下。如果该文件目录下已有同名文件,将被覆盖。
- FileWriter(path,指定是否续写) 构造函数可以传递一个true参数,代表不覆盖已有文件,并在已有文件的末尾进行数据续写。如果没有创建新文件。
- BufferedWriter
-
- 提高效率的缓存区写入流。由于不同的操作系统的换行符不一样 windows是 \r\n linux是\n 。特有方法 newLine
()可以跨平台换行。
- 提高效率的缓存区写入流。由于不同的操作系统的换行符不一样 windows是 \r\n linux是\n 。特有方法 newLine
- OutputStreamWriter
-
- 转换流将字节流转换成字符流
- CharArrayWriter:操作字符数组的输出流,只操作数据不调用底层资源所以没有IOException,close后依然可以继续操作。以内存为源。
-
- 装饰模式与继承的区别
-
- 装饰模式相对于继承来说避免了每创建一个类就要为其创建特定的子类来进行功能扩展,它只需符合父类共性标准的都可以用其装饰类来进行功能扩展。
-
- 举例:装饰模式一帮用来对特有对象进行功能增强,就好比一个人去面试把自己装饰了一般,可以以把装饰理解为一套衣服,而人本身是要被装饰的对象。继承就好比要去定制一套衣服来增强人对象。相比之下每个人对象都要为自己定制一套衣服,显然做了很多重复行工作,装饰模式避免了这个一点只要这个人符合标准就都可以用这套衣服来装饰,无需再去定制。
- 流操作的基本规律
通过三个明确来完成 -
- 明确源和目的
-
- 源:输入流 InputStream Reader
- 目的:输出流 OutputStream Writer
- 操作的数据是否是纯文本
-
- 是:字符流
- 否:字节流
- 当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分 -
- 源设备:内存,硬盘,键盘
- 目的设备:内存,硬盘,控制台
- 对象序列化
-
- ObjectInputStream
- ObjectOutputStream
- 管道流
多线程写入读取,单线程容易死锁,因为read为阻塞式方法。 -
- PipedInputStream 用connect方法来进行连接或构造函数。
- PipedOutputStream
- 合并流
-
- SequenceInputStream() 合并多个读取流时通过Enumeration来进行添加
-
- Enumeration可以通过vector来获取
- 也可以通过匿名内部类的方式重写Enumeration的hasMoreElements和nextElement方法。
- RandomAccessFile
-
- 该类不算是IO体系中的子类,而是直接继承自Object。但是它是IO包中的成员,因为他具备读写功能。
- 内部封装了一个数组,而且通过指针对数据的元素进行操作。
- 可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。
- 其实完成读写的原理就是内部封装了字节输入流和输出流。通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,读写rw等。
- 如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常,如果模式为rw操作的文件不存在,会自动创建,如果存在则不会覆盖。