码迷,mamicode.com
首页 > 编程语言 > 详细

22 Java学习之字符流(Reader和Writer)

时间:2018-10-18 22:01:54      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:打开文件   刷新   bubuko   文字   color   static   错误   数字   分享   

  Java中的流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等

一. 字符流的引入

正如字节流中所看到的,有时候当一个中文字符含有两个字节时,字节流它时一次只能操作一个字节,它不能直接操作Unicode字符。因此引入了字符流。

二. 字符流

字符流分为输入字符流和输出字符流。它们的基类代表分别时Reader和Writer。

Writer: 把要写入文件的字符序列(实际上是unicode码元序列)转为指定编码方式下的字节序列,然后再写入文件中。

Reader:把要读取的字节序列按照指定编码方式转为相应的字符序列(实际上是unicode码元序列),从而写入内存中。

技术分享图片

 三. 字符输入流

1. 常见的字符输入流有:

  • Reader
  • InputStreamReader
  • FileReader
  • BufferedReader

2. 它们的用途与区别

(1)Reader:是字符流的抽象基类,它包含了重要方法有read和close

(2)InputStreamReader:可以把InputStream中的字节数据流根据字符编码方式转换成字符数据流。

(3)FileReader:可以把FileInputStream中的字节数据转换成根据字符编码方式转成字符数字流。

(4)BufferedReader:可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。它含有read(末尾返回-1)和readLine()(末尾返回Null).

3. InputStreamReader的使用

技术分享图片
 1 package com.test.a;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 
 7 public class Test {
 8     public static void main(String args[]) throws IOException {
 9         FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hermioner\\Desktop\\test.txt");
10         InputStreamReader inputStreamReader=new InputStreamReader(fileInputStream);
11         int ch;
12         while((ch=inputStreamReader.read())!=-1)
13         {
14             System.out.println((char)ch);
15         }
16         inputStreamReader.close();
17         fileInputStream.close();
18     }
19 }
20 
21 22 23 24
View Code

note:test.txt中的内容是横着的  我爱我家

note:InputStreamReader需要一个字节输入流对象作为实例化参数。还可以指定第二个参数,第二个参数是字符编码方式,可以是编码方式的字符串形式,也可以是一个字符集对象。

4. FileReader

技术分享图片
 1 package com.test.a;
 2 
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5 
 6 public class Test {
 7     public static void main(String args[]) throws IOException {
 8         FileReader reader=new FileReader("C:\\Users\\hermioner\\Desktop\\test.txt");
 9         char chars[]=new char[1024];
10         int len;
11         while((len=reader.read(chars))!=-1) {
12             System.out.println(new String(chars,0,len));
13         }
14         reader.close();
15     }
16 }
17 
18 我爱我家
View Code

note:FileReader 需要一个文件对象作为实例化参数,可以是File类对象,也可以是文件的路径字符串。

5. BufferedReader

技术分享图片
 1 package com.test.a;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 
 7 public class Test {
 8     public static void main(String args[]) throws IOException {
 9         FileReader fileReader=new FileReader("C:\\Users\\hermioner\\Desktop\\test.txt");
10         BufferedReader bufferedReader=new BufferedReader(fileReader);
11         String line;
12         while((line=bufferedReader.readLine())!=null) {
13             System.out.println(line);
14         }
15         bufferedReader.close();
16         fileReader.close();
17     }
18 }
19 
20 
21 我爱我家
View Code

note: BufferReader需要一个字符输入流对象作为实例化参数。

四. 字符输出流

1. 常见的字符输出流有:

  • Writer
  • OutputStreamWriter
  • FileWriter
  • BufferedWriter

它们的区别和用途:

(1)Writer:是字符输出流的抽象基类,它包含的重要方法有wirte、close、flush(刷新输出流,把数据马上写到输出流中)

(2)OutputStreamWriter:可以使我们直接往流中写字符串数据,它里面会帮我们根据字符编码方式来把字符数据转成字节数据再写给输出流,它相当于一个中介\桥梁。

(3)FileWriter:与OutputStreamWriter功能类似,我们可以直接往流中写字符串数据,FileWriter内部会根据字符编码方式来把字符数据转成字节数据再写给输出流。

(4)BufferedWriter:比FileWriter还高级一点,它利用了缓冲区来提高写的效率。它还多出了一个函数:

  • newLine() :写入一个换行符。

2. OutputStreamWriter使用

技术分享图片
 1 public class Test {
 2     public static void main(String args[]) throws IOException {
 3         OutputStream outputStream=new FileOutputStream("C:\\Users\\hermioner\\Desktop\\test.txt");
 4         OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream);
 5         outputStreamWriter.write("hello world,你好");
 6         outputStreamWriter.close();
 7     }
 8 }
 9 
10 
11 就可以在test中写入数据。
View Code

说明:OutputStreamWriter是需要传入一个流对象作为实例化参数的

3. FileWriter使用

技术分享图片
1 public class Test {
2     public static void main(String args[]) throws IOException {
3         FileWriter fileWriter=new FileWriter("C:\\Users\\hermioner\\Desktop\\test.txt");
4         fileWriter.write("加油");
5         fileWriter.close();
6     }
7 }
8 
9 文件中就写入了字符串内容
View Code

说明:FileWriter需要一个文件对象来实例化,可以是File类对象,也可以是文件的路径字符串。

4. BufferedWriter使用

技术分享图片
1 public class Test {
2     public static void main(String args[]) throws IOException{
3         FileWriter fileWriter=new FileWriter("C:\\Users\\hermioner\\Desktop\\test.txt");
4         BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
5         bufferedWriter.write("加油");
6         bufferedWriter.close();
7         fileWriter.close();
8     }
9 }
View Code

五.总结

1. OutputStreamWriter、InputStreamReader就是输入、输出提起中提供的两个转换流,用于将字节流转换为字符流。-------只能从字节流转换到字符流。

2.为什么不能从字符流转换到字节流?

首先想一字节流和字符流的区别:字节流比字符流的使用范围更广,但字符流比字节流操作方便。如果一个流已经是字符流,也就意味着这是一个使用起来更方便的流,为什么还要转换成字节流呢?反之,如果现在有一个字节流,但可以确定这个字节流的内容都是文本内容,我们就可以将它转换成字符流处理起来会更方便一点。所以,java只提供了字节流到字符流的转换,没有提供字符流到字节流的转换。

3. 计算机中的文件常被分成文本文件和二进制文件两大类:

  • 我们不妨可以这样绝对的认为:所有能用记事本打开并且看到其中字符内容文件称为文本文件,反之则是二进制文件。
  • 其实计算机中所有的文件都是二进制文件,文本文只是二进制文件中的一个特殊的存在。如果二进制文件的内容恰好能被正常解析成字符时,则该二进制文件就可以称之为文本文件。
  • 在有些情况下,文本文件使用了错误的字符集打开,也会生成乱码。所以如果想正常使用文本文件,必须在打开文件时使用与保存文件是相同的字符集。

 

参考文献:

https://www.cnblogs.com/progor/p/9357676.html

https://www.cnblogs.com/dongguacai/p/5676254.html

 

22 Java学习之字符流(Reader和Writer)

标签:打开文件   刷新   bubuko   文字   color   static   错误   数字   分享   

原文地址:https://www.cnblogs.com/Hermioner/p/9773188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!