input/output
输入/输出
- java.io 包
- File
- RandomAccessFile
- InputStream/OutputStream
- FileInputStream/FileOutputStream
- BufferedInputStream/BufferedOutputStream
- ObjectInputStream/ObjectOutputStream
- Reader/Writer
- InputStreamReader/OutputStreamWtiter
File
- 封装磁盘路径字符串
- 文件路径
- 文件夹路径
- 不存在的路径
- 可以获得文件或文件夹属性
- length(); 文件字节量,对文件夹无效
- lastModified(); 最后修改时间,毫秒值
- getName(); 文件名
- getParent(); 父文件夹
- getAbsolutePath(); 完整路径
- exists(); 是否存在
- isFile(); 是否是文件
- isDirectory(); 是否是文件夹
- 可以创建、删除文件和文件夹
- createNewFile(); 创建文件
- mkdirs(); 创建多层文件夹
- delete(); 删除文件或空文件夹
- File.createTempFile(“文件名”, “后缀”); 在系统的临时目录,创建临时文件
- 对文件夹进行列表
- list(); 获得文件、文件夹名称字符串的数组String[]
- listFiles(); 获得文件、文件夹的封装对象数组 File[],绝对路径
RandomAccessFile
读写文件数据的工具
- 有一个下标,读写下标位置的字节值
- 每读写一个字节值,下标会自动向后移动
- 下标可以任意定位
- 创建对象:
- new RandomAccessFile(文件,“r”); 只读
- new RandomAccessFile(文件,“rw”); 读写
- 方法:
- write(int b); int的四个字节,只输出最后一个字节值写入文件,文件不存在,自动新建,文件夹不存在则报错
- write(byte[] b); 输出数组中全部字节值写入文件
- write(brte[] b,start,length); 输出数组中,从start开始的length个字节值写入文件
- close();释放系统资源,不能再读写文件
- read(); 读取一个字节,在前面在补3个0字节,变成int类型。读取结束,再读取返回-1
- read(byte[] buff); 根据数组长度,从文件读取一批字节值,放入数组,并返回这一批的数量,一般用8k,8192
- seek(int position); 定位下标到指定的位置
- getFilePointer(); 获取当前下标所在位置
流 Stream
把数据的读写,抽象成数据在管道中流动
- 流是单向的
- 输入流,只能用来读取数据
- 输出流,只能用来输出数据
- 流只能顺序读写数据
- 流只能一次性从头到尾读写数据
- 流动过的数据,不能反复流动
- 重复读写数据,只能重新创建流
InputStream/OutputStream
- 字节流的抽象父类
- 方法
- write(int b);
- write(byte[]);
- write(byte[],start,length);
- flush(); 刷出缓存数据
- read();
- read(byte[] buff);
- available(); 剩余可读取的字节上
FileInputStream / FileOutputStrean
- 文件流:直接插在文件上,读写文件数据
- 创建对象
- new FileOutputStream(文件); 不管文件是否存在,都会新建一个文件,如果已经存在,新建的空文件直接将其覆盖
- new FileOutputStream(文件,true); 文件存在,追加数据。
- new FileInputStream(文件); 新建,存在则覆盖
高级流,操作流
- 与其他流相接,提供特定的数据处理功能
- 对高级流的操作,会对相接的流执行相同的操作
BufferedInputStream/BufferedOutputStream
- 缓冲流,帮助做批量读写操作
- 内部数组默认长度8192,缓存满自动刷出,未满时需要手动flush()刷出缓存数据
- flush();
- close(); 高级流的close()执行两步,1.flush();2.关闭相接的流
ObjectInputStream/ObjectOutputStream
对象序列化,和反序列化
- 序列化: 对象的信息,按固定格式,转成一串字节序列进行输出
- ObjectOutputStream
- writeObject(Object); 把对象,
序列化输出
- writeObject(Object); 把对象,
- ObjectInputStream
- readObject(); 读取对象的序列化数据,
反序列化恢复对象
- readObject(); 读取对象的序列化数据,
implements Serializable; 空接口,做序列化标识
- 不被序列化的成员:
- static 属于类,不随对象被序列化输出
- tranisent 临时,只在程序运行期间在内存中存在,不会随对象,序列化持久保存
- 序列化版本
- 版本定义
private static final long seriaLVersionUID = 1L; 1L版本1、4L版本4。
- 旧版本的数据,不允许恢复成新版本的类型
- 如果自己步定义,编译器编译时,会根据类的定义信息,自动生产一个版本
- 版本定义
字符编码,字符集
-
ASC-II : 0-127,英文字符、标点
-
iso-8859-1(1最常用,还有2345),Latin-1 : 160-255 西欧字符
-
GB2312 :0-65535 中文 7k+
-
GBK :20902个中文
-
Unicode : 统一码,万国码,包含100万+ 常用表,双字节。生僻字,三字节、四字节
-
UTF-8 : 最常用,Unicode Transfer Format:Unicode传输格式。英文单字节,中文三字节
-
Java 的是char 类型字符,采用Unicode编码
- ‘a’ '\u0061`
- ‘中’ ‘\u4e2d’
-
Java 的字符编码转换运算
- Unicode 转其他编码
- s.getBytes(“编码”); 无编码格式则Unicode转系统默认编码;返回byte[]数组
- 其他编码转 Unicode
- new String(byte[]);从系统默认编码转 Unicode
- new String(byte[],“UTF-8”); 从指定编码转。
- Unicode 转其他编码
Reader/Writer
- 字符流的抽象父类
- 方法:
- write(int c); int的四个字节中,末尾两个字节是char类型字符,只输出末尾两个字符
- write(byte[, start, length])
- write(String)
- read()
- read(char[] buff)
InputStreamReader/OutputStreamWriter
InputStreamReader in=new InputStreamReader(文件流,encoding)
OutputStreamReader out=new OutputStreamReader(文件流,encoding)
- Reader和Writer的子类
- 字符编码转换流
- InputStreamReader; 读取其他编码字符,转成Unicode编码
- OutputStreamWriter; Unicode字符,转成其他编码字节值,输出
BufferedReader/BufferedWriter
字符缓冲流,提高单个字符读写效率
- BufferedReader的方法
- readLine(); 读取一行字符串,不包含末尾换行。读取结束,再读取,返回null