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

Java 字符流处理2

    博客分类:
  • Java
阅读更多

PrintWriter

       java.io.PrintWriter在功能上与PrintStream类似,除了接受OutputStream实例作为变量之外, PrintWriter还可以接受Writer对象作为输出的对象。当原先是使用Writer对象在作字符处理,而现在想要套用println()之类的 方法时,使用PrintWriter会是比较方便的作法

 

范例显示了PrintStream与PrintWriter两个对象在处理相同输出目的时的作法,程序会输出简体中文GB2312编码的文字至指定的文件中

 

 

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;

public class StreamWriterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// "简体中文"四个字的GB2312编码
			byte[] sim = { (byte) 0xbc, (byte) 0xf2, (byte) 0xcc, (byte) 0xe5,
					(byte) 0xd6, (byte) 0xd0, (byte) 0xce, (byte) 0xc4 };
			// 数组作为流来源
			ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
					sim);
			InputStreamReader inputStreamReader = new InputStreamReader(
					byteArrayInputStream, "GB2312");

			// PrintWriter还接受writer实例作为变量
			PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
					new FileOutputStream(args[0]), "GB2312"));

			int in = 0;
			printWriter.print("PrintWriter:");

			// 写入数组内容
			while ((in = inputStreamReader.read()) != -1) {
				printWriter.print((char) in);
			}

			printWriter.println();
			printWriter.close();

			byteArrayInputStream.reset();

			// PrintWriter 接受OutpuStream实例作为变量
			PrintStream printStream = new PrintStream(new FileOutputStream(
					args[0], true), true, "GB2312");

			printStream.print("PrintStream:");
			// 写入数组数据
			while ((in = inputStreamReader.read()) != -1) {
				printStream.print((char) in);
			}

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

}

 

 

CharArrayReader和CharArrayWriter

         java.io.CharArrayReader与java.io.CharArrayWriter,使用它们可以将字符数组当作字符数据输出或输入的来源。

 

         举个应用的例子,通常您很少会对文本文件进行随机存取的动作,因为要与ASCII兼容,一个文本文件中可能会有ASCII与非西欧语系的双字节字符。也就是说,在文本文件中,英文字符与中文字符的长度不一定相同,对文本文件进行随机存取容易发生错误

 

       由于Java中的字符是Unicode字符,通过这个特性,可以将文本文件的内容读入字符数组,对字符数组作随机存取,然后再将之写回文件。这样对于文本文件也可以达到类似随机存取的功能

 

      范例可以打开一个简单的文本文件,其中有简单的英文与中文字符。在读取文件之后,可以直接以程序来指定文本文件的字符位置,以修改所指定的字符。程序的作法是将字符读入字符数组中,修改指定索引处的数组元素。在修改完数组内容之后,重新将字符数组存回文件

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class CharArrayReaderWriterDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			File file = new File(args[0]);
			BufferedReader bufInputReader = new BufferedReader(new FileReader(
					file));
			// 将文件读入字符数组
			CharArrayWriter charArrayWriter = new CharArrayWriter();
			char[] array = new char[1];
			while (bufInputReader.read(array) != -1) {
				charArrayWriter.write(array);
			}

			charArrayWriter.close();

			bufInputReader.close();

			// 显示字符数组内容
			array = charArrayWriter.toCharArray();
			for (int i = 0; i < array.length; i++)
				System.out.println(array[i] + " ");

			System.out.println();
			// 让用户输入位置与字符修改内容
			Scanner scanner = new Scanner(System.in);

			System.out.print("输入修改位置:");
			int pos = scanner.nextInt();

			System.out.print("输入修改字符:");
			char ch = scanner.next().charAt(0);

			array[pos - 1] = ch;

			// 将字符数内容存回文件
			CharArrayReader charArrayReader = new CharArrayReader(array);

			BufferedWriter bufwriter = new BufferedWriter(new FileWriter(
					args[0]));
			char[] tmp = new char[1];

			while (charArrayReader.read(tmp) != -1) {
				bufwriter.write(tmp);
			}

			charArrayReader.close();
			bufwriter.flush();
			bufwriter.close();

		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("文件未找到");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

 

PushbackReader

      

       PushbackReader拥有一个PushBack缓冲区,只不过PushbackReader所处理的是 字符。从这个对象读出数据后,如果愿意的话,只要PushBack缓冲区没有满,就可以使用unread()将数据推回流的前端

 

      范例可以将文本文件中的一些数学符号:<、>、<=、>=、!=、=转换为BIG5码中的<、>、≦、≧、≠、=等全角符号并另存新文件

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

public class PushbackReaderDemo {

	public static void main(String args[]) {
		char[] symbols = { '<', '>', '≦', '≧', '≠', '=' };
		try {
			PushbackReader pushbackReader = new PushbackReader(new FileReader(
					args[0]));
			FileWriter fileWriter = new FileWriter("D:\\math_abc.txt");

			int c = 0;
			while ((c = pushbackReader.read()) != -1) {
				int poss = -1;
				switch (c) {
				case '<':
					poss = 0;
					break;
				case '>':
					poss = 1;
					break;
				case '!':
					poss = 2;
					break;
				case '=':
					poss = 5;
					break;
				default:
					fileWriter.write(c);
				}

				if (poss != -1) {
					if ((c = pushbackReader.read()) == '=') {
						fileWriter.write(symbols[poss + 2]);
					} else {
						pushbackReader.unread(c);
						fileWriter.write(symbols[poss]);
					}
				}
			}
			pushbackReader.close();
			fileWriter.close();
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("指定文件");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

分享到:
评论

相关推荐

    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 字节流 字符流

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

    Java IO字符流和字节流

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

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

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

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

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

    JAVA_字节流和字符流

    2. **字符流**: - 字符流主要处理文本数据,基于Unicode字符集,分为`Reader`和`Writer`接口。`InputStreamReader`和`OutputStreamWriter`是字节流与字符流之间的桥梁。 - 常用的字符流类包括`FileReader`和`...

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

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

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    - 字符流处理的是16位的Unicode字符,适用于处理文本数据。`Reader`和`Writer`是所有字符输入流和输出流的基类。 - 示例:`BufferedReader`和`BufferedWriter`提供了缓冲功能,提高读写效率;` FileReader`和`...

    java零基础自学 之 JavaIO流处理

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

Global site tag (gtag.js) - Google Analytics