`
=死神=
  • 浏览: 56818 次
  • 性别: 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字符流类实现数据操作.pdf

    java字符流最适合用来处理字符串和文本.以一个学生成绩管理系统开发过程中的输入、显示、排序等操作为例,说明java字符流类在管理系统中的应用.java字符流使系统的功能得到了完整的实现,同时,程序具有了很强的灵活性...

    java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流

    java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流

    理解Java中字符流与字节流的区别

     Java中的字节流处理的基本单位为单个字节,它通常用来处理二进制数据。Java中基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与OutputStream类均...

    java IO流总结.md

    对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理 2.数据的流向:输入流、输出流 3.流的角色:节点流、处理流 节点流:直接从数据...

    JAVA IO流技术

    字符流:按照字符读取数据(Reader、Writer) 功能不同: 节点流:可以直接从数据源或目的地读写数据。 处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。 节点流和处理流的...

    Java流(文件读写操作)

    一、 流的分类 • 按数据流动方向 – 输入流:只能从中读取字节数据,而不能向其写出...– 字符流:用于处理Unicode字符数据。 • 按照流所处理的源 – 节点流:从/向一个特定的IO设备读/写数据的流。(低级流) – 处理

    Java流总结

    • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型 的数据。 结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。 输入流和输出流 对输入流只能...

    JAVA转义字符

    JAVA转义字符

    Java中的IO流(二)字符流的常用操作

    字符流的分类①节点流②处理流③流的使用一般步骤④流的关闭字符流具体使用Ⅰ文件流①从文件中读取字符①将字符写入文件Ⅱ字符串流Ⅲ字符数组流Ⅳ缓冲流Ⅴ转换流Ⅵ字符打印流最后 前言 今天带来的是JAVA的IO流中的...

    java字节流 字符流学习

    Reader BufferedReader LineNumberReader CharArrayReader FilterReader PushbackReader InputStreamReader FileReader PipedReader StringReader

    java 工具包 集合 网络 图像 流 字符串 时间 文件 处理工具

    java 工具包 集合 网络 图像 流 字符串 时间 文件 处理工具

    完整版精品java课件 Java基础入门教程 Java程序设计 第7章 字符串处理(共38页).ppt

    完整版精品java课件 Java基础入门教程 Java程序设计 第7章 字符串处理(共38页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第8章 异常处理(共27页).ppt 完整版精品java课件 Java基础入门教程 Java...

    java_io 流介绍

    java io 流的介绍 字节流 字符流 处理流

    java编程中字节流转换成字符流的实现方法

    下面小编就为大家带来一篇java编程中字节流转换成字符流的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java IO流的很简单的介绍

    流可以根据数据单位分为字节流和字符流,根据数据流方向分为输入流和输出流,根据功能分为字节流和处理流,节点流直接从文件中读取或写入字节流,处理流对已存在的流(节点流和处理流)通过对数据的处理为程序提供更...

    Java之IO流学习总结

    处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。 结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。 输入流和输出流 对输入流只能进行...

    Java2实用教程提取码

    第2章 标识符、关键字和数据类型 第3章 运算符、表达式和语句 第4章 类、对象和接口 第5章 字符串 第6章 时间、日期和数字 第7章 AWT组件及事件处理 第8章 建立对话框 第9章 Java多线程机制 第10章 输入输出流 第11...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

Global site tag (gtag.js) - Google Analytics