1.IO概述
1.概念
- 数据在内存和硬盘的传输
2.分类
- 输入流:硬盘->内存
- 输出流:内存->硬盘
- 字节流:单位为字节
- 字符流:单位为字符(编码)
3.IO流顶级抽象类
- 字节输入流:InputStream
- 字节输出流:OutputStream
- 字符输入流:Reader
- 字符输出流:Writer
2.字节流
1.概念
- 字节流可以传输任意文件数据,但传输中文时可能会出现乱码
2.OutputStream共有方法
- public void close() :关闭并刷新流
- public void flush() :刷新流
- public void write(byte[] b):将字节数组写入流
- public void write(byte[] b, int off, int len) :将指定位置的字节数组写入流
- public abstract void write(int b) :将字节写入流
3.FileOutputStream子类构造
- public FileOutputStream(File file):创建指定File对象的流
- public FileOutputStream(String name): 创建指定名称的流
- public FileOutputStream(File file, boolean append): 以追加形式创建指定File对象的流
- public FileOutputStream(String name, boolean append): 以追加形式创建指定名称的流
4.InputStream共有方法
- public void close() :关闭并刷新流
- public abstract int read(): 从流读取下一字节数据(无返回-1)
- public int read(byte[] b): 从流读取下一字节数组数据(无返回-1)
5.FileInputStream子类构造
- public FileInputStream(File file):创建指定File对象的流
- public FileInputStream(String name): 创建指定名称的流
注:文件不存在时会自动创建
6.使用字节流实现数据拷贝
import java.io.*;
//单个字节拷贝数据
public class demo1 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("demo\\b.txt");
FileReader fd = new FileReader("demo\\a.txt");
int ch;
while ((ch = fd.read())!=-1){
fw.write(ch);
}
fw.close();
fd.close();
}
}
import java.io.*;
//使用字节数组拷贝数据
public class demo1 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("demo\\b.txt");
FileInputStream fis = new FileInputStream("demo\\a.txt");
int ch;
byte[] by = new byte[1024];
while ((ch = fis.read(by))!=-1){
fos.write(by,0,ch);
}
fos.close();
fis.close();
}
}
3.字符流
1.概念
- 只能处理纯文本文件,且字符输出流有内置数组
2.Reader共有方法
- public void close() :关闭并刷新流
- public int read(): 从流中读取一个字符
- public int read(char[] cbuf): 从流中读取一个字符数组
3.FileReader子类构造
- FileReader(File file): 创建指定File对象的流
- FileReader(String fileName): 创建指定名称路径的流
4.Writer共有方法
- public abstract void close() :关闭并刷新流
- public abstract void flush() :刷新流
- public void write(int c) :用流写出一个字符
- public void write(char[] cbuf):用流写出一个字符数组
- public abstract void write(char[] b, int off, int len) :用流写出一个字符数组的部分
- public void write(String str) :用流写出一个字符串(底层会将字符串转为字符数组)
5.FileWriter子类构造
- FileWriter(File file): 创建指定File对象的流
- FileWriter(String fileName): 创建指定名称路径的流
- FileWriter(String fileName, boolean append):创建指定名称路径的追加流
注:文件不存在时会自动创建
6.使用字符流实现数据拷贝
import java.io.*;
public class demo1 {
//使用单个字符
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("demo\\b.txt");
FileReader fd = new FileReader("demo\\a.txt");
int ch;
while ((ch = fd.read())!=-1){
fw.write(ch);
}
fw.close();
fd.close();
}
}
import java.io.*;
//使用字符数组
public class demo1 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("demo\\b.txt");
FileReader fd = new FileReader("demo\\a.txt");
int ch;
char[] chars = new char[1024];
while ((ch = fd.read(chars))!=-1){
fw.write(chars,0,ch);
}
fw.close();
fd.close();
}
}
7.补充
面试题:flush和close的区别?
- flush只会刷新缓冲区,流对象还可以继续使用
- close会关闭流并刷新缓冲区,流对象不能继续使用
4.IO异常处理
1.JDK7前
import java.io.*;
public class demo1 {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("demo\\a.txt");
fos.write(99);
} catch (IOException e) {
e.printStackTrace();
}finally {
try { //先判断流对象是否存在,否则可能导致空指针异常
if (fos!=null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.JDK7及以后
import java.io.*;
//try()里面的流对象都继承了AutoCloseable自动关闭接口
public class demo1 {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("demo\\a.txt");){
fos.write(99);
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.属性集合(Properties)
1.概念
- JDK1出现的属性集合类,拥有双列集合的功能(没有泛型约束)和表示一个持久的属性集合
2.构造方法
- public Properties() :创建一个空的属性列表
3.基本存储方法
- public Object setProperty(String key, String value) : 保存一对属性。
- public String getProperty(String key) :根据键找值
- public Set stringPropertyNames() :所有键的名称的集合
4.加载文件配置信息方法
public void store(OutputStream out,String comments):往
public void load(InputStream inStream): 从字节输入流中读取关联的文件到集合中,一般存储键值对。
FileOutputStream fos = new FileOutputStream("day09\\data.txt");//持久化保存到硬盘永久的
p.store(fos,null);//把p里面内容保存到fos输出流关联的文件,null对文件注释
FileInputStream fis = new FileInputStream("day09\\data2.properties");
//扩展输入流,类加载器有方法把文件变成输入流(src文件夹才有效)
InputStream fis = Test08.class.getClassLoader().getResourceAsStream("data2.properties");
p.load(fis);