java IO
字节流
数据流,但是却是按照字节来的 byte
字符流
数据流,但是确实按照字符来操作的
读取字节流后不直接操作,先查编码集,获取对应字符
然后对字符操作,简单点 字节流+编码表
输入流
输出流
对于内存而言的,
将外设(硬盘也算)中的数据读到内存:输入(读入内存)
将内存的数据写入到外设(硬盘也算):输出(从内存写入设备中)
字节流的两个顶层父类
InputStream OutputStream
字符流的两个顶层父类
Reader 输入流 (从文件读取到内存)
Write 输出流 (从内存写入到文件)
两个重要方法,读取一个字符,读取字符到数组。
FileReader/FileWriter
BufferedReader/BufferedWriter
特色功能 newline readline
BufferedWriter如果不使用newline以为着这一行没有换行符,这行还没有打完!
所有的write(String)方法都不包含换行符的,会导致对应的readline继续阻塞!
都是针对字符流的操作,针对文本的操作!
FileReader 和 BufferedReader 共同继承了Reader
如果想对FileReader功能进行加强 如果走继承的路的话,
每一种字符流都继承一个的话,继承的体系会变的非常复杂
通过装饰器模式更加清晰,将需要加强的功能抽象出来形成一个装饰器类,
比如是增加缓冲功能,那么装饰器接受不同的类,对这些类提供缓冲功能,
有一个限制,装饰器接收的类和装饰类必须有同一语义上的父类。
装饰比继承灵活得多。
字节流的两个顶层父类
InputStream OutputStream
InputStreamReader(InputStream)字节流转字符流读取出来(可以指定字符集)
按字符流读取字节流
OutputStreamWriter(OutputStream)字符流转字节流输出(可以指定字符集)
把字符编码 写入字节流
System.in/out 是字节流
流的选择
1明确源和目的
源:字节流 InputStream
字符流 Reader
目的地:字节流 OutStream
字符流 Writer
2明确数据是否是纯文本数据
是-->字符流
不是-->字节流
3明确是否需要额外的功能
比如说要不要缓冲
字符集 编码表
两者是不是一个概念我还需要搞清楚
当往一个文件中写数据的时候如果设计到编码表/字符集
这个只有字节流是支持的,(字符集都是字符,你不知道'a'底层到底是哪一个编码值)
字节流可以设定编码表 "UTF-8",写入的时候是什么编码表,读取的时候也要是相应的编码表
File类 (File类实际上是路径,跟有没有文件两码事)
创建文件/目录 删除文件/目录(删除子目录包括文件的时候,最好递归,从里删到外)全部外面直接delete不了
判权限 设权限 canExcute canRead canWrite setExcutable
路径 绝对相对 父路径
路径空间
文件大小长度,上次修改时间 lastModified()
路径下 文件列表
list() 文件名列表
listfiles() 一堆文件路径的列表
Properties
可以往打印流输出 list
可以从字节流读入
可以从字符流读入
可以从xml读入 loadFromXML
返回keyset 视图 StringPropertyNames()
store具备一个向输出流中 存储的功能
printStream
输出到字节流!
仅仅为了实现打印功能,即参数里面传的是什么,就按照对应的字符的编码写入
PrintWriter
输出到字符流!!
仅仅为了实现打印功能
sequenceInputStream
序列流(字节流)
排列输入流,从第一个流读完了接着读第二个流
对象序列化
ObjectOutputStream
ObjectInputStream
可以手动设定序列号
private static final long serialVersionUID = 9527;
在写入对象的时候,吧对象所属类的序列号(类的ID,用于读取的时候判定是不是同一个类)
但是不同版本的编译器,序列号的计算实现未必一直,可能老版本的序列号新版本已经不支持
为了避免这个可以使用手动设定类的序列号!
静态属性
在对象序列化的时候,共有的静态属性是写不进去的,原本运行环境中类的静态属性是什么就还是什么;
不想序列话的非静态域
关键字tansient 标记的域使用默认内容填充
随机访问文件RandomAccessFile
字面意思,随机访问文件,按照字节来的
getFilePointer()
read/write各种字节,字符,line
seek设置指针,可以多线程写入,每个线程都可以同时写文件,从不同的位置开始
也要close
有关字符串和字节数组的转换 getBytes/new String
String str = "阿道夫zdk";
byte[]by = str.getBytes("字符集");
String strNew = new String(by,"字符集");
对于字节流写入字符串可以用 getBytes
从字节流读取出来后转字符串可以 new String(bytes[]);
DataInputStream、DataOutputStream
操作基本数据的流对象
比较特别的是,一般的字节流仅仅支持单字节或者字节数组写入/读取
这个支持写int long等等多字节写入,支持这个功能的还有ObjectOutputStream,RandomAccessFile