io
io
Input / Output
输入 / 输出java.io 包
File
RandomAccessFileInputStream / OutputStream 字节流的抽象父类
FileInputStream / FileOutputStream 插文件,直接读写文件数据
BufferedInputStream / BufferedOutputStream 内存缓冲,提高单字节读写效率
DataInputStream / DataOutputStream 固定字节格式 writeInt() writeDouble() writeUTF()
PrintStream 任何数据转成字符串输出 print() println()
ByteArrayInputStream / ByteArrayOutputStream 与内存中 byte[] 数组相接 toByteArray()
ObjectInputStream / ObjectOutputStream 序列化、反序列化 writeObject() readObject()Reader / Writer 字符流的抽象父类
InputStreamReader / OutputStreamWriter 编码转换流
FileReader / FileWriter 内部是“文件字节流”接“编码转换流”
BufferedReader / BufferedWriter 字符缓冲,readLine()
PrintWriter 与 PrintStream 相同
File
- 封装磁盘路径字符串
可以封装
*)文件路径
*)目录路径
*)不存在的路径创建对象
1.File f = new File(“d:\abc\a.txt”);
2.File f = new File(“d:\abc\”, “a.txt”);
方法
*) 文件或目录的属性
canRead() canWrite() canExecute() 是否可读可写可执行 isHidden() 是否隐藏文件 exists() 表示的路径是否存在 getAbsolutePath() 完整路径 getName() 文件名 getParent() 父目录 lastModified() 最后修改时间,毫秒值 length() 文件字节量,对目录无效 isDirectory() 是否文件夹 isFile() 是否文件 getTotalSpace() 空间总大小 getFreeSpace() 可用空间
*) 文件或目录操作
createNewFile() 创建文件 delete() 删除文件或“空目录” mkdir() 创建单层目录 mkdirs() 创建多层目录 renameTo() 改名、移动 *) 创建删除重命名方法返回 boolean,表示操作是否成功 File.createTempFile(前缀, 后缀) 在系统临时目录创建临时文件
*) 文件列表
list() 返回 String[],包含子文件、子目录名称 listFiles() 返回 File[],包含子文件、子目录的 File 对象 list(FilenameFilter) listFiles(FilenameFilter) listFiles(FileFilter) 只列出符合过滤条件的文件、目录, 参数: 外接的过滤器
RandomAccessFile
- 读写文件的工具
文件当做字节数组,
用下标读写指定位置的字节值创建对象
RandomAccessFile raf =
new RandomAccessFile(文件, “r”);r - 只读
RandomAccessFile raf =
new RandomAccessFile(文件, “rw”);rw - 读写
方法
write(int b)
int 四个字节中,只输出末尾一个字节值,
[1][2][3][4] –> [4]write(byte[] buf)
输出数组中全部字节值write(byte[] buf, int from, int length)
输出数组中从 from 开的 length 个字节值read()
读取一个字节,再补3个0字节,转成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)
先输出两个字节表示字符串的字节长度
再输出字符串的字节值readInt() 读取4个字节值转成int
readDouble()读取8个字节值转成double
…
readUTF()
先读取2个字节值,来确定字符串的字节长度,
再读取这些字节值转成 String*)读取结束再读取,会出现 EOFException
EOF - END OF FILE
流 Stream
- 数据读写操作,抽象成数据在管道中流动
流是单向的
*)输入流
*)输出流流过去的数据,不能重复流动,
只能从头到尾顺序读写数据
InputStream / OutputStream
字节流抽象父类
方法
OutputStream
write(int b)
write(byte[] buf)
write(byte[] buf, int from, int length)
flush() 刷出缓存数据InputStream
read()
read(byte[] buf)
available() 获得剩余的可读取字节量
FileInputStream / FileOutputStream
直接与文件相接,读写文件中的数据
创建对象
FileOutputStream in =
new FileOutputStream(文件);不管文件是否存在,
都创建新的空文件FileOutputStream in =
new FileOutputStream(文件, true);不存在,新建;
存在,追加。
高级流、操作流
- 与其他流相接,提供特定的数据处理功能
- 对高级流的操作,会对相接的流执行相同操作
BufferedInputStream / BufferedOutputStream
提供内存缓冲区,提高单字节读写效率
创建对象
1.BufferedOutputStream out =
new BufferedOutputStream(相接的流);内部缓存数组容量 8192
2.BufferedOutputStream out =
new BufferedOutputStream(相接的流, 16*1024);内部缓存数组容量 16k
DataInputStream / DataOutputStream
读写固定字节格式的数据
创建对象
DataOutputStream out =
new DataOutputStream(相接的流);方法
DataOutputStream
writeInt(int i)
writeDouble(double d)
…
writeUTF(String s)DataInputStream
readInt()
readDouble()
…
readUTF()
PrintStream
任何类型数据转成字符串输出
write(97) 61 writeInt(97) 00 00 00 61 print(97) 39 37 "97" '9' '7'
创建对象
PrintStream out = new PrintStream(相接的流);
PrintStream out = new PrintStream(文件);
PrintStream out = new PrintStream(文件, 字符编码);
方法
print()
println()
字符编码 Encoding
字符集 Charset
asc-ii
0 - 127
iso-8859-1
Latin-1
160 - 255
西欧字符
GB2312 双字节
7+ 中文字符 喆,镕
GBK
20902 中文
BIG5
jpxxx
krxxx
alxxx
Unicode
*) 统一码、万国码
*) 70万+
*) 常用字符表,双字节
*) 生僻字符表,三字节或以上
*) java 的 char 类型采用 Unicode 编码
*) UTF-8 Unicde传输格式
*)英文,单字节
*)某些字符,双字节
*)中文,三字节
java 的字符编码转换运算
*)Unicode –> 其他编码
String s = "abc中文"; //转成默认编码 byte[] a = s.getBytes(); //转成 UTF-8 编码 byte[] a = s.getBytes("UTF-8");
*)其他编码 –> Unicode
//从默认编码转换 String s = new String(byte[]数组); //从指定的编码转换 String s = new String(byte[]数组, "UTF-8");
Reader / Writer
字符流的抽象父类
方法
Writer
write(int c)
int末尾两个字节是一个 char 类型字符,
输出末尾的两个字节值write(char[] buf)
write(char[] buf, int from, int length)
write(String s)Reader
read()
读取 char 类型字符,
再补两个 0 字节转成 intread(char[] buf)
InputStreamReader / OutputStreamWriter
字符编码转换流
OutputStreamWriter
将 Unicode 字符转换成其他编码字节值输出InputStreamReader
将读取的其他编码字符,转成 Unicode 编码字符创建对象
OutputStreamWriter out =
new OutputStreamWriter(相接的字节流);OutputStreamWriter out =
new OutputStreamWriter(相接的字节流, 字符编码);
FileReader / FileWriter
- 它内部是“文件字节流”接“编码转换流”
不能指定字符编码,只能使用默认编码
创建对象
FileWriter out = new FileWriter(文件);
等价于:
OutputStreamWriter out =
new OutputStreamWriter(
new FileOutputStream(文件));
BufferedReader / BufferedWriter
字符缓冲流
创建对象
BufferedWriter out =
new BufferedWriter(相接的字符流);BufferedReader 方法
readLine()
读取一行字符串,不包含末尾换行符读取结束再读取,会返回 null
PrintWriter
- 与 PrintSream 相同
- PrintWriter 可以接字符流,也可以接字节流
PrintStream 接字节流
创建对象
1.PrintWriter out = new PrintWriter(相接的字符流);
2.PrintWriter out = new PrintWriter(相接的字节流);
3.PrintWriter out = new PrintWriter(文件);
3.PrintWriter out = new PrintWriter(文件, 编码);
ObjectInputStream / ObjectOutputStream
- 序列化、反序列化
- ObjectOutputStream
将对象转成一串字节序列输出 ObjectInputStream
读取序列化数据,恢复对象不序列化的成员
*)static 属于类,不会随对象被序列化输出
*)transient 临时,
只在程序运行期间,在内存中存在
不会被序列化持久保存序列化头部字节值
*)新建 ObjectOutputStream 对象时,
会自动输出 4 个字节头部值
*)新建 ObjectInputStream 对象时,
会自动读取 4 个头部字节值,
来确认,后面的数据是对象序列化数据序列化版本号
static final long serialVersionUID
*)控制旧版本的数据,
不允许恢复成新版本的类型创建对象
ObjectOutputStream out =
new ObjectOutputStream(相接的流);方法
ObjectOutputStream
writeObject(Object obj)
序列化输出ObjectInputStream
readObject()
反序列化读取
ByteArrayInputStream / ByteArrayOutputStream
与内存中 byte[] 数组相接,
直接读写数组中的数据创建对象
ByteArrayInputStream in =
new ByteArrayInputStream(byte[]数组);ByteArrayOutputStream out =
new ByteArrayOutputStream();内部有一个数组,输出的数据, 放在它内部数组中, 输出结束后,可以取出内部数组
方法
ByteArrayOutputStream
toByteArray()
取出内部的数组