按照流是否直接与特定的地方(如磁盘内存设备等)相连分为节点流和处理流两类
节点流可以从或向一个特定的地方(节点)读写数据如FileReader
处理流是对一个已存在的流的连接和封装通过所封装的流的功能调用实现数据读写如BufferedReader处理流的构造方法总是要带一个其他的流对象做参数一个流对象经过其他流的多次包装称为流的链接
常用的节点流
父类 InputStream OutputStream Reader Writer
文件 *FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流
数组 *ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件而是内存中的一个数组)
字符串 *无 无 StringReader StringWriter 对字符串进行处理的节点流
管道 *PipedInputStream PipedOutputStream PipedReader PipedWriter 对管道进行处理的节点流
常用处理流(关闭处理流使用关闭里面的节点流)
父类 InputStream OutputStream Reader Writer
缓沖流 *BufferedImputStrean BufferedOutputStream BufferedReader BufferedWriter 需要父类作为参数构造增加缓沖功能避免频繁读写硬盘可以初始化缓沖数据的大小由于带了缓沖功能所以就写数据的时候需要使用flush方法咯
转换流 *InputStreamReader OutputStreamWriter 要inputStream或OutputStream作为参数实现从字节流到字符流的转换
数据流 *DataInputStream DataOutputStream 提供将基础数据类型写入到文件中或者读取出来为什么要有这个流呢?看这样的分析如果没有这种流的话有一个long本身只占个字节如果我要写入到文件需要转成字符串然后在转成字符数组那空间会占用很多但是有了这种流之后就很方便了直接将这个字节写到文件就完了是不是既节约了内存空间有让程序写起来更加方便简单了吶写倒是很简单但是读取的时候就注意了根据读取的数据类型指针会往下移所以你写的顺序必须要和读的顺序一致才能完成你正确的需求
*ObjectInputStream ObjectOutputStream
*顺便研究序列化将对象所在的类型全部转换成二进制然后写入到介质中去
*transient关键字修饰成员变量不写入该成员变量
*Serializable接口表示接口怎样实现的呢在序列化之前首先判断 (对象 instanceof Serializable)如果返回true则执行序列化否者抛出异常并且里面有一个ID是用来快速查找某个对象的时候使用的
*Externalizable接口外部化接口他是Serializable接口的子接口能手动控制序列化的方式
为什么要用writeUTF()因为这种方式是按照utf来写入的而默认方式是utf只是节省空间而已
字节流读取中文的问题
*由于java使用的是unicode编码每一个中文字符是占用两个字节的所以没有只读出其中一个字节并使用的话当然是乱码咯虽然普通的英文字符也是两个字节的但是读取的时候将高位去掉也能回去正确的英文字符所以没有问题所以最好还是使用字符流的方式读取好点
javaio中专门提供用于打印的流(这类流在写入的时候有自动flush的功能所以你不需要每打印一个东西都flush一次)注意他们也是属于处理流只不过这里单独列出来分析而已
*PrintStream继承自>FilterOutputStream继承自>OutputStream(它的构造函数需要OutputStream对象)
*PrintWriter继承自>Writer(它的构造函数需要Writer对象)
SystemIn====InputStream
SystemOut===PrintStream
这种流的print方法不会抛出异常这是JSP技术中常用的流如果在JSP页面的打印会抛出异常的话那JSP也太难写了点!注意理解这样的设计思路
看这样的代码
PrintStream ps=new PrintStream(new OutputStream(c://));
SystemsetOut(ps);
SystemOutprintln(jfdajsflkajdf);//这样将不会在打印到命令行窗口而是指定的PrintStream目标文件里面去