字符流
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
分享到:
相关推荐
字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流...
java字符流最适合用来处理字符串和文本.以一个学生成绩管理系统开发过程中的输入、显示、排序等操作为例,说明java字符流类在管理系统中的应用.java字符流使系统的功能得到了完整的实现,同时,程序具有了很强的灵活性...
java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流
Java中的字节流处理的基本单位为单个字节,它通常用来处理二进制数据。Java中基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与OutputStream类均...
对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,...),使用字节流处理 2.数据的流向:输入流、输出流 3.流的角色:节点流、处理流 节点流:直接从数据...
字符流:按照字符读取数据(Reader、Writer) 功能不同: 节点流:可以直接从数据源或目的地读写数据。 处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。 节点流和处理流的...
一、 流的分类 • 按数据流动方向 – 输入流:只能从中读取字节数据,而不能向其写出...– 字符流:用于处理Unicode字符数据。 • 按照流所处理的源 – 节点流:从/向一个特定的IO设备读/写数据的流。(低级流) – 处理
• 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型 的数据。 结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。 输入流和输出流 对输入流只能...
JAVA转义字符
字符流的分类①节点流②处理流③流的使用一般步骤④流的关闭字符流具体使用Ⅰ文件流①从文件中读取字符①将字符写入文件Ⅱ字符串流Ⅲ字符数组流Ⅳ缓冲流Ⅴ转换流Ⅵ字符打印流最后 前言 今天带来的是JAVA的IO流中的...
Reader BufferedReader LineNumberReader CharArrayReader FilterReader PushbackReader InputStreamReader FileReader PipedReader StringReader
java 工具包 集合 网络 图像 流 字符串 时间 文件 处理工具
完整版精品java课件 Java基础入门教程 Java程序设计 第7章 字符串处理(共38页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第8章 异常处理(共27页).ppt 完整版精品java课件 Java基础入门教程 Java...
java io 流的介绍 字节流 字符流 处理流
下面小编就为大家带来一篇java编程中字节流转换成字符流的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。 结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。 输入流和输出流 对输入流只能进行...
流可以根据数据单位分为字节流和字符流,根据数据流方向分为输入流和输出流,根据功能分为字节流和处理流,节点流直接从文件中读取或写入字节流,处理流对已存在的流(节点流和处理流)通过对数据的处理为程序提供更...
javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...
import java.io.*; /** * FileUtil. Simple file operation class. * * @author BeanSoft * */ public class FileUtil { /** * The buffer. */ protected static byte buf[] = new byte[1024]; /**...