文件流

流根据方向不同分为输入流与输出流,参照点为当前程序.输入流用来读取数据,输出流用来写出数据.
java.io.InputStream抽象类,定义了输入流的读取字节方法,所有的字节输入流都继承自它
java.io.OutputStream则是所有字节输出流的父类
流分为节点流处理流
节点流,也叫低级流。是真实负责读写数据(字节)的流,读写操作中必须要有低级流,数据源明确。
处理流,也叫高级流。是简化读写数据中操作的流,读写可以没有高级流,高级流也不能独立存在,必须用于处理其他流。
低级流:
java.io.FileInputStream文件输入流
java.io.FileOutputStream文件输出流(创建时可指定第二个参数为true,则为追加写操作,即输出内容追加到文件末尾,不指定第二个参数时默认为覆盖写操作)。例:

FileOutputStream fos = new FileOutputStream("fos.txt", true);

高级流:
java.io.BufferedInputStream缓冲输入流
java.io.BufferedOutputStream缓冲输出流
java.io.ObjectInputStream对象输入流
java.io.ObjectOutputStream对象输出流
java.io.Reader字符输入流的顶级父类
java.io.Writer字符输出流的顶级父类
java.io.InputStreamReader字符输入转换流
java.io.OutputStreamWriter字符输出转换流
java.io.BufferedReader缓冲字符输入流
java.io.BufferedWriter缓冲字符输出流
java.io.PrintWriter缓冲字符输出流(可自动行刷新)
java.io.FileWriter写入字符文件的便捷类(可进行追加写操作)

缓冲流内部有一个缓冲区,当read方法读取第一个字节时,实际上缓冲流会一次性读取一组字节并存入内部的字节数组中,然后将第一个字节返回,当再次调用read方法时,缓冲流直接从字节数组中将第二个字节返回,直到字节数组中所有字节全部返回后,才会再次读取一组字节.所以缓冲流也是依靠提高一次读写的数据量减少读写次数来达到提高读写效率的
例:

FileOutputStream fos = new FileOutputStream("bos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
String str = "呵呵";
bos.write(str.getBytes("UTF-8"));
bos.flush();    //强制将缓冲区中的字节一次性写出
System.out.println("写出完毕!");
bos.close();

对象流
对象输出流可以将给定的对象转换为一组字节(对象序列化),然后写出到磁盘(对象持久化)。对象输入流则可以进行对象反序列化将一组字节还原为对象,读取的字节必须是由对象输出流序列化得到的字节,否则为抛出异常。
当一个类需要被对象流读写,那么该类必须实现java.io.Serializable接口。
例:(Person为创建的测试类)

FileOutputStream fos = new FileOutputStream("person.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person("张三", "27");
oos.writeObject(p);
System.out.println("写出对象完毕!");
oos.close();

FileInputStream fis = new FileInputStream("person.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person)ois.readObject();    //对象反序列化
System.out.println("读取对象完毕!");
ois.close();

transient关键字用来修饰属性或方法后,该类实例在进行对象序列化时,该属性值或方法被忽略。从而达到对象”瘦身”的目的。

字符流
字符流都是高级流,读写单位为字符,虽然以字符为单位读写数据但是实际底层还是读写字节,只是从字节与字符的转换工作交给了字符流来完成。
转换流
之所以称OutputStreamWriter与InputStreamReader为转换流,是因为大多数的字符流都只处理其他字符流,而低级流又是字节流,这就导致字符流不能处理字节流的问题,转换流相当于是一个转换器的作用它们可以将字节流先转变为字符流,这样其他的字符流就可以处理了。

FileInputStream fis = new FileInputStream("osw.txt");
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
int d = -1;
while((d = isr.read())!=-1){    //-1表示没有读到字节,即文件末尾
    System.out.print((char)d);
}
isr.close();

缓冲字符流
BufferedWriter,BufferedReader特点是可以按行读写字符串

FileInputStream fis = new FileInputStream("br.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine())!=null){    //readLine读取一行
    System.out.println(line);
}
br.close();

PrintWriter具有自动行刷新的缓冲字符输出流,创建时,它一定会在内部创建BufferedWriter作为缓冲功能的叠加
构造方法:

PrintWriter(File file)
PrintWriter(String path)
PrintWriter(File file, String csn)  //csn为编码集
PrintWriter(String path, String csn)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out, boolean autoFlush)    //autoFlush是否自动行刷新,没有此参数时默认为false,即不自动刷新
PrintWriter(Writer out)
PrintWriter(Writer out, boolean autoFlush)

例:

PrintWriter pw = new PrintWriter("pw.txt","UTF-8");
pw.println("你好");   //自动行刷新只有在println方法时才生效,print不进行行刷新
System.out.println("写出完毕!");
pw.close();
FileOutputStream fos = new FileOutputStream("pw.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
PrintWriter pw = new PrintWriter(osw);
pw.println("嘿嘿");
System.out.println("写出完毕!");
pw.close();

FileWriter用来写入字符文件的便捷类。
构造方法:

FileWriter(File file)
FileWriter(String fileName)
FileWriter(File file, boolean append)   //append为是否追加写入,无此参数时默认为false,即不追加写入
FileWriter(String fileName, boolean append)

例:

FileWriter fw = new FileWriter("fw.txt", true);
fw.write("哈哈\n");

PrintWriter和FileWriter比较

FileWirter可以指定是否追加写操作,无法指定字符集,缓存大小默认为1024字符(Writer类的默认缓存)。
如需进行指定字符集则需要创建FileOutputStream和OutputStreamWriter。即:

FileOutputStream fos = new FileOutputStream("fos.txt", true);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

指定缓存大小则需要创建BufferedWriter。即:

FileWriter fw = new FileWriter("fw.txt", true);
BufferedWriter bw = new BufferedWriter(fw, 8192);   //8192为缓存字符数,可不写,默认即为8192

PrintWriter可以单独指定字符集或者自动行刷新,无法指定追加写操作,缓存大小默认为8192字符(BufferedWriter类的默认缓存)。
如需指定追加写操作,则需创建FileOutputStream或FileWirter,即:

FileOutputStream fos = new FileOutputStream("fos.txt", true);
PrintWriter pw = new PrintWriter(fw);

整合追加写,指定字符集,自动行刷新,指定缓存大小

//true表示追加写入文件
FileOutputStream fos = new FileOutputStream("fos.txt", true);
//"UTF-8"为字符集
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
//8192为缓存字符数
BufferedWriter bw = new BufferedWriter(osw, 8192);
//true表示自动行刷新
PrintWriter pw = new PrintWriter(bw, true);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值