JavaSE第九十四讲:Java字符流详解

    在前面所讲的内容基本上是基于字节流来讲的,Java的I/O系统的另外一部分内容就是字符流,字符流是基于字节流来实现的,所以在前面字节流基础稳扎的情况下学习这部分内容相对来比较轻松。

1. 字符流

 尽管字节流提供了处理任何类型输入/输出操作的足够的功能,它们不能直接操作Unicode字符。既然Java的一个主要目的是支持“只写一次,到处运行”的哲学,包括直接的字符输入/输出支持是必要的。本节将讨论几个字符输入/输出类。字符流层次结构的顶层是Reader 和Writer 抽象类。我们将从它们开始。

[之所出现Unicode字符,是因为表示世界上所有语言的字符,早期的时候使用的ASCII码,但是这个种表示方式表示英文尚可,表示东亚的一些语言的字符效率就是很低下的,所以就引入了Unicode字符,Java中采用的就是Unicode的字符,Unicode很好的支持了中文汉字,一个Unicode表示2个字节,1个汉字也表示2个字节,所以Unicode不能按字节来读取的,这样会出现读取异常。Java程序语言使用Unicode来表示字符串和字符, Unicode使用两个字节来表示一个字符,即一个字符占16位]

查看Reader 和 writer类以及它们各自的构造方法和方法

其中writer类的write(char[] cbuf)方法可以看出它是接受char[]类型的参数,因为它是字符流,处理的是字符类型。

2. 字符流Reader和Writer类

1)由于Java采用16位的Unicode字符,因此需要基于字符的输入/输出操作。从Java1.1版开始,加入了专门处理字符流的抽象类Reader和Writer,前者用于处理输入,后者用于处理输出。这两个类类似于InputStream和OuputStream,也只是提供一些用于字符流的规定,本身不能用来生成对象。

2)Reader和Writer类也有较多的子类,与字节流类似,它们用来创建具体的字符流对象进行I/O操作。字符流的读写等方法与字节流的相应方法都很类似,但读写对象使用的是字符

3) Java.io包中Reader的类层次

4)Java.io包中的Writer的类层次

注意字符类中的类层次也是支持装饰模式的:比如说FilterWriter就是过滤流

3. InputStreamRead和 OutputStreamWriter重要

这是java.io包中用于处理字符流的基本类,用来在字节流和字符流之间搭一座“桥”。这里字节流的编码规范与具体的平台有关,可以在构造流对象时指定规范,也可以使用当前平台的缺省规范

查看JDKDoc文档查找这两个类,并且以及它们各自的说明

public class InputStreamReader extends Reader
    An InputStreamReader is a bridge from byte streams to character streams:It reads bytes and decodes them into characters using a specifiedcharset.

[它是从字节流转向字符流的桥梁,也就是它可以通过InputStreamReader将字节的信息装换成字符。注意这边前提是要读取的那个字节信息对于的必须是字符串,如果是一个二进制的信息读取过来就是乱码了。它会读取这些字节,同时使用指定的编码将他们装换成一个字符集] 

InputStreamRead继承自Reader,所以它是一个字符

1) InputStreamReader和OutputStreamWriter类的主要构造方法如下

public InputSteamReader(InputSteam in)[从字节流读,化为字符]
public InputSteamReader(InputSteam in,String enc)
public OutputStreamWriter(OutputStream out) [将字符信息写到字节流里面]
public OutputStreamWriter(OutputStream out,String enc)

其中in和out分别为输入和输出字节流对象,enc为指定的编码规范(若无此参数,表示使用当前平台的缺省规范,可用getEncoding()方法得到当前字符流所用的编码方式)。

2) 读写字符的方法read()、write(),关闭流的方法close()等与Reader和Writer类的同名方法用法都是类似的。

3) 程序Demo如下所示:

package com.ahuier.io2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class StreamTest {
	public static void main(String[] args) throws Exception {
		FileOutputStream fos = new FileOutputStream("file.txt");
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		BufferedWriter bw = new BufferedWriter(osw);

		/*
		 * 查看BufferedWriter父类Writer(String str)方法,直接介绍字符串
		 * 将这个字符串转换成字节流用缓冲的形式写到文件file.txt中
		 */
		bw.write("http://www.google.com");
		bw.write("\n");
		bw.write("http://www.baidu.com");
		bw.close();

		// 从文件中读取用字节流装换成字符流的方式
		/*
		 * FileInputStream fis = new FileInputStream("file.txt");
		 * InputStreamReader isr = new InputStreamReader(fis); BufferedReader br
		 * = new BufferedReader(isr);
		 */

		BufferedReader br = new BufferedReader(new InputStreamReader(
				new FileInputStream("file.txt")));
		
		//readLine()方法一次读取一行,如果这一行为空返回null
		String str = br.readLine();
		while(null != str){
			System.out.println(str);
			str = br.readLine();
		}
		br.close();
	}
}

编译执行结果 ,在工程目录下生成了file.txt文件

http://www.google.com
http://www.baidu.com

4. Java程序中的标准输入和标准输出流

平时我们经常所写的标准输出流语句: System.out.println();下面我们就来剖析一下这行代码

查看JDK 文档System类,它的构造方法如下:

out是PrintStream类型的,继续跟踪PrintStream,可以发现它继承OutputStream,所以它也是一个过滤流。

程序Demo:标准输入的字符串显示在标准输出上

标准的输出设备一般是值程序编译后中的命令行,标准的输入设备是键盘,从键盘中介绍信息。

package com.ahuier.io2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class StreamTest2 {
	public static void main(String[] args) throws Exception {
		 InputStreamReader isr = new InputStreamReader(System.in);
		 BufferedReader br = new BufferedReader(isr);
		 String str;
		 while(null != (str = br.readLine())){
			 System.out.println(str);	 
		 }
		 br.close();
	}
}

编译执行后在命令行中输入字符串回车就会打印出来。

5. FileReader

1) FileReader类创建了一个可以读取文件内容的Reader类。FileReader继承于InputStreamReader。它最常用的构造方法显示如下

FileReader(String filePath)
FileReader(File fileObj)
每一个都能引发一个FileNotFoundException异常。这里,filePath是一个文件的完整路径,fileObj是描述该文件的File对象

2) 演示怎样从一个文件逐行读取并把它输出到标准输出流。例子读它自己的源文件。

程序Demo如下:

package com.ahuier.io2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class FileReader1 {
	public static void main(String[] args) throws Exception {
		FileReader fr = new FileReader("c:/FileReader1.java");
		BufferedReader br = new BufferedReader(fr);
		String str;
		while(null != (str = br.readLine())){
			System.out.println(str);
		}
		br.close();
		
	}
}

编译执行结果,输出源文件本身,注意绝对路径有这个文件哦。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值