`

OutputStreamWriter 源码分析

阅读更多
字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。

为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));


public class OutputStreamWriter extends Writer {
	// 流解码类,所有操作都交给它完成。
	private final StreamEncoder se;

	// 创建使用指定字符的OutputStreamWriter。
	public OutputStreamWriter(OutputStream out, String charsetName)
		throws UnsupportedEncodingException
	{
		super(out);
		if (charsetName == null)
			throw new NullPointerException("charsetName");
		se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
	}

	// 创建使用默认字符的OutputStreamWriter。
	public OutputStreamWriter(OutputStream out) {
		super(out);
		try {
			se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
		} catch (UnsupportedEncodingException e) {
			throw new Error(e);
		}
	}

	// 创建使用指定字符集的OutputStreamWriter。
	public OutputStreamWriter(OutputStream out, Charset cs) {
		super(out);
		if (cs == null)
			throw new NullPointerException("charset");
		se = StreamEncoder.forOutputStreamWriter(out, this, cs);
	}

	// 创建使用指定字符集编码器的OutputStreamWriter。
	public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
		super(out);
		if (enc == null)
			throw new NullPointerException("charset encoder");
		se = StreamEncoder.forOutputStreamWriter(out, this, enc);
	}

	// 返回该流使用的字符编码名。如果流已经关闭,则此方法可能返回 null。
	public String getEncoding() {
		return se.getEncoding();
	}

	// 刷新输出缓冲区到底层字节流,而不刷新字节流本身。该方法可以被PrintStream调用。
	void flushBuffer() throws IOException {
		se.flushBuffer();
	}

	// 写入单个字符
	public void write(int c) throws IOException {
		se.write(c);
	}

	// 写入字符数组的一部分
	public void write(char cbuf[], int off, int len) throws IOException {
		se.write(cbuf, off, len);
	}

	// 写入字符串的一部分
	public void write(String str, int off, int len) throws IOException {
		se.write(str, off, len);
	}

	// 刷新该流。
	public void flush() throws IOException {
		se.flush();
	}

	// 关闭该流。
	public void close() throws IOException {
		se.close();
	}
}
分享到:
评论

相关推荐

    Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理

    Java中的InputStreamReader和OutputStreamWriter源码分析 InputStreamReader是Java中用于将字节输入流转换成字符输入流的类,它继承自Reader类。下面是InputStreamReader的源码分析: 构造方法 InputStreamReader...

    Java BufferedWriter BufferedReader 源码分析

    源码分析通常会涉及这些方法的具体实现,包括如何管理缓冲区,何时从底层流读取数据,以及如何处理行结束符等。 综上所述,BufferedWriter和BufferedReader是Java IO流中的重要组件,它们通过内部缓冲机制提升了IO...

    java 写的字符编码转换工具(附带源码)

    7. **源码分析**:提供的源码可以作为学习和理解字符编码转换机制的一个实例。通过阅读源码,我们可以深入理解Java如何处理编码转换,以及如何设计和实现这样一个工具。 这个工具可能包含了一个命令行界面或者图形...

    Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理

    Java中的`FileReader`和`FileWriter`是用于读写文件的基本类,它们分别继承自`InputStreamReader`和`OutputStreamWriter`。这两个类是Java IO流模型中的字符流(Character Stream)部分,处理数据的方式是以字符为...

    Java Telnet客户端实例源码

    本文将详细讲解如何利用Java开发一个Telnet客户端,并提供相关源码分析。 首先,我们要了解Java中的Socket编程是实现Telnet客户端的基础。Java的`java.net.Socket`类提供了创建TCP连接的能力,而`java.io`包下的...

    安卓Android源码——开发 SD卡的使用.zip

    本篇将深入探讨在Android开发中,如何有效地利用SD卡,并提供相关的源码分析。 1. **权限设置** 在AndroidManifest.xml文件中,为应用添加读写SD卡的权限: ```xml ``` 自Android 6.0 (API level 23)开始,...

    android解决乱码

    本文将深入探讨如何在Android环境中解决乱码问题,同时也会涉及一些源码分析和实用工具的使用。 首先,我们需要了解编码的基础知识。在计算机世界中,字符的表示方式有多种,如ASCII、GBK、UTF-8等。这些编码方式...

    Android高级应用源码-Android应用源码安卓与PC的Socket通信项目java版.zip

    8. **源码分析**: 从提供的文件列表来看,"JavaApk源码说明.txt"很可能是项目源码的说明文档,提供关于如何编译和运行代码的指南。"javaapk.com_0000.png"和"javaapk.com_0001.png"可能是项目截图或流程图,帮助...

    Java-IO流基础例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar

    七、源码分析 提供的源码笔记可以帮助你看到这些概念在实际代码中的应用,通过对例题源码的阅读和调试,加深对Java IO流的理解。例如,你可能会看到如何使用FileInputStream和FileOutputStream读写文件,或者使用...

    commons-io-2.4 包含了所有commons-io的jar包和源码

    10. **源码分析**:由于包含源码,开发者可以深入理解Apache Commons IO库的内部工作原理,学习优秀的编程实践,并根据需求进行扩展或定制。 Apache Commons IO 是Java开发中的重要辅助库,它的功能强大且实用,...

    Java源码编码转换器 GBK TO UTF8 UTF8 To GBK(无源码)

    通过分析和学习这个源码,开发者可以深入了解Java编码转换的原理和实践,也可以根据自己的需求进行定制和扩展。 总之,Java源码编码转换器是一个方便的开发工具,它解决了不同编码格式之间的转换问题,尤其是对于...

    Android应用源码之IOStreamSample.zip

    通过分析和实践这些示例,开发者可以更好地理解如何在实际项目中有效地利用IO流进行数据处理,从而提升应用的性能和用户体验。 在深入学习源码时,关注以下几点: 1. **异常处理**:IO操作常伴随着异常,如...

    (源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象

    标题 "(源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象" 提供了我们要探讨的主题,即Java中的输入输出流(I/O ...同时,源码分析也是提升编程技能的重要途径,能让你对Java的内部机制有更深的理解。

    应用源码之IOStreamSample.zip

    在学习这个样本源码时,建议逐步分析每个类和方法,理解它们的功能和应用场景。同时,通过实践编写和调试代码,加深对IOStream的理解。此外,还可以尝试扩展功能,如增加文件的追加写入、异步读写等,以提升实际开发...

    Android应用源码之IOStreamSample_Android.zip

    通过分析`IOStreamSample`这个项目,开发者可以更好地理解Android中I/O流的用法,并能将其应用于实际项目,提高代码的可读性和效率。在实际开发中,理解并熟练掌握I/O流的使用至关重要,因为它贯穿于Android应用的...

    自己封装的一些文件(夹)操作和txt文件读写的工具类(ExtUtil0.1)

    4. **源码分析**:提供源码意味着我们可以深入理解这些工具类的工作原理,学习如何优化文件和文本操作的代码。源码分析有助于提升编程技巧,了解最佳实践。 5. **jar包**:`ExtUtil0.2.jar`是一个可执行的Java类库...

    IO流

    源码分析对于理解IO流的工作原理至关重要,例如查看Reader和Writer的源代码,可以了解它们如何处理字符编码。同时,有一些工具,如IDEA的Debug模式,可以帮助我们跟踪数据在流中的流动,理解IO操作的具体步骤。 综...

    MF00027-安卓手机与电脑的socket通信源码.zip

    通过阅读和分析源代码,可以学习到如何在Android和Windows应用之间建立socket连接,发送和接收数据,以及如何处理网络相关的异常。 总的来说,"MF00027-安卓手机与电脑的socket通信源码"是一个实践性的教程,涵盖了...

    21.【缓冲流、转换流、序列化流、打印流】(1)_缓冲流_源码

    在学习这些流的使用时,可以结合源码分析其工作原理,了解内部缓冲区的管理、数据的读写策略等。`21.【缓冲流、转换流、序列化流、打印流】-笔记`文件可能包含了详细的解释和示例代码,通过阅读这份笔记,可以更深入...

Global site tag (gtag.js) - Google Analytics