`

Java IO 与 编码 浅析,希望大家多多指教

阅读更多
这些天,研究了下java IO与编码相关的问题,希望和大家探讨一下,欢迎拍砖,共同提高。
可以转载,但是请表明原作者 mubing_s。

首先我们都知道,java IO 的输入流顶层类有两个: java.io.Reader(字符流) 和 java.io.InputStream(字节流),本文要做的是深入细节来解析字符流和字节流在处理文本读入时到底是怎么做的。

先请移步看个小代码:
package learn;
import java.io.*;
class Go{
	public static void main(String args[]) throws FileNotFoundException, IOException{
		FileReader fr = new FileReader("xx.txt");
		//System.out.println(fr.getEncoding());
		int num;
		while((num = fr.read()) != -1){
			System.out.println(Integer.toHexString(num));
		}
		fr.close();
		
		System.out.println("--------------------");
		
		int get_num;
		FileInputStream fis = new FileInputStream("xx.txt");
		while((get_num = fis.read()) != -1){
			System.out.println(Integer.toHexString(get_num));
		}
		fis.close();
	}
}




现在我们的xx.txt假设内容就是一个中文字:我
我们可以在中文编码在线查询网站http://ipseeker.cn/tools/pywb.php中看到:



以上程序运行的结果是FileInputStream fis 的输出结果是 ced2,这就是说明我们的txt文本采用的是gbk的编码,因为fis是InputStream(字符流),所以对它来说根本不认识编码,它只是简单的把txt里面的内容(其实就是二进制串)抄了进来。

下面说FileReader,FileReader 是InputStreamReader的子类,而InputStreamReader包装了一个InputStream(Adapter design pattern),可以说FileReader就是一个编码语言翻译家,首先FileReader默认地认为InputStream是某种编码语言写成的,然后把它翻译成内部的语言(unicode),注意jvm世界的非常和谐内部都用unicode交流,所以我们看到了进过翻译家的帮忙,FileReader fr 输出的结果为6211,就是“我”的unicode。
那么FileReader貌似有个不好的毛病,它太自信了,它把InputStream就认为是某种语言(用getEncoding()可以查看到),当然这里它自信的没有问题,应为getEncoding返回的结果是gbk,也就是它把InputStream的字节当gbk来解析翻译去得到内部的unicode,显然我的windows下面的txt用的就是gbk(FileInputStream fis 输出的ced2也说明了这一点),所以我们的FileReader蒙对啦,哈哈。

当然,InputStreamReader 作为 FileReader的父类就严谨的多了(老一辈毕竟是过来人),在它的构造函数中你可以提供charset,来告诉Reader InputStream用的是什么编码(Reader应该怎么去读,把InputStream当什么来读),它的工作流程是这样,它内部有一个InputStream和charset的成员,然后它就用charset的方式去理解InputStream,把它翻译成unicode。通俗点说,就是最后我们要把外文翻译成中文,InputStream就是外文,而charset就是告诉翻译者InputStream是哪国的话(英语?法语?),这样外文就可以翻译成中文了。

以上就这么多,大家理解了吗,有纰漏处欢迎指出,谢谢了。


  • 大小: 15 KB
分享到:
评论

相关推荐

    java IO教程,java IO教程,java IO教程

    java IO教程,java IO教程,java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程java IO教程java IO教程java IO教程java IO教程,java IO教程,java IO教程,java IO教程,java IO...

    java io 与java nio区别

    ### Java IO 与 Java NIO 的区别 在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是...

    java IO.chm

    《Java IO.chm》是一个关于Java输入/输出(IO)技术的压缩文件,其中包含了丰富的资料,适合开发者深入理解和学习Java IO系统。这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、...

    Java IO应届生培训讲义

    Java IO应届生培训讲义是一份面向刚毕业的大学生进行Java IO相关知识的培训资料,它涵盖了Java IO的基础知识、不同的IO模型以及Java中的BIO、NIO和AIO高级IO类库。下面详细解释这些知识点: 1. 用户空间和内核空间 ...

    Java IO 与 装饰模式

    Java IO 与 装饰模式 在Java编程中,输入输出(IO)处理是程序设计中的重要组成部分,用于读取、写入和处理数据。Java IO库提供了一整套类来支持各种类型的输入输出操作,包括文件、网络、内存等。而装饰模式是一种...

    java io 结构图

    `InputStreamReader` 和 `OutputStreamWriter` 则是字符流与字节流之间的桥梁,用于编码和解码。 字节流则以 `InputStream` 和 `OutputStream` 为基类,代表字节输入流和字节输出流。常见的子类有 `FileInputStream...

    Java IO与NIO:深入理解与实践指南

    Java IO和NIO提供了两种不同的I/O处理方式,各有优势和适用场景。IO适用于简单的I/O操作,而NIO则适合于需要高性能和高并发的应用。了解这两种I/O处理方式的区别和特点,可以帮助开发者根据具体的应用需求选择合适的...

    Java IO_NIO

    Java IO(Input/Output)是Java编程语言中用于处理输入输出操作的基础框架,它提供了丰富的类库,使得程序能够与各种设备、文件、网络进行数据交互。然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,...

    java IO系统与正则表达式

    Java IO系统是Java平台中处理输入输出操作的核心组件,它为开发者提供了丰富的类库,用于读写文件、网络通信以及处理各种数据流。在Java中,IO系统主要由一系列的抽象类和接口组成,如InputStream、OutputStream、...

    Java IO 使用例

    Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。它提供了丰富的类库,允许开发者在程序中与各种设备、文件、网络等进行数据交互。Java IO系统是基于流(Stream)的,数据通过流在源...

    io java io 流

    java io 的例子有利于对io的熟悉的了解深入,希望对大家有帮助

    java io.pdf

    Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。它提供了丰富的类库,允许程序员在程序之间传输数据,包括从文件、网络、内存缓冲区到其他程序或系统组件。Java IO API是Java平台的...

    java IO流精讲 JAVA IO流实例开发

    Java IO流是Java平台中用于处理输入/输出操作的核心组件,它允许程序与各种数据源(如文件、网络连接、内存缓冲区等)进行交互。Java IO流的精讲涵盖了许多概念和技术,包括流的分类、流的方向、缓冲区的使用、字符...

    java IO流精讲

    IO 简介,只看这篇,IO全部搞定,对于初学者来说,不可多得

    java io流 案例

    总的来说,Java IO流是Java程序进行输入输出操作的基础,无论是读取配置文件、处理用户输入、还是与其他系统交换数据,都离不开IO流。通过深入学习和实践,开发者可以有效地管理和控制程序的数据流动,从而实现各种...

    IO流 javaio java 流

    Java中的IO流是Java核心库的重要组成部分,它用于在不同数据源之间传输数据。Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又...

    Java IO 工具类大全

    Java IO(Input/Output)是Java平台中处理输入与输出数据的核心部分,它提供了丰富的类库,使得开发者能够高效地进行文件、网络、内存以及其他I/O流的操作。本篇文章将全面解析Java IO工具类,帮助你理解并掌握其在...

    java.io.Reader 和 java.io.InputStream 的区别

    ### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....

Global site tag (gtag.js) - Google Analytics