一、按数据来源(去向)分类:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer
二、按是否格式化输出分:
1、要格式化输出:PrintStream, PrintWriter
三、按是否要缓冲分:
1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
四、按数据格式分:
1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类
五、按输入输出分:
1、输入:Reader, InputStream类型的子类
2、输出:Writer, OutputStream类型的子类
六、特殊需要:
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
2、对象输入输出:ObjectInputStream, ObjectOutputStream
3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并输入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
第一,考虑最原始的数据格式是什么:是否为文本?
第二,是输入还是输出?
第三,是否需要转换流:InputStreamReader, OutputStreamWriter?
第四,数据来源(去向)是什么:文件?内存?网络?
第五,是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
第六,是否要格式化输出:print?
java.io.RandomAccessFile
==========================================
* 读写文件中的字节数据
* 用下标,读写文件中的指定位置的字节值
创建对象
----------------------------------
1. RandomAccessFile raf =
new RandomAccessFile(文件, "rw");
2. RandomAccessFile raf =
new RandomAccessFile(文件, "r");
方法
----------------------------------
write(int b)
输出 int 四个字节中的末尾字节,
[1][2][3][4] --> [4]
write(byte[] buf)
输出数组中全部字节值
write(byte[] buf, int from, int n)
输出数组中从 from 开始的 n 个字节值
read()
读取一个字节值,
然后补三个零字节,变成 int 类型
[4] --> [1][2][3][4]
读取结束之后,再读取,返回 -1
read(byte[] buf)
根据指定数组长度,读取一批字节值,
并放入指定的数组中,
返回放入数组的字节数量
读取结束之后,再读取,返回 -1
seek(int position)
定位下标到指定位置
getFilePointer()
获得下标当前所在的位置
------
writeInt(int i) 输出 int 类型的 4 个字节值
writeDouble(double d) 输出 double 类型的 8 个字节值
...
writeUTF(String s)
先输出 2 个字节值,表示字符串的字节长度;
再输出字符串的这些字节值
readInt() 读取 4 个字节值转成 int
readDouble() 读取 8 个字节值转成 double
...
readUTF()
先读取 2 个字节值,来确定字符串的字节长度;
再读取这些字节值,转成 String
*) 读取结束后,再读取,
会出现 EOFException
EOF - End Of File
流 Stream
======================================
* 字节的读写,
抽象成字节在管道中流动
* 输入流
流入内存
* 输出流
从内存流出
java.io.InputStream / OutputStream
==========================================
* 字节流的抽象父类
方法
-----------------------------------
OutputStream
------------------------------
write(int b)
write(byte[] buf)
write(byte[] buf, int from, int n)
flush() 刷出缓存
InputStream
------------------------------
read()
read(byte[] buf)
available() 获得剩余的可读取字节量
java.io.FileInputStream / FileOutputStream
============================================
* 直接与文件相接,读写文件中的数据
创建对象
--------------------------------
1.
FileOutputStream out =
new FileOutputStream(文件);
不论文件是否存在,
都会新建一个空文件
2.
FileOutputStream out =
new FileOutputStream(文件, true);
如果文件不存在,会新建空文件;
如果文件已经存在,在文件末尾追加数据
高级流、操作流
=======================================
* 与其他流相接,提供特定的数据处理功能
* 操作其他流的流
java.io.BufferedInputStream / BufferedOutputStream
====================================================
* 提供内存缓冲区,
提高单字节读写效率
创建对象
--------------------------------------
1. BufferedOutputStream out =
new BufferedOutputStream(相接的流);
内部数组默认长度: 8192
2. BufferedOutputStream out =
new BufferedOutputStream(相接的流, 16*1024);
内部数组长度:16k
java.io.DataInputStream / DataOutputStream
===============================================
* 读写固定字节格式的数据
创建对象
---------------------------------
DataOutputStream out =
new DataOutputStream(相接的流);
方法
---------------------------------
DataOutputStream
----------------------------
writeInt(int i)
writeDouble(double d)
...
writeUTF(String s)
DataInputStream
----------------------------
readInt()
readDouble()
...
readUTF()