您的位置:首页 > 编程语言 > Java开发

java基础教程之IO使用二

2009-09-17 11:57 429 查看
1. 字符流的说明及操作字符流的类
InputStream类和OutputStream类适合于读写字节流,但对于字符流却不像
操作字节流那么可以胜任,比如说用来汉字时很容易出现乱码。
在JAVA中使用Unicode编码来表示字符或字符串,Unicode所有编码都是两个字节,如一个汉字就是两个字节。
Reader、Writer这两个抽象类用来读写字符流,分别对应于InputStream和OutputStream。
2. Reader和Writer的类层次



3. InputStreamReader类和BufferedReader类
InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset
读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。
BufferedReader类从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
4. OutputStreamWriter类和BufferedWriter类
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset
将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换
器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到
BufferedWriter 中,以避免频繁调用转换器。
BufferedWriter类将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
在处理大块数据的情况下,BufferedReader和BufferedWriter提供了高效率的操作。
现在使用这些类编写实例:
import java.io.*;
public class FileTest {
public static void main(String[] args) throws Exception{
File f1 = new File("FileTest.java");
File f2 = new File("1.txt");
FileInputStream input = new FileInputStream(f1);
FileOutputStream output = new FileOutputStream(f2);
//从字节到字符的转换
InputStreamReader inputReader = new InputStreamReader(input);
//从字符到字节的转换
OutputStreamWriter outputWriter = new OutputStreamWriter(output);
BufferedReader bufferReader = new BufferedReader(inputReader);
BufferedWriter bufferWriter = new BufferedWriter(outputWriter);
String buffer = null;
while((buffer=bufferReader.readLine())!=null){
System.out.println(buffer);
bufferWriter.write(buffer);
}
inputReader.close();
bufferWriter.close();
}
}
5. 常见字符集编码及相关类
5.1. 常见字符集编码
Ø ASCII码
Ø GB2312
Ø GBK
Ø ISO-8859-1
Ø Unicode
Ø UTF-8
5.2. Charset类
Charset类:16 位的 Unicode 代码单元序列和字节序列之间的指定映射关
系。此类定义了用于创建解码器和编码器以及获取与 charset 关联的各种名称的方法。此类的实例是不可变的。
此类也定义了用于测试是否支持特定 charset 的静态方法、通过名称查找
charset 实例的静态方法,以及构造一个包含目前 Java 虚拟机支持的每个 charset 的映射静态方法。通过类 CharsetProvider 中定义的服务提供者接口可以添加对新 charset 的支持。
实例如下:
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class FileTest {
public static void main(String[] args) throws Exception{
Map map = Charset.availableCharsets();
Set set = map.keySet();
Iterator ite = set.iterator();
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
编译结果是打印出系统运行机子所支持的所有编码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: