IO流
来操作File对象完成读取和写入
类型:字节流和字符流
- 字节流
I:Input读写流,从硬盘读取到内存
O:Ouput写入流,从内存写入硬盘持久化存储 - 字符流:
Reader
Writer
字节流
java.io![在这里插入图片描述](https://img-blog.csdnimg.cn/20200318162943102.png)
字节输出流-OutputStream抽象类
java.io.OutputStream
- FileOutputStreamw-文件字节输出流
使用步骤:
原理:
- 续写 和 换行写
- 续写 和 换行写
InputStream字节输入流-抽象类
- FileInputStream文件字节输入流
字节输入流的子类
使用步骤:
掌握:
len记录的是有效读取的字节个数
读取原理:
- 读取方法
- 文件复制
/*使用字节流实现文件复制
* 分析:文件复制即先读后写
* 1FileInputStream读
* 2FileOutputStream写*/
public class FileCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("src\\IOStream\\FileOutputStream\\a.txt");
FileOutputStream fos=new FileOutputStream("src\\IOStream\\b.txt");
int len=0;
byte[] bytes=new byte[1024];
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
System.out.println(len);
}
fos.close();
fis.close();
}
}
- 字节流读取中文时会出现问题UTF-8编码中一个中文3个字节读取会出现乱码
字符流
解决读取中文时出现的乱码问题
字符输入流Reader
FileReader文件字符输入流
Writer字符输出流
write后需要flush刷新缓冲
FileWriter文件字符输出流
- 使用步骤
- flush和close的区别:
- 写数据的其他方法:
/*使用字符输出流写数据
* *同字节输出流不同的是,字符输出流是先写入内存中的*/
public class Demo {
public static void main(String[] args) throws IOException {
//创建对象
FileWriter fw=new FileWriter("src\\IOStream\\b.txt");
//写入单个字符
fw.write('中');
//flush和close区别在于flush后流还可以继续使用
fw.flush();
fw.write('国');
//写入字符数组
char[] w={',','你','最','棒','!'};;
fw.write(w);
//写入部分字符数组
fw.write(w,1,3);
//写入字符串
fw.write("我们爱你!");
//写入部分字符串
fw.write("我们爱你!",0,4);
//释放资源
fw.close();
//fw.write('国');//IOException: Stream closed
}
}
- 续写和换行
//构造方法中第二个boolean参数是续写开关
FileWriter fw=new FileWriter("src\\IOStream\\b.txt",true);
//写入单个字符
fw.write('中');
//flush和close区别在于flush后流还可以继续使用
fw.flush();
fw.write('国');
//换行
fw.write("\r\n");
fw.close();
IO异常的处理
eg:
/*使用try_catch处理流中的异常*/
public class Demo1TryCatch {
public static void main(String[] args) {
//再此处声明来扩大变量作用域-赋值后方可调用方法
FileWriter fw=null;
try {
fw= new FileWriter("src\\IOStream\\b.txt",true);
for (int i = 0; i < 10; i++) {
fw.write("Hello World!"+i+"\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//再此处使用try_catch来防止当fw为空时报空指针异常
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- JDK7的新特性:流对象可以自动释放
eg:
- JDK9的新特性:流对象可以自动释放
eg:
Properties属性集
java.util.Properties extends Hashtable<k,v> implements Map<k,v>
- 基本使用eg:
- 集合中的与IO有关的方法:
- store方法:
eg:
/*Properties属性集-->存放的时String类型的键值对
* extend Hashtable<k,v> implements Map<k,v>*/
public class PropertiesP {
public static void main(String[] args) throws IOException {
//创建properties对象
Properties p=new Properties();
//存储数据
p.setProperty("杨航","20");
p.setProperty("张琪","17");
p.setProperty("杨科","13");
//创建文件字符输出流
FileWriter fw=new FileWriter("src\\IOStream\\b.txt");
//创建文件字节输出流----》不能存入文字会乱码
//\u6768\u79D1=13
//\u5F20\u742A=17
//\u6768\u822A=20
FileOutputStream fos=new FileOutputStream("src\\IOStream\\b.txt");
p.store(fos,"sava data");
//释放流
fw.close();
}
}
*load方法
eg: