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

常见的码表

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、关闭资源的方法

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

代码示例:

 import java.io.File;
import java.io.FileReader;
import java.io.IOException; public class ReaderWriter {
public static void main(String[] args) throws IOException {
File file = new File("E:\\nick.txt");
FileReader fileReader = new FileReader(file);
int count = 0;
while((count = fileReader.read()) != -1){
System.out.print((char)count);
}
fileReader.close();
}
}

缓冲输入字符流

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

常用方法

1、构造方法

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

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

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

代码示例:

 public static void readFile2() throws FileNotFoundException, IOException {
File file = new File("E:\\nick.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String content = null;
while ((content = bufferedReader.readLine()) != null) {
System.out.println(content);
}
bufferedReader.close();
}

输出字符流

输出字符流
----------| 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的方法一致、

代码示例:

 public static void writeFile() throws IOException {
File file = new File("E:\\nick.txt");
FileWriter fileWriter = new FileWriter(file,true);
String string = "Nick 好聪明呀";
fileWriter.write(string);
fileWriter.close();
}

缓冲输出字符流

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

常用方法:

1、构造方法:

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

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

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

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

代码示例如下:

 public static void writeFile2() throws IOException {
File file = new File("E:\\nick.txt");
FileWriter fileWriter = new FileWriter(file,true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.newLine();
bufferedWriter.write("我是大师");
bufferedWriter.close();
}

实战

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

代码示例:

 public class Login {

     static Scanner scanner = new Scanner(System.in);

     public static void main(String[] args) throws IOException {
while(true){
System.out.println("请选择功能: A(注册) B(登陆)");
String option = scanner.next();
if("a".equalsIgnoreCase(option)){
//注册
reg(); }else if("b".equalsIgnoreCase(option)){
//登陆
login(); }else{
System.out.println("你的输入有误,请重新输入...");
}
}
} //登陆
public static void login() throws IOException{
System.out.println("请输入用户名:");
String userName = scanner.next();
System.out.println("请 输入密码:");
String password = scanner.next();
String info = userName+" "+ password;
//读取文件的信息,查看是否有该用户的信息存在,如果存在则登陆成功。
//建立数据的输入通道
//建立缓冲输入字符流
BufferedReader bufferedReader = new BufferedReader(new FileReader("F:\\users.txt"));
String line = null; boolean isLogin = false; // 用于记录是否登陆成功的标识, 默认是登陆失败的。
//不断的读取文件的内容
while((line = bufferedReader.readLine())!=null){
if(info.equals(line)){
isLogin = true;
break;
}
} if(isLogin){
System.out.println("欢迎"+userName+"登陆成功...");
}else{
System.out.println("不存在该用户信息,请注册!!");
} } //注册
public static void reg() throws IOException{
System.out.println("请输入用户名:");
String userName = scanner.next();
System.out.println("请 输入密码:");
String password = scanner.next();
String info = userName+" "+ password;
//把用户的注册的信息写到文件上
File file = new File("F:\\users.txt");
FileWriter fileWriter = new FileWriter(file,true);
//建立缓冲输出字符流
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//把用户信息写出 bufferedWriter.write(info);
bufferedWriter.newLine();
//关闭资源
bufferedWriter.close(); } }

IO(二)----字符流的更多相关文章

  1. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  2. IO之字符流

    什么是字符流 对于文本文件(.txt .java .c .cpp) 使用字符流处理 注意点 读入的文件一定要存在 否则就会报FileNotFoundException 异常的处理 为了保证流资源 一定 ...

  3. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  4. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  5. 文本数据IO操作--字符流

    一.Reader和Writer 1. 字符流原理 Reader是所有字符输入流的父类而Writer是所有字符输出流的父类.字符流是以字符(char)为单位读写数据的.一次处理一个unicode.字符流 ...

  6. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

  7. Java IO系统--字符流

    字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ...

  8. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

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

  9. Java——IO类 字符流概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  10. Java IO(四--字符流基本使用

    在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable { ...

随机推荐

  1. 十一个行为模式之迭代器模式(Iterator Pattern)

    定义: 提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示.使得存储和遍历两个职责相互分离,提高系统的可扩展性. 结构图: Iterator:抽象迭代器类,定义了访问和遍历元素的接口,例如:ne ...

  2. SDK的制作详解

    一个简单的SDK制作是很容易的,复杂的sdk其实就和复杂化的应用一样,都是从简单开始的,这里介绍一下sdk的简单制作 步骤: 1.创建sdk,公开文件 2.编译.获取sdk文件 3.导入工程,配置文件 ...

  3. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

  4. js实现动态操作table

     本章案例为通过js,动态操作table,实现在单页面进行增删改查的操作. 简要案例如下: <%@ page language="java" contentType=&quo ...

  5. SSRS Reports 2008性能优化案例

    我们的一个Reporting Service服务上部署了比较多的SSRS报表,其中有一个系统的SSRS报表部署后,执行时间相对较长,加之供应商又在ASP.NET页面里面嵌套了Reporting Ser ...

  6. YourSQLDba 配置——修改备份路径

    公司一直使用YourSQLDba做本地备份,磁带机将本地备份文件上带做异地容灾备份.近期整理.验证备份时发现本地备份目录命名五花八门 其中有历史原因,也有无规划化的缘故,看着这些五花八门的目录,越看越 ...

  7. Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5

    案例描述 昨晚踢球回来,接到电话说一个系统的几个比较重要作业出错,导致系统数据有些问题.让我赶紧检查看看.检查作业日志时发现,作业报如下错误(关键信息用xxx替换) The job failed.  ...

  8. Java 堆

    特性: 虚拟机启动时创建的线程共享的内存区域,所有实例对象和数组对象分配内存的区域 GC垃圾手机管理器管理的主要区域,GC堆 容量可以固定,也可以动态扩展,自动收缩 -Xmx最大堆大小 -Xms最小. ...

  9. 基于Ajax+div的“左边菜单、右边内容”页面效果实现

    效果演示: ①默认页面(index.jsp): ②:点击左侧 用户管理 标签下的 用户列表 选项后,右边默认页面内容更新为用户列表页(userList.jsp)的内容 : ③:同理,点击 产品管理.订 ...

  10. 使用Docker快速部署Storm环境

    Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择.下面是我开源的一个新的项目,一个配置好了storm与mono环境的D ...