一.InputStreamReader
InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
构造方法:
InputStreamReader isr = new InputStreamReader(InputStream in); //构造默认编码的类
InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);//构造一个指定编码集的InputStreamReader类。
参数 in对象通过 InputStream in = System.in;获得。//读取键盘上的数据。
也可以通过传入FileinputStream对象来创建,例如:
InputStreamReader isr = new InputStreamReader(new FileinputStream("d:xxx.txt",true),此处可指定编码“ )
代码 实例:
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//1.实例化File的对象
//File file = new File("file/input1.txt");
//2.实例化转换输入流的对象
//注意:当一个流的存在的意义是为了实例化另外一个流,则这个流不需要手动进行关闭
//InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
//使用默认的字符集进行实例化转换流
上面也可简写成下面这行代码
//InputStreamReader reader = new InputStreamReader(new FileInputStream("file/input1.txt"));
//使用指定字符集进行实例化转换流
//字符集一般使用字符串直接传参,不区分大小写,但是,如果字符集书写有误的话,则会跑出java.io.UnsupportedEncodingException
InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("file/input1.txt")),"UTF-8");
//3.1不带缓冲区读取
char[] arr = new char[16];
int len = 0;
while((len = reader.read(arr)) != -1) {
String string = new String(arr, 0, len);
System.out.print(string);//这里最好不加换行,因为当缓冲区数组满的时候就会打印,而这时缓冲区数组读到的文档位置不一定换行,所以不添加换行,让其读到文件换行时候自动换行即可
//3.2 带缓冲区读取
使用缓冲区 可以使用缓冲区对象的 read() 和 readLine()方法。
*/
//读取字节流
FileInputStream fis = new FileInputStream("file/input1.txt");//读取文件上的数据。
//将字节流向字符流的转换。
InputStreamReader isr = new InputStreamReader(fis);//读取
//上面的两步代码可以一步到位
InputStreamReader isr = new InputStreamReader(new FileInputStream("file/input1.txt"))
//创建字符流缓冲区
BufferedReader bufr = new BufferedReader(isr);//缓冲
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\demo.txt")));以上代码都可以综合到这一句。
String line = null;
while((line = bufr.readLine())!=null){
System.out.println(line);
}
reader.close();
}
}
二.OutputStreamWriter
OutputStreamWriter 将字符流转换为字节流。(这里注意是将字符流)是字符流通向字节流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码
构造方法:
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out);//构造一个默认编码集的OutputStreamWriter类
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out,String charsetName);//构造一个指定编码集的OutputStreamWriter类。
参数 out对象通过 OutputStream out = System.out;获得。//打印到控制台上。
或者是简洁点的
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("xxx.txt"));将内容写入到指定文件
主要方法:
void write(int c);//将单个字符写入。
viod write(String str,int off,int len);//将字符串某部分写入。
void flush();//将该流中的缓冲数据刷到目的地中去。
以上构造方法 原文链接:https://blog.csdn.net/liuhenghui5201/article/details/8292552
OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?
其实在OutputStreamWriter流中维护自己的高效区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter高效区中。然后再调用刷新功能,或者关闭流,或者高效区存满后会把高效区中的字节数据使用字节流写到指定的文件中。
代码实现:
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
//1.实例化FIle对象
//注意:对于所有的输出流而言,文件可以不存在,在进行写入的过程中可以自动进行创建
//但是,对于所有的输入流而言,文件必须先存在,然后才能操作,否则,会抛出FileNotFounedException
File file = new File("file/output1.txt");
//2.实例化转换输出流
//如果不想覆盖源文件中的内容时,则在传参的时候,设置一个参数为true代表可以追加
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file,true), "utf-8");
//3.1不带缓冲区的写入
writer.write("家客户放假啊刚回家");
//4.刷新
writer.flush();
//5.关闭
writer.close();
//3.2带缓冲区的写入
FileOutputStream fos = new FileOutputStream("D:\\demo.txt");//打印到文件。
OutputStreamWriter osr = new OutputStreamWriter(fos);//输出
// OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//综合到一句。
BufferedWriter buf = new BufferedWriter(osr);//缓冲
String str = "我爱中国";
buf.write(str);
buf.flush();
buf.close();
}
}