一、IO流:
IO流: input输入(流向内存) 读取数据
output输出(流出内存) 写出数据
IO流作用
可以将程序(内存)中的数据 写出硬盘上
也可以将硬盘上文件中的数据 读取到程序(内存)中
IO流分类
按照操作的数据不同
字节流
每次操作字节,由于计算机中任何数据都是由字节构成的,所以字节流可以操作计算机中一切数据。
文本 视频 音频 图片 压缩包....都可以使用字节流来操作
字符流
每次操作的是字符,只能操作文本文件。
文本文件:用记事本打开能够看懂 不乱码的文件 .txt .html .css .java
需要注意 word excel 不是文本文件
按照数据流向不同
输入流
输出流
字节输入流
InputStream read 读字节
FileInputStream
字节输出流
OutputStream write 写字节
FileOutputStream
字符输入流
Reader read 读字符
FileReader
字符输出流
Writer write 写字符
FileWriter
IO流的命名规则
前半部分 说明这个流能够做什么
后半部分 是这个流的父类是谁
二、java.io.OutputStream::
java.io.OutputStream 字节输出流的超类 抽象类
方法
write(int b) 写一个字节
write(byte[] bytes) 写一个字节数组
write(byte[] bytes,int start ,int length) 写字节数组的一部分
close() 关闭资源 因为读写操作调用了操作系统的功能 需要告知操作系统我完事了
常用子类
FileOutputStream
构造方法 绑定数据目的
FileOutputStream(File file)
FileOutputStream(String name)
参数
File对象 字符串路径
如果没有指定的文件 则新建一个文件 如果指定位置的文件已经存在 则覆盖
1.创建字节输出流对象H
2.调用write方法
3.关闭资源
三、文件的续写和换行:
续写
FileOutputStream
构造方法
FileOutputStream(String path,boolean append)
FileOutputStream(File file,boolean append)
boolean append: 默认值是false 不写默认是false 覆盖文件
如果值为true 则续写文件
换行
就在数据前 或者 后 加上\r\n
\r回车符
\n 换行符
out.write("我的真心话\r\n".getBytes());
//换行写在引号里面
四、java.io.InputStream 字节输入流的超类 抽象类
方法
int read() 读一个字节
int read(byte[] bytes) 读一个字节数组
close() 关闭资源
常用子类
FileInputStream
构造方法 绑定 数据源
FileInputStream(String path)
FileInputStream(File file)
参数
String路径
File对象
1.创建字节输入流对象
2.调用read方法读数据
3.关闭资源
int read(byte[] bytes) 读一个字节数组
字节数组作用: 起到缓冲的作用 用来提高效率 保存读取到的数据
返回值:返回每次读取的有效字节数
五、复制:
先开后关,先关后开。
创建数据目的时,可以改复制的文件的名字。
字节数组复制,效率远远高于字节复制。一般数组的长度定义为【1024】,1024*100左右效率最高,再大的话创建数组也浪费时间。
六、java.io.Reader 字符输入流的超类 抽象类
方法
int read() 读一个字符
int read(char[] chs) 读字符数组
close() 关闭资源
常用子类
FileReader
构造方法 绑定数据源
FileReader(File file)
FileReader(String path)
七、java.io.Writer 字符输出流的超类 抽象类
方法
write(int c) 写一个字符
write(char[] chs) 写一个字符数组
write(char[] chs,int start,int length) 写字符数组的一部分
write(String str) 写字符串
flush() 刷新
常用子类
FileWriter
构造方法绑定数据目的
FileWriter(String path)
FileWriter(File file)
FileWriter(String path,boolean append)
FileWriter(File file,boolean append)
八、flush和close区别:
字符输出流 需要刷新 不刷新数据不进入到数据目的
flush就是刷新数据 将数据从缓冲区中刷新到数据目的 刷新完毕后还可以继续写数据
九、IO异常处理:
将close方法放到finally中
提升作用于范围 try外定义变量 try内给变量赋值
发现close方法有异常 try catch处理
由于两个close需要分开处理 第2个close放入到finally当中
需要进行非空判断 流对象 不为null才close
public static void main(String[] args) {
FileReader f1=null;
FileWriter f2=null;
try {
f1 = new FileReader("day10\\a.txt");
f2 = new FileWriter("day10\\b.txt");
int len;
char[]arr=new char[1024];
while ((len=f1.read(arr))!=-1){
f2.write(new String(arr,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (f2!=null) {
f2.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (f1!=null) {
f1.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
十、java.util.Properties:
特点
1.实现了Map接口 是一个双列集合 Map中的方法都可以使用
2.没有泛型 键 是String类型 值 也是String类型
3.唯一一个能够和IO直接结合使用的集合
方法
setProperty(String key ,String value) 添加数据 相当于 put(K key,V value)
getProperty(String key) 根据键找值 相当于 get(Object key)
Set<String> stringPropertyNames() 获取所有键的set集合 相当于 keySet()
和IO流结合使用
方法
load(InputStream in) 将文件中的键值对加载到集合中
参数
InputStream in:字节输入流的超类 抽象类
可以传入其任意子类对象 FileInputStream
load(Reader r)将文件中的键值对加载到集合中
参数
Reader r:字符输入流的超类 抽象类
可以传入其任意子类对象 FileReader
文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。