`
=死神=
  • 浏览: 57988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 字符流处理1

    博客分类:
  • Java
阅读更多

字符流

 

      java.io.Reader、java.io.Writer与其子类等是处理字符流(Character Stream)的相关类。简单地说,就是对流数据以一个字符(两个字节)的长度为单位来处理(0~65 535、0x0000~0xffff),并进行适当的字符编码转换处理,即Reader、Writer与其子类可以用于进行所谓纯文本文件的字符读/写

 

1 Reader和Writer

 

    java.io.Reader和java.io.Writer支持Unicode标准字符集(Character Set)(字节流则只支持ISO-Latin-1 8-bit)。在处理流数据时,会根据系统默认的字符编码来进行字符转换,Reader和Writer是抽象类,在进行文本文件的字符读写时真正会使用其子类,子类通常会重新定义相关的方法

 

    使用Reader的子类 java.io.InputStreamReader来转换读入的两个字节为中文字符,并显示在屏幕上

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PushbackInputStream;

public class ReaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			PushbackInputStream pushbackInputStream = new PushbackInputStream(
					new FileInputStream(args[0]));
			byte[] array = new byte[2];

			ByteArrayInputStream byteArrayStream = new ByteArrayInputStream(
					array);
			// reader会从已读的位数组中取出数据
			InputStreamReader reader = new InputStreamReader(byteArrayStream);

			int tmp = 0;
			int count = 0;
			while ((count = pushbackInputStream.read(array)) != -1) {
				// 两个字节转换为整数
				tmp = (short) ((array[0] << 8) | array[1] & 0xFF);
				tmp = tmp & 0xFFFF;
				// 判断是否为BIG5,如果是则显示BIG5中文字
				if (tmp >= 0xA440 && tmp < 0xFFFF) {
					System.out.println("BIG5:" + (char) reader.read());
					// 重置ArrayInputStream的读取光标
					// 下次reader才会重头读取数据
					byteArrayStream.reset();
				} else {
					if (count == 2) {
						pushbackInputStream.unread(array, 1, 1);
					}
					System.out.println("ASSCII:" + (char) array[0]);
				}
			}
			pushbackInputStream.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

     对于范例要注意的是Reader的read()方法,该方法每次会读入一个字符的数据,并以系统默认的编码作字符转换,然后以int类型返回。也可以直接在构建Reader的实例时,自行指定读取时的编码。例如:

InputStreamReader reader =
         new InputStreamReader(byteArrayStream, "BIG5");

 

2、InputStreamReader和OutputStreamWriter

 

     若想对InputStream和OutputStream进行字符处理,可以使用java.io.InputStreamReader和java.io.OutputStreamWriter为其加上字符处理的功能,它们分别为Reader和Writer的子类

 

     举个例子来说,若想要显示纯文本文件的内容,不 用费心地自行判断字符编码(例如范例14.15中要费心地自行判断是ASCII英文字母或BIG5中文字),只要将InputStream、 OutputStream的实例作为构建InputStreamReader、OutputStreamWriter时的变量,就可以操作 InputStreamReader和OutputStreamWriter来进行文本文件的读取,让它们为您做字符判断与转换的动作

 

     范例可以打开一个纯文本文件,显示其中的字符内容。为了示范OutputStreamWriter的功能,范例会将文本文件复制为另一个文本文件“D:\\backup_abc.txt”。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class StreamReaderWriterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			FileInputStream fileInputStream = new FileInputStream(args[0]);
			// 为FileInputStream加上字符串处理功能
			InputStreamReader inputStreamReader = new InputStreamReader(
					fileInputStream);
			FileOutputStream fileOutputStream = new FileOutputStream("D:\\backup_abc.txt");
			// 为FileOutputStream加上字符串处理功能
			OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
					fileOutputStream);

			int ch = 0;
			// 以字符方式显示文件内容

			while ((ch = inputStreamReader.read()) != -1) {
				System.out.println((char) ch);
				outputStreamWriter.write(ch);
			}
			System.out.println();

			inputStreamReader.close();
			outputStreamWriter.close();

		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

      在这里使用FileInputStream、 FileOutputStream,但InputStreamReader、 OutputStreamWriter可以分别以任何InputStream、OutputStream子类的实例作为构建对象时的变量。之前提过, InputStreamReader、OutputStreamWriter在存取时是以系统的默认字符编码来进行字符转换,也可以自行指定字符编码。例 如指定读取文件时的字符编码为BIG5

InputStreamReader inputStreamReader =
         new InputStreamReader(fileInputStream, "BIG5");

 

关于可设置的编码,可以参考支持的编码(Supported Encodings):

http://java.sun.com/javase/6/docs/technotes/guides/intl/encoding.doc.html 

 

3、FileReader和FileWriter

如果想要存取的是一个文本文件,可以直接使用 java.io.FileReader和java.io.FileWriter类,它们分别继承自InputStreamReader与 OutputStreamWriter。可以直接指定文件名称或File对象来打开指定的文本文件,并读入流转换后的字符,字符的转换会根据系统默认的编 码(若要指定编码,则还是使用InputStreamReader与OutputStreamWriter)。

 

FileReader和FileWriter的 使用非常简单,下面举个例子。在Linux下编写的文本文件,其断行字符是\n,而在Windows下编写的文本文件其断行是\r与\n两个连续字符。如 果在Windows下使用记事本打开一个Linux下编写的文本文件,其在显示上并不会有断行的效果,且\n字符会被用一个黑色方块来显示。

 

范例一个简单的程序,可以读入Linux下编写的文本文件,再写入另一个文件。在读取过程中若遇到\n字符,就取代为\r与\n两个连续字符,这样新的文件在Windows的记事本程序中,就可以有断行显示的效果。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReaderWriterDemo {

	public static void main(String args[]) {
		try {
			FileReader fileReader = new FileReader(args[0]);

			FileWriter fileWriter = new FileWriter(args[0] + ".txt");

			int in = 0;
			char[] wlnChar = { '\r', '\n' };

			while ((in = fileReader.read()) != -1) {
				if (in == '\n') {
					// 写入"\r\n"
					fileWriter.write(wlnChar);
				} else {
					fileWriter.write(in);
				}
			}

			fileReader.close();
			fileWriter.close();

		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("请指定文件");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

 

4、BufferedReader和BufferedWriter

       java.io.BufferedReader 与java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入 字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用 BufferedWriter时,写入的数据并不会先输出至目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。例如一个 文件,通过缓冲区可减少对硬盘的输入/输出动作,以提高文件存取的效率。

 

       之前在介绍取得用户输入时,就使用过 BufferedReader。从标准输入流System.in中直接读取用户输入时,用户每输入一个字符,System.in就读取一个字符。为了能一 次读取一行用户的输入,使用了BufferedReader来对用户输入的字符进行缓冲。readLine()方法会在读取到用户的换行字符时,再一次将 整行字符串传入

 

       System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能

BufferedReader reader =
      new BufferedReader(new InputStreamReader(System.in));

 

可以在文字模式下输入字符,程序会将输入的文字存储至指定的文件中,如果要结束程序,输入quit字符串即可。

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

public class BufferedReaderWriterDemo {

	public static void main(String args[]) {
		try {
			// 缓冲System.in输入流
			BufferedReader bufReader = new BufferedReader(
					new InputStreamReader(System.in));

			// 缓冲FileWriter字符输入流
			BufferedWriter bufwriter = new BufferedWriter(new FileWriter(
					args[0]));
			String input = null;

			// 每读一次进行一次写入动作
			while (!(input = bufReader.readLine()).equals("quit")) {
				bufwriter.write(input);
				// newline()方法写入与操作系统相依的换行字符
				bufwriter.newLine();
			}
			bufwriter.flush();
			bufwriter.close();

		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("没有找到指定文件");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

 

由于换行字符依操作系统不同而有所区别,在Windows下是\r\n,在Linux下是\n,在Mac OS下是\r,您可以使用newLine()方法,由执行环境依当时的操作系统决定该输出哪一种换行字符

 

源文件地址:http://hi.baidu.com/mdbing/blog/item/7c532a4e535ed3cfd1c86ac4.html

分享到:
评论
1 楼 i18n 2008-09-28  
我不知道有了FileReader和FileWriter之后为什么还要有InputStreamReader
和OutputStreamReader,直接用前面两个不是更方便?

相关推荐

    Java字符流与字节流区别

    字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流...

    java 字符流 讲解

    Java字符流讲解 Java语言中的数据流主要用于处理数据的输入和输出,特别是在处理文件操作时。数据流可以分为字节流(Byte Stream)和字符流(Character Stream)。本讲解主要聚焦于字符流,它是Java IO体系中处理...

    Java字符流和字节流

    ### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...

    java字符流操作

    Java字符流操作是Java IO API中的重要组成部分,主要用于处理文本数据,支持各种编码格式的文件读写。在Java中,字符流分为输入流(InputStreamReader、BufferedReader)和输出流(OutputStreamWriter、PrintWriter...

    JAVA 字符流与字节流

    1. **数据单位**:字节流处理的是字节,字符流处理的是字符。 2. **编码**:字节流不关心数据的编码,而字符流必须指定字符集编码,以确保正确地读写文本数据。 3. **性能**:字符流的性能通常比字节流慢,因为它...

    JAVA字符流加密实验代码报告

    2. **字节流与字符流**:字节流处理原始的8位字节数据,而字符流处理16位的Unicode字符。在文件复制等操作中,字符流更适用于文本文件,因为它可以自动处理字符编码转换。 3. **文件操作**:实验要求能够创建、读写...

    java字节流和字符流

    字节流处理的数据单位是字节,而字符流处理的是Unicode字符。 字节流: 字节流主要由两个核心类构成:`InputStream`和`OutputStream`。`InputStream`作为所有字节输入流的基类,提供了读取字节数据的基本方法。例如...

    java字节流和字符流[整理].pdf

    字符流:字符流处理的是Unicode编码的字符,因此一个字符可能占用2个字节。Writer是字符输出流的顶级抽象类,它提供了向字符输出流写入字符的方法。例如,我们可以使用PrintWriter类来方便地输出文本内容: ```java...

    Java 字符流 ATM小程序

    此程序利用Java字符流处理技术来实现一个简单的ATM机模拟系统。该系统主要包括用户登录、注册以及退出等功能,并通过文件读写操作来持久化存储用户数据。下面我们将逐一分析程序中涉及到的关键技术点。 ### 关键...

    用Java字符流类实现数据操作.pdf

    字符流处理数据的基本单位是Unicode字符,相较于字节流,字符流更适合处理文本数据,因为Java语言本身采用Unicode编码,能更好地支持多语言和特殊字符。 字符流的主要子类包括: 1. `FileReader`和`FileWriter`:...

    java字符流练习-电话本管理系统

    Java字符流是Java IO系统的重要组成部分,主要用于处理文本数据。在这个名为"java字符流练习-电话本管理系统"的项目中,开发者使用了Java的字符流API来实现一个电话本管理的功能。电话本管理系统通常包括添加联系人...

    Java字符流.pdf

    ### Java字符流详解 #### 一、概述 Java中的字符流是一种高级的输入输出机制,主要用于处理文本数据。与字节流不同,字符流处理的基本单位是字符而非字节,因此更加适合处理文本数据。字符流是基于Unicode标准设计...

    Java IO字符流和字节流

    字符流处理的数据单位是字符(16位),通常用于处理纯文本数据。Java中的`Reader`和`Writer`是所有字符流的基类。 - **`Reader`**:用于从源设备读取字符数据。 - **`Writer`**:用于向目标设备写入字符数据。 ###...

    Java IO 字节流 字符流

    字节流主要用于处理任何类型的原始数据,如图片、音频文件或者二进制文件,而字符流则专注于处理基于文本的数据。本文将深入探讨这两类流的原理、用途以及它们之间的关联。 首先,我们来看字节流。字节流由...

    Java字节流与字符流的介绍.pdf

    Java 字节流与字符流的介绍 Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流...Java 的流操作分为字节流和字符流两种,字节流是最基本的,字符流是为了处理字符而提出来的。

    Java学习IO流小结--字符流

    IO流是Java语言中处理输入/输出的重要工具,它包括字节流和字符流两大类。本文将重点讨论字符流的相关概念及其用法。 #### 字符流简介 字符流主要用来处理文本数据,它是以字符为单位进行读写的流。字符流分为字符...

    javaIO字符流文件写入总结共1页.pdf.zip

    字符流处理单个字符,适合处理基于字符编码(如UTF-8、GBK等)的文本文件。本篇将深入探讨Java IO中的字符流以及如何进行文件写入。 1. **字符流的概念** - 字符流是Java对文本数据进行处理的一种方式,分为输入流...

    JAVA_字节流和字符流

    在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。字节流主要用于处理任何类型的二进制数据,如图片、音频、视频等,而字符流则专为处理基于Unicode编码的...

    JAVA范例 七)输入/输出流---字符流

    首先,我们理解一下标题中的“字符流”:在Java中,字符流主要用于处理字符数据,如文本文件,它提供了对单个字符的读写操作。 字符流分为两种基本类型:`Reader`和`Writer`。`Reader`类是所有字符输入流的抽象基类...

    java零基础自学 之 JavaIO流处理

    字符流处理Unicode字符,适用于文本文件;字节流处理8位的字节,适用于二进制文件,如图片、音频等。 2. **IO类的分类** Java的IO类主要分为两大类:字符流(Reader和Writer)和字节流(InputStream和OutputStream...

Global site tag (gtag.js) - Google Analytics