Java编程--IO流(Ⅲ 字符流)

Java编程--IO流(Ⅲ 字符流)

一 字符输出流Writer

Writer类是在JDK1.1之后增加的,其类的定义如下:

java.io
类 Writer

java.lang.Object

  java.io.Writer

所有已实现的接口: 

Closeable, Flushable, Appendable 

这个类又多实现了一个Appendable接口。这个接口定义如下:

java.lang
接口 Appendable

所有已知实现类: 

BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer 

Appendable接口里面定义了追加的操作,而且追加的数据都是字符或字符串。

Java编程--IO流(Ⅲ 字符流)_第1张图片

Writer类定义有以下方法:

输出全部字符数组:public void write(char[] cbuf) throws IOException

输出字符串:public void write(String str) throws IOException

Writer类最大的特征)

Writer是抽象类,若想实例化则应该用FileWriter子类。

【范例】使用Writer类实现内容输出。

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class Test {
	public static void main(String[] args) throws Exception {
		// 1.定义要输入文件的路径
		File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");

		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdir();
		}

		// 2.实例化Writer类的对象
		Writer w = new FileWriter(file);

		// 3.进行内容输出
		String s = "hello world\r\n";
		w.write(s); // 输出字符串数据

		// 4.关闭输出流
		w.close();
	}
}

结论:可以发现Writer作为字符输出流,可以直接进行字符串输出。


二 字符输入流Reader

Reader类是进行字符数据读取的输入流,其本身也是一个抽象类。

java.io
类 Reader

java.lang.Object

  java.io.Reader

所有已实现的接口: 

Closeable, Readable 

 Reader类里面也提供有一系列的read()方法:(没有返回字符串的方法)

读取内容到字符数组:public int read(char[] cbuf)

返回值:表示读取的数据长度,若读取到结尾返回-1

Reader类实例化可用FileReader子类完成:

【范例】使用Reader读取数据。

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class Test {
	public static void main(String[] args) throws Exception {
		// 1.定义要输入的文件的路径
		File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");
		if (file.exists()) {
			// 2.为Reader类对象实例化
			Reader in = new FileReader(file);
			// 3.进程数据读取
			char[] data = new char[1024];
			int len = in.read(data);
			// 4.关闭输入流
			in.close();
			System.out.println(new String(data, 0, len));
		}
	}
}

结论:与字节输入流相比结构几乎一样的,只是数据类型由byte更换为了char而已。


三 字节流与字符流区别

开发中到底该使用哪种,有什么区别?

字节流与字符流最大的区别是:字节流直接与终端进行数据交互,而字符流需要将数据经过缓冲区处理后才可以输出。

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class Test {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");

		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdir();
		}

		Writer w = new FileWriter(file);

		String s = "hello world\r\n";
		w.write(s); // 输出字符串数据

		// w.close();	//若没有释放,则不会在1.txt内容写入内容
	}
}

结论:在使用OutputStream输出数据时,即使最后没有关闭输出流,那么内容也能正常输出;繁殖,若使用的是字符输出流,不关闭表示在缓冲区之中,处理的内容不会被强制性清空,所以就不会输出数据。若现在有特殊情况不能关闭字符输出流,可以使用flush()方法强制清空缓冲区。

【范例】强制清空字符流缓冲区。

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;

public class Test {
	public static void main(String[] args) throws Exception {
		File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");

		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdir();
		}

		Writer w = new FileWriter(file);

		String s = "hello world\r\n";
		w.write(s); // 输出字符串数据

		w.flush(); // 强制清空缓冲区
		// w.close(); //若没有释放,则不会在1.txt内容写入内容
	}
}

字符流使用到缓冲区的最好的证据!

在开发中,对于字节数据处理是比较多的,例如:图片,音乐,电影,文字。而对于字符流最大的好处是它可以进行中文的有效处理

 

【注意】在日后的开发之中,若要处理中文优先考虑字符流,没有中文问题的话建议使用字节流。

 

总结

1. 字节流的输入及输出操作的代码必须掌握熟练;

OutputStream和InputStream类中的write()和read()方法必须掌握清楚。

2. 中文处理的时候强烈建议使用字符流。


你可能感兴趣的:(Java,Java编程)