`

文件输入输出时的编码问题

 
阅读更多

      Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。按字节读取就是采用InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,最后经常用new String(byte[]);把字节数组转换成String。在最后一步隐藏了一个编码的细节,new String(byte[]);会使用操作系统默认的字符集来解码字节数组,中文操作系统就是GBK。而我

们从输入流里读取的字节很可能就不是GBK编码的,因为从输入流里读取的字节编码取决于被读取的文件自身的编码。举个例子:我们在D:盘新建一个名为demo.txt的文件,写入”我们。”,并保存。此时demo.txt编码是ANSI,中文操作系统下就是GBK。此时我们用输入字节流读取该文件所得到的字节就是使用GBK方式编码的字节。那么我们最终new String

(byte[]);时采用平台默认的GBK来编码成String也是没有问题的(字节编码和默认解码一致)。试想一下,如果在保存demo.txt文件时,我们选择UTF-8编码,那么该文件的编码就不在是ANSI了,而变成了UTF-8。仍然采用输入字节流来读取,那么此时读取的字节和上一次就不一样了,这次的字节是UTF-8编码的字节。两次的字节显然不一样,一个很明显的区

别就是:GBK每个汉字两个字节,而UTF-8每个汉字三个字节。如何我们最后还使用new String(byte[]);来构造String对象,则会出现乱码,原因很简单,因为构造时采用的默认解码GBK,而我们的字节是UTF-8字节。正确的办法就是使用new String(byte[],”UTF-8”);来构造String对象。此时我们的字节编码和构造使用的解码是一致的,不会出现乱码问题了。

 

 

再来研究一下字节输出流。

 

      我们知道如果采用字节输出流把字节输出到某个文件,我们是无法指定生成文件的编码的(假设文件以前不存在),那么生成的文件是什么编码的呢?经过测试发现,其实这取决于写入的字节编码格式。比如以下代码:

 

OutputStream out = new FileOutputStream("d:\\demo.txt");

out.write("我们".getBytes());

 

getBytes()会采用操作系统默认的字符集来编码字节,这里就是GBK,所以我们写入demo.txt文件的是GBK编码的字节。那么这个文件的编码就是GBK。如果稍微修改一下程序:out.write("我们".getBytes(“UTF-8”));此时我们写入的字节就是UTF-8的,那么demo.txt文件编码就是UTF-8。这里还有一点,如果把”我们”换成123或abc之类的ascii码字符,那么无论是采用getBytes()或者getBytes(“UTF-8”)那么生成的文件都将是GBK编码的。

 

总之,InputStream中的字节编码取决文件本身的编码,而OutputStream生成文件的编码取决于字节的编码。

 

 

 

符输入流来读取文件。

 

首先,我们需要理解一下字符流。其实字符流可以看做是一种包装流,它的底层还是采用字节流来读取字节,然后它使用指定的编码方式将读取字节解码为字符。说起字符流,不得不提的就是InputStreamReader。以下是java api对它的说明: InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的

字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说到这里其实很明白了,InputStreamReader在底层还是采用字节流来读取字节,读取字节后它需要一个编码格式来解码读取的字节,如果我们在构造InputStreamReader没有传入编码方式,那么会采用操作系统默认的GBK来解码读取的字节。还用上面demo.txt的例子,假设demo.txt编码

方式为GBK,我们使用如下代码来读取文件:

 

InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”));

 

那么我们读取不会产生乱码,因为文件采用GBK编码,所以读出的字节也是GBK编码的,而InputStreamReader默认采用解码也是GBK。如果把demo.txt编码方式换成UTF-8,那么我们采用这种方式读取就会产生乱码。这是因为字节编码(UTF-8)和我们的解码编码(GBK)造成的。解决办法如下:

 

InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);

给InputStreamReader指定解码编码,这样二者统一就不会出现乱码了。

 

 字符输出流。

 

字符输出流的原理和字符输入流的原理一样,也可以看做是包装流,其底层还是采用字节输出流来写文件。只是字符输出流根据指定的编码将字符转换为字节的。字符输出流的主要类是:OutputStreamWriter。Java api解释如下:OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说的很明白了,它需要一个编码将写入的字符转换为字节,如果没有指定则采用GBK编码,那么输出的字节都将是GBK编码,生成的文件也是GBK编码的。如果采用以下方式构造OutputStreamWriter:

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(“dd.txt”),”UTF-8”);

那么写入的字符将被编码为UTF-8的字节,生成的文件也将是UTF-8格式的。

分享到:
评论

相关推荐

    Java文件输入输出汇总

    Java文件输入输出是Java编程中的基础且重要的一部分,它涵盖了数据在文件系统和程序之间的传输。这个主题包括了多种类和方法,使得开发者能够高效地处理文件内容。本文将深入探讨Java中的文件输入输出机制,以及如何...

    vc用标准文件输入输出写的文件读写示例

    在VC++编程环境中,标准文件输入输出流是C++ Standard Template Library (STL)的一部分,提供了方便、高效的方式来处理文件的读写操作。本示例将深入探讨如何使用STL中的`fstream`类来实现文件的读写功能,这对于...

    coreJava文件输入输出流源代码

    在处理文件输入输出时,应始终考虑可能出现的异常,如`FileNotFoundException`(文件未找到)、`IOException`(输入/输出异常)等。因此,源代码中会有相应的异常捕获和处理机制。 7. 链接流(Piped Stream): ...

    java代码输入 输出

    如果文件使用的编码方式与程序默认的编码方式不一致,可能导致乱码问题。因此,在创建`InputStreamReader`或`FileWriter`时,可以显式指定字符集,如`UTF-8`。 通过以上分析可以看出,Java中的输入输出操作非常灵活...

    04 文件输入输出流.ppt

    Java中的文件输入输出流是程序与磁盘文件交互的基础,对于初学者来说,理解并熟练掌握这一部分至关重要。本文将详细讲解`FileInputStream`、`FileOutputStream`、`FileReader`以及`FileWriter`这四个类的主要功能和...

    文件输入输出流(总概)

    在Java编程语言中,文件输入输出流(File I/O Stream)是处理文件数据的基本机制。本文将深入探讨这个主题,包括基本概念、类库、使用示例以及常见问题。 一、基本概念 文件输入流(FileInputStream)和文件输出流...

    java输入输出代码

    Java 输入输出(IO)是Java编程中的重要组成部分,它允许程序与外部世界交换数据,包括读取文件、写入文件、网络通信等。在Java中,输入输出操作由java.io包提供了一系列的类和接口来支持。下面我们将深入探讨Java ...

    JAVa输入输出流程序

    Java输入输出流(IO流)是Java编程语言中处理数据传输的核心部分,它允许程序进行数据的读取和写入操作。在Java中,一切皆为流,输入流用于读取数据,而输出流用于写入数据。这些流可以处理各种类型的数据,包括文本...

    c++ 读写txt文件和乱码问题解决

    然而,在处理不同编码格式的TXT文件时,尤其是涉及到UTF-8编码时,可能会遇到乱码问题。下面将详细讨论如何在C++中正确地读写TXT文件以及如何解决可能出现的乱码问题。 首先,我们来看C++如何读取TXT文件。C++标准...

    java输入输出操作

    在实际应用中,FileInputStream和FileOutputStream是最常用的文件输入输出流,用于读写文件。例如,要从一个名为“data.txt”的文件读取数据,可以创建一个FileInputStream实例,然后调用其read()方法。同样,若要向...

    java 输入输出流

    Java中的输入输出流是Java I/O(Input/Output)系统的核心组成部分,允许程序与外部数据源进行交互。在Java中,所有的I/O操作都基于流的概念,流是数据的序列,可以是字节流或字符流。Java I/O库提供了一系列的类来...

    使用排序算法解决实际问题,初步体会文件的输入输出

    本实验指导将关注如何利用C++程序设计,通过排序算法解决实际问题,并初次接触文件的输入输出操作。在这个过程中,我们将涉及以下几个关键知识点: 1. **排序算法**:排序算法是计算机科学中最基本的数据处理技术之...

    Windows10 + qt5.8.0解决编码乱码问题总结.pdf

    在Windows 10系统上使用Qt5.8.0进行编程时,常常会遇到中文乱码的问题,这些问题主要表现在代码中的中文注释和字符串显示乱码、编译输出信息乱码以及保存文件时中文路径乱码。这些问题产生的根本原因在于Windows系统...

    hadoop中文乱码问题

    当从本地文件系统或者HDFS读取包含中文的文本文件时,如果没有正确设置文件的字符编码,就可能出现乱码。解决方法是在读取文件时指定正确的编码格式,例如使用`FileInputStream`时配合`InputStreamReader`指定GBK...

    字符输入输出.zip

    4. 错误处理:在输入输出过程中,可能会遇到诸如文件不存在、权限问题等错误,因此需要编写适当的错误处理代码来捕获和处理这些问题。 5. 异步输入输出:在高级编程中,可能会使用异步I/O来提高性能,例如在多线程...

    《C#完全自学手册电子图书》\第8章 文件输入输出编程

    ### C#中的文件输入输出编程详解 #### 一、引言 在计算机程序设计中,文件的输入输出是一项非常基础且重要的技能。特别是在.NET框架中,开发者可以通过一系列强大的API来进行文件处理工作。本章节将详细介绍如何...

    第十章 对文件的输入输出1

    在C语言中,对文件的输入输出是编程...总之,C语言中的文件输入输出涉及了文件的编译过程、各种文件类型、字符编码以及标准库提供的文件操作函数。理解并熟练运用这些知识点,对于编写高效、可靠的C语言程序至关重要。

    使用MyEclipse遇到的乱码问题解决

    - 字符集转换问题:在处理文件输入输出时,未指定正确的字符集,如在控制台输出或读取文件时。 2. 解决乱码问题的方法: - 设置MyEclipse的全局编码:进入MyEclipse的首选项(Preferences) -> General -> ...

    JavaWeb开发技术-解决中文输出乱码问题.pptx

    在处理中文字符的输入和输出时,需要正确地处理编码方式,以避免乱码问题的出现。 解决中文输出乱码问题是JavaWeb开发中一个非常重要的问题,需要正确地设置编码方式、处理中文字符的输入和输出,并注意统一的编码...

Global site tag (gtag.js) - Google Analytics