I/O流分类
按照方向划分
输入流:InputStream、FileInputStream、Reader、ObjectInputStream、InputStreamReader、FileReader .将数据从存储设备读入到内存。其中Reader---->InputStreamReader--->FileReader. InputStream--->FileInputStream.为了提高读取速度,可以适当减少访问磁盘的次数,就使用到类缓存,BufferedReader、BufferedInputStream.其中InputStream--->FilterInputStream--->BufferedInputStream.Reader--->BufferedReader.
输出流:OutputStream、FileOutputStream、ObjectOutputStream、Writer、OutputStreamWriter、FileWriter. 将数据从内存写出到存储设备。其中类之间的关系:OutputStream--->FileOutputStream, Writer--->OutputStreamWriter--->FileWriter. 同理为了提高写出速度 使用到的缓存类有,BufferedWriter、BufferedOutputStream.OutputStream--->FilterOutputStream--->BufferedOutputStream, Writer--->BufferedWriter.
按照单位划分
字节流:FileIputStream,每次读取字节,可以读取任何类型的文件,使用缓冲区类BufferedInputStream,可以提高读取效率,亦可以自己写固定大小的缓冲区域,注意,使用BufferedInputStream需要flush.将缓冲区的内容刷新到内存中。close也相当于flush.
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("D://aa.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
int count = 0;
byte [] buf = new byte[1024];
while((count = bis.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
bis.close();
}
FileOutputStream,每次以字节为单位写出,可以写出任何类型的文件,使用BufferedOutputStream,可以提高写出效率,也可以维护自己设定大小的缓冲区,当缓冲区写满才将其写入到文件,使用BufferedOutputStream同样需要flush,将缓冲区数据刷新到文件中
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("D://buffer.txt",true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
for (int i =0;i<10;i++){
bos.write("helloworld\r\n".getBytes());
bos.flush();
}
bos.close();
}
字符流:FileReader, FileWriter将字符流读入内存和写出文件。不能读取和写出二进制文件,否则会乱码,以为如(图片)和字符文件的编码方式式不一样的,字符流存在的意义,在一定程度上,读取字符的效率要高于字节流读取字符型文件。同样使用BufferedReader和BufferedWriter提高读取效率。亦可以自定义一个字符缓冲区。BuffereReader还提供了读取一行的方法。
读入字符文件到内存
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("write.txt");
BufferedReader br = new BufferedReader(fr);
int count = 0;
char [] buf = new char [1024];
while((count = br.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
String line = null;
while((line = br.readLine())!=null){
System.out.println(line);
}
br.close();
}
将字符数据写出到文件,BufferedWriter提供writeLine方法写入一行,可以提高程序的可移植性。
public static void main(String[] args) throws Exception{
FileWriter fw = new FileWriter("li");
BufferedWriter bw = new BufferedWriter(fw);
for(int i = 0 ;i <10 ;i++){
bw.write("我爱ly");
bw.newLine();
bw.flush();
}
bw.close();
}
对象流(乱叫的):ObjectInputStream、ObjectOutputStream,以对象为单位、使用该类需要一个FileOutputStream、FileInputStream对象。writeObject方法写出,readObject方法读入,若需要同时读取多个对象,可以使用集合。如下:
写出
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("D://oos.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student s = new Student("xxx", 14);
Student s1 = new Student("yyy", 17);
List<Student> list = new ArrayList<>();
list.add(s);
list.add(s1);
oos.writeObject(list);
oos.close();
System.out.println("序列化完毕");
}
读入
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("D://oos.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
List list = (List)ois.readObject();
ois.close();
System.out.println(list.toString());
}
这种如果不对Student类进行序列化会报java.io.NotSerializableException错误
字节流转换成字符流
输入流
该文件必须采用的是字符编码,将其读入到内存,InputStreamReader使用需要一个FileInputStream对象,另一个初始化参数是字符的编码格式
public static void main(String[] args)throws Exception {
FileInputStream fis = new FileInputStream("write.txt");
// 存储设备读入内存中,字节转换成字符
InputStreamReader isr = new InputStreamReader(fis, "gbk");
int count =0;
char [] buf = new char[1024];
while((count=isr.read(buf))!=-1){
System.out.println(new String (buf,0,count));
}
isr.close();
}
FileOutputSteamWriter需要一个FileOutputStream对象,另一个初始化参数是字符的编码格式
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("write3");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
for (int i = 0;i <10 ;i++){
osw.write("hellowordk");
osw.flush();
}
osw.close();
}
补充: Properties 的用法
一对、都是字符串、load方法
public static void main(String[] args) throws Exception{
Properties pro = new Properties();
pro.setProperty("name", "zhangsan");
pro.setProperty("age", "12");
System.out.println(pro.toString());
PrintWriter pw = new PrintWriter("print1.txt");
Set<String> pronames = pro.stringPropertyNames();
for (String string : pronames) {
pw.write(string+"="+pro.getProperty(string));
}
pro.list(pw);
pw.close();
FileOutputStream fos = new FileOutputStream("store.properties");
pro.store(fos, "注释");
fos.close();
FileInputStream fis = new FileInputStream("store.properties");
pro.load(fis);
fis.close();
System.out.println(pro.toString());
}