【JavaSE】day11_Reader和Writer_PrintWriter
1.Reader和Writer
1)Writer,Reader 字符输出,输入流的父类。
* 字符流特点:以字符为单位读写数据。
* 字符流只能读写文本数据。所以不要用字符流读取非文本文件。
* 字符流只是简化了我们对于字符串的读写操作不用自行在字节与字符之间转换。
* 所以字符流都是高级流,底层本质还是要用字节读写数据。
2)OutputStreamWriter
按照给定的字符集,将字符串转换为一组字节后写出。
代码:
<span style="font-size:18px;">package day03;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* Writer,Reader 字符输出,输入流的父类。
* 字符流特点:以字符为单位读写数据。
* 字符流只能读写文本数据。所以不要用字符流读取非文本文件。
* 字符流只是简化了我们对于字符串的读写操作不用自行在
* 字节与字符之间转换。
* 所以字符流都是高级流,底层本质还是要用字节读写数据。
*
*/
public class OSWDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("osw.txt");
/*
* 特点:
* 按照给定的字符集,将字符串转换为一组字节后写出。
*/
OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
String str = "//我爱java";
/*
* 将给定的字符串转换为一组字节后写出。
*/
osw.write(str);
osw.write("我爱北京天安门");
osw.close();
}
}
</span>
3)java.io.InputStreamReader
字符输入流,特点:可以按照指定的字符集读取字符。
代码:
<span style="font-size:18px;">package day03;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* java.io.InputStreamReader
* 字符输入流
* 特点:可以按照指定的字符集读取字符
*
*/
public class ISRDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("osw.txt");
//为了方便读取字符,可以使用字符输入流
InputStreamReader isr = new InputStreamReader(fis,"gbk");
int d = -1;
while((d=isr.read())!=-1){
char c = (char)d;
System.out.print(c);
}
isr.close();
}
}
</span>
2.PrinterWriter
1)
* 缓冲字符输出流:BufferedWriter
* 由于内部维护了一个字符数组作为缓冲区。所以写出字符串的效率高,而且还有一个特点就是可以以行为单位写出字符串。
* PrintWriter:具有自动行刷新功能的缓冲字符输出流.由于该流的缓冲功能是使用BufferedWriter实现的,并且其提供了更多功能,所以比较常用。创建PrintWriter时,其总是先创建BufferedWriter作为缓冲功能。
2)直接操作文件的构造方法
* PrintWriter(File file)
* PrintWriter(String pathName)
直接操作文件的这两个构造方法都支持第二个参数,就是指定字符集。
代码:
<span style="font-size:18px;">package day03;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 缓冲字符输出流:BufferedWriter
* 由于内部维护了一个字符数组作为缓冲区。所以写出
* 字符串的效率高,而且还有一个特点就是可以以行为
* 单位写出字符串。
*
* PrintWriter:具有自动行刷新功能的缓冲字符输出流
* 由于该流的缓冲功能是使用BufferedWriter实现的,
* 并且其提供了更多功能,所以比较常用。
* 创建PrintWriter时,其总是先创建BufferedWriter
* 作为缓冲功能。
*
*/
public class PWDemo {
public static void main(String[] args) throws IOException {
/*
* 直接操作文件的构造方法
* PrintWriter(File file)
* PrintWriter(String pathName)
*
* 直接操作文件的这两个构造方法都支持第二个参数,就是指定字符集。
*/
PrintWriter pw = new PrintWriter("pw.txt","GBK");
pw.println("woaibeijingtiananmen");
pw.println("我爱北京天安门");
pw.close();
}
}
</span>
3)PrintWriter可以处理其他流。
* 既可以处理字节流,也可以处理字符流。但是直接处理字节流的弊端在于,不能指定字符集。
* 当创建PrintWriter并处理其他流时: 即:构造方法的第一个参数为流
* 那么这些构造方法都支持第二个参数,是一个boolean值,当该值为true时,PrintWriter就具有自动行刷新功能。
<span style="font-size:18px;">package day03;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
/**
* PrintWriter可以处理其他流
* 既可以处理字节流,也可以处理字符流。
* 但是直接处理字节流的弊端在于,不能指定字符集。
*
* 当创建PrintWriter并处理其他流时:
* 即:构造方法的第一个参数为流
* 那么这些构造方法都支持第二个参数,是一个boolean值,
* 当该值为true时,PrintWriter就具有自动行刷新功能。
*
*/
public class PWDemo2 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("pw1.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
/*
* 当第二个参数为true时,该PrintWriter就具有
* 自动行刷新功能,即:
* 每当调用println()方法时,将字符串写出后自动flush()
* 需要知道:自动行刷新会提高写出次数,降低写出
* 效率,但是可以提高写出的及时性。
*/
PrintWriter pw = new PrintWriter(osw,true);
pw.println("我爱北京天安门");
pw.close();
}
}
</span>
3.java.io.BufferedReader
1)缓冲字符输入流
* 特点:需要处理一个字符流,并且可以以行为单位读取字符串。
2)String readLine()
* BufferedReader提供了该方法可以以行为单位读取字符串。
* 该方法会顺序读取若干字符,直到遇到换行符为止,然后将换行符之前的所有字符转换为一个字符串后返回。该字符串中不包含换行符!若返回值为null,表示读取到文件末尾。
代码:
<span style="font-size:18px;">package day03;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
/**
* java.io.BufferedReader
* 缓冲字符输入流
* 特点:需要处理一个字符流,并且可以以行为单位
* 读取字符串。
*
*/
public class BRDemo {
public static void main(String[] args) throws IOException {
/*
* 读取当前源文件,并将内容输出到控制台
*/
FileInputStream fis = new FileInputStream(
"."+File.separator+"src"+File.separator+
"day03"+File.separator+"BRDemo.java"
);
InputStreamReader isr = new InputStreamReader(fis,"GBK");
BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter("BRDemo.java","UTF-8");
/*
* String readLine()
* BufferedReader提供了该方法可以以行为单位
* 读取字符串。
* 该方法会顺序读取若干字符,直到遇到换行符为止,
* 然后将换行符之前的所有字符转换为一个字符串后
* 返回。该字符串中不包含换行符!
* 若返回值为null,表示读取到文件末尾。
*/
String line = null;
while((line=br.readLine())!=null){
//System.out.println(line);
pw.println(line);
}
pw.close();
br.close();
}
}
</span>