IO(二)----字符流

计算机并不区分二进制文件与文本文件。所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进制文件。所以字符流是建立在字节流之上的,它能够提供字符层次的编码和解码。

常见的码表

ASCII:    美国标准信息交换码。用一个字节的7位可以表示。

ISO8859-1:   拉丁码表。欧洲码表,用一个字节的8位表示。

GB2312:   英文占一个字节,中文占两个字节.中国的中文编码表。

GBK:      中国的中文编码表升级,融合了更多的中文文字符号。

Unicode:  国际标准码规范,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。

UTF-8:     万国码,推行的。是1~3个字节不等长。英文存的是1个字节,中文存的是3个字节,是为了节省空间。

字节流不适合读中文,因为字节流的单位以为1个字节,而在码表中文至少使用两个字节来表示。

字符流的体系

输入字符流:
-------| Reader 所有输入字符流的基类。 抽象类
----------| FileReader 读取文件字符串的输入字符流。
----------| BufferedReader   缓冲输入字符流  。 缓冲输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。其实该类内部也是维护了一个字符数组。

输入字符流

常用方法:

1、构造方法

FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader

FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader

FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader

2、读取方法

和字节输入流的读取方法一样,只是读的时候是按照字符来读的。

3、关闭资源的方法

和字节输入流的关闭资源一样。

代码示例:

 1 import java.io.File;
 2 import java.io.FileReader;
 3 import java.io.IOException;
 4 
 5 public class ReaderWriter {
 6     public static void main(String[] args) throws IOException {
 7         File file = new File("E:\nick.txt");
 8         FileReader fileReader = new FileReader(file);
 9         int count = 0;
10         while((count = fileReader.read()) != -1){
11             System.out.print((char)count);
12         }
13         fileReader.close();
14     }
15 }
View Code

缓冲输入字符流

缓冲输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。其实该类内部也是维护了一个字符数组。

常用方法

1、构造方法

BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。

2、读取和关闭方法和输入字符流提供的方法一样。特有的方法:

String readLine() 读取一个文本行。

代码示例:

 1 public static void readFile2() throws FileNotFoundException, IOException {
 2         File file = new File("E:\nick.txt");
 3         FileReader fileReader = new FileReader(file);
 4         BufferedReader bufferedReader = new BufferedReader(fileReader);
 5         String content = null;
 6         while ((content = bufferedReader.readLine()) != null) {
 7             System.out.println(content);
 8         }
 9         bufferedReader.close();
10     }
View Code

输出字符流

输出字符流
----------| Writer  所有输出字符流的基类,  抽象类。
--------------- | FileWriter 向文件输出字符数据的输出字符流。
----------------| BufferedWriter 缓冲输出字符流          缓冲输出字符流作用: 提高FileWriter的写数据效率与拓展FileWriter的功能。
BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。

常用方法:

1、构造方法

FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。

FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。

FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。

FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

2、写入方法:写入方法和FileOutPutStream的方法大致一样,只是写入的单位是一个字符。特有方法

void write(String str) 写入字符串

void write(String str, int off, int len) 写入字符串的某一部分。

3、关闭资源

关闭资源方法和FileOutPutStream的方法一致、

代码示例:

1 public static void writeFile() throws IOException {
2         File file = new File("E:\nick.txt");
3         FileWriter fileWriter = new FileWriter(file,true);
4         String string = "Nick 好聪明呀";
5         fileWriter.write(string);
6         fileWriter.close();
7     }
View Code

缓冲输出字符流

缓冲输出字符流作用: 提高FileWriter的写数据效率与拓展FileWriter的功能。BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。

常用方法:

1、构造方法:

BufferedWriter(Writer out)  创建一个使用默认大小输出缓冲区的缓冲字符输出流。

BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

2、写入方法和关闭方法大致和FileWrite一样,特有的方法:

void newLine()  写入一个行分隔符。

代码示例如下:

1 public static void writeFile2() throws IOException {
2         File file = new File("E:\nick.txt");
3         FileWriter fileWriter = new FileWriter(file,true);
4         BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
5         bufferedWriter.newLine();
6         bufferedWriter.write("我是大师");
7         bufferedWriter.close();
8     }
View Code

实战

缓冲输入输出字符流用户登陆注册...

代码示例:

 1 public class Login {
 2     
 3     static Scanner scanner = new Scanner(System.in);
 4 
 5     public static void main(String[] args) throws IOException {
 6         while(true){
 7             System.out.println("请选择功能: A(注册)   B(登陆)");
 8             String option =  scanner.next();
 9             if("a".equalsIgnoreCase(option)){
10                 //注册
11                 reg();
12                 
13             }else if("b".equalsIgnoreCase(option)){
14                 //登陆
15                 login();
16                 
17             }else{
18                 System.out.println("你的输入有误,请重新输入...");
19             }    
20         }
21     }
22     
23     
24     //登陆
25     public static void login() throws IOException{
26         System.out.println("请输入用户名:");
27         String userName = scanner.next();
28         System.out.println("请 输入密码:");
29         String password = scanner.next();
30         String info = userName+" "+ password;
31         //读取文件的信息,查看是否有该用户的信息存在,如果存在则登陆成功。
32         //建立数据的输入通道
33         //建立缓冲输入字符流
34         BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\users.txt"));
35         String line = null;
36         
37         boolean isLogin = false; // 用于记录是否登陆成功的标识, 默认是登陆失败的。
38         //不断的读取文件的内容
39         while((line = bufferedReader.readLine())!=null){
40             if(info.equals(line)){
41                 isLogin = true;
42                 break;
43             }
44         }
45         
46         if(isLogin){
47             System.out.println("欢迎"+userName+"登陆成功...");
48         }else{
49             System.out.println("不存在该用户信息,请注册!!");
50         }
51         
52         
53         
54     }
55     
56     
57     
58     
59     //注册
60     public static void reg() throws IOException{
61         System.out.println("请输入用户名:");
62         String userName = scanner.next();
63         System.out.println("请 输入密码:");
64         String password = scanner.next();
65         String info = userName+" "+ password;
66         //把用户的注册的信息写到文件上
67         File file = new File("F:\users.txt");
68         FileWriter fileWriter = new FileWriter(file,true);
69         //建立缓冲输出字符流
70         BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
71         //把用户信息写出
72         
73         bufferedWriter.write(info);
74         bufferedWriter.newLine();
75         //关闭资源
76         bufferedWriter.close();
77         
78     }
79 
80 }
View Code
原文地址:https://www.cnblogs.com/nicker/p/6249838.html