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提供了高效率的操作。
现在使用这些类编写实例:
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 的支持。
实例如下:
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.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()); } } } 编译结果是打印出系统运行机子所支持的所有编码 |
相关文章推荐
- java基础教程之IO使用一
- java Vamei快速教程15 IO基础
- Java基础—IO小结(二)缓冲流与其它流的使用
- 【深入Java基础】Java IO 使用
- java数字图像处理基础使用imageio写图像文件示例
- Java基础学习总结(39)——Log4j 1使用教程
- Java基础学习总结(42)——Log4j 2使用教程
- Java Web基础教程四 ---------配置篇三mysql数据库的安装配置使用
- 使用Java进行FreeMarker的web模板开发的基础教程
- Java基础学习总结(39)——Log4j 1使用教程
- Java基础学习总结(42)——Log4j 2使用教程
- JAVA基础--IO输入输出(File使用)17
- 使用Java进行FreeMarker的web模板开发的基础教程
- Java基础学习总结(39)——Log4j 1使用教程
- Java基础学习总结(42)——Log4j 2使用教程
- java基础教程-流IO(五)
- Java自学之路-Java基础教程-32:Java写文件操作和IO输入输出流
- JAVA基础:使用缓冲IO提高Java程序性能
- Java自动化工具Ant的基础使用教程
- 推荐一篇java基础教程----Java IO