`
xingxiupiaoxue
  • 浏览: 5597 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

文件流 读文件 乱码的正确解决方案

 
阅读更多
InputStreamReader 和 OutputStreamWriter类用法简介。
一、InputStreamReader类
InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
构造方法:
InputStreamReader isr = new InputStreamReader(InputStream in);//构造一个默认编码集的InputStreamReader类
InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);//构造一个指定编码集的InputStreamReader类。
参数 in对象通过 InputStream in = System.in;获得。//读取键盘上的数据。
                                或者    InputStream in = new FileInputStream(String fileName);//读取文件中的数据。可以看出FileInputStream 为InputStream的子类。
主要方法:int read();//读取单个字符。
                  int read(char []cbuf);//将读取到的字符存到数组中。返回读取的字符数。
[java] view plain copy
public static void transReadNoBuf() throws IOException { 
        /**
         * 没有缓冲区,只能使用read()方法。
         */ 
        //读取字节流 
//      InputStream in = System.in;//读取键盘的输入。 
        InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。 
        //将字节流向字符流的转换。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节. 
        InputStreamReader isr = new InputStreamReader(in);//读取 
//      InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\demo.txt"));//综合到一句。 
             
        char []cha = new char[1024]; 
        int len = isr.read(cha); 
        System.out.println(new String(cha,0,len)); 
        isr.close(); 
 
    } 
    public static void transReadByBuf() throws IOException { 
        /**
         * 使用缓冲区 可以使用缓冲区对象的 read() 和  readLine()方法。
         */ 
        //读取字节流 
//      InputStream in = System.in;//读取键盘上的数据 
        InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。 
        //将字节流向字符流的转换。 
        InputStreamReader isr = new InputStreamReader(in);//读取 
        //创建字符流缓冲区 
        BufferedReader bufr = new BufferedReader(isr);//缓冲 
//      BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。 
    /*  int ch =0;
        ch = bufr.read();
        System.out.println((char)ch);*/ 
        String line = null; 
        while((line = bufr.readLine())!=null){ 
            System.out.println(line); 
        } 
        isr.close(); 
    } 


二、OutputStreamWriter类
OutputStreamWriter 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。
构造方法:
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out);//构造一个默认编码集的OutputStreamWriter类
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out,String charsetName);//构造一个指定编码集的OutputStreamWriter类。
参数 out对象通过 InputStream out = System.out;获得。//打印到控制台上。
                               或者    InputStream out = new FileoutputStream(String fileName);//输出到文件中。可以看出FileoutputStream 为outputStream的子类。
主要方法:void write(int c);//将单个字符写入。
                  viod write(String str,int off,int len);//将字符串某部分写入。
                  void flush();//将该流中的缓冲数据刷到目的地中去。

[java] view plain copy
    public static void transWriteNoBuf() throws IOException { 
        OutputStream out = System.out;//打印到控制台 
//      OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件 
        OutputStreamWriter osr = new OutputStreamWriter(out);//输出 
//      OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//两句可以综合到一句。 
//      int ch = 97;//a 
//      int ch = 20320;//你 
//      osr.write(ch); 
        String str = "你好吗?";//你好吗? 
        osr.write(str); 
        osr.flush(); 
        osr.close(); 
    } 
    public static void transWriteByBuf() throws IOException { 
//      OutputStream out = System.out;//打印到控制台。 
        OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件。 
        OutputStreamWriter osr = new OutputStreamWriter(out);//输出 
//      OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//综合到一句。 
        BufferedWriter bufw = new BufferedWriter(osr);//缓冲 
//      int ch = 97;//a 
//      int ch = 20320;//你 
//      osr.write(ch); 
        String str = "你好吗?\r\n我很好!";//你好吗? 
        bufw.write(str); 
        bufw.flush(); 
        bufw.close(); 
    } 

流转换程序1:
[java] view plain copy
package IOtest; 
 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
 
public class TransStreamtest { 
 
    /**
     * 主要的类:    in1,    InputStream
     *                      创建对象 InputStream in = System.in;
     *              in2,    InputStreamReader  没有readLine()方法
     *                      主要方法:
     *                          read()读取单个字符,一个汉字也为一个字符。
     *                          read(char[] cbuf)将字符读入数组。
     *                          close().关闭此流和相关联资源。
     *              in3,    BufferedReader     有read(),readLine()方法。
     *              out1,   OutputStream
     *                      创建对象 OutputStream in = System.out;
     *              out2,   OutputStreamWriter  
     *                      主要方法:
     *                          write(int c)//写入单个字符。
     *                          write(char[] cbuf,int off,int len)//写入数组的某一部分
     *                          write(String str,int off,int len)//写入字符串烦人某一部分。
     *                          flush();//刷新该流中的缓冲。
     *                          close();
     *              out3,   BufferedWriteer     有Write(int ch),newLine()方法。
     * 
     *          
     * @throws IOException 
     */ 
    public static void main(String[] args) throws IOException { 
//      transReadByBuf(); 
//      transReadNoBuf(); 
        transWriteNoBuf(); 
//      transWriteByBuf(); 
         
    } 
 
    public static void transWriteNoBuf() throws IOException { 
        OutputStream out = System.out;//打印到控制台 
//      OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件 
        OutputStreamWriter osr = new OutputStreamWriter(out);//输出 
//      OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//两句可以综合到一句。 
//      int ch = 97;//a 
//      int ch = 20320;//你 
//      osr.write(ch); 
        String str = "你好吗?";//你好吗? 
        osr.write(str); 
        osr.flush(); 
        osr.close(); 
    } 
        public static void transWriteByBuf() throws IOException { 
//          OutputStream out = System.out;//打印到控制台。 
            OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件。 
            OutputStreamWriter osr = new OutputStreamWriter(out);//输出 
//          OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//综合到一句。 
            BufferedWriter bufw = new BufferedWriter(osr);//缓冲 
//      int ch = 97;//a 
//      int ch = 20320;//你 
//      osr.write(ch); 
            String str = "你好吗?\r\n我很好!";//你好吗? 
            bufw.write(str); 
            bufw.flush(); 
            bufw.close(); 
    } 
 
     
    public static void transReadNoBuf() throws IOException { 
        /**
         * 没有缓冲区,只能使用read()方法。
         */ 
        //读取字节流 
//      InputStream in = System.in;//读取键盘的输入。 
        InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。 
        //将字节流向字符流的转换。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节. 
        InputStreamReader isr = new InputStreamReader(in);//读取 
//      InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\demo.txt"));//综合到一句。 
             
        char []cha = new char[1024]; 
        int len = isr.read(cha); 
        System.out.println(new String(cha,0,len)); 
        isr.close(); 
    } 
     
    public static void transReadByBuf() throws IOException { 
        /**
         * 使用缓冲区 可以使用缓冲区对象的 read() 和  readLine()方法。
         */ 
        //读取字节流 
//      InputStream in = System.in;//读取键盘上的数据 
        InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。 
        //将字节流向字符流的转换。 
        InputStreamReader isr = new InputStreamReader(in);//读取 
        //创建字符流缓冲区 
        BufferedReader bufr = new BufferedReader(isr);//缓冲 
//      BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。 
    /*  int ch =0;
        ch = bufr.read();
        System.out.println((char)ch);*/ 
        String line = null; 
        while((line = bufr.readLine())!=null){ 
            System.out.println(line); 
        } 
        isr.close(); 
    } 

流转换程序2:
[java] view plain copy
package readKey; 
 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
 
public class TransStreamDemo3 { 
 
    /**
     * @param args
     * @throws IOException 
     */ 
    public static void main(String[] args) throws IOException { 
//      writeText_1(); 
//      writeText_2(); 
//      writeText_3(); 
//      ReadTest_1(); 
//      ReadTest_2(); 
//      ReadTest_3(); 
 
    }  
 
 
    public static void ReadTest_3() throws IOException { 
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\utf-8.txt"),"UTF-8"); 
        char []ch = new char[20]; 
        int len = isr.read(ch); 
        System.out.println(new String(ch,0,len) ); 
        isr.close();     
         
    } 
    public static void ReadTest_2() throws IOException { 
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\utf-8.txt"),"GBK"); 
        char []ch = new char[20]; 
        int len = isr.read(ch); 
        System.out.println(new String(ch,0,len) ); 
        isr.close();     
         
    } 
    public static void ReadTest_1() throws IOException { 
        FileReader fr = new FileReader("D:\\demo.txt"); 
        char []ch = new char[20]; 
        int len = fr.read(ch); 
        System.out.println(new String(ch,0,len) ); 
        fr.close();      
    } 
 
 
    public static void writeText_3() throws IOException { 
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\utf-8.txt"),"UTF-8"); 
        osw.write("你好吗"); 
        osw.close();     
    } 
 
    public static void writeText_2() throws IOException { 
        FileWriter fw = new FileWriter("D:\\gbk1.txt"); 
        fw.write("你好啊"); 
        fw.close(); 
    } 
 
    public static void writeText_1() throws IOException { 
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\gbk.txt"),"GBK"); 
        /*
         *和上面的等同 
         * FileWriter fw = new FileWriter("D:\\gbk1.txt");
         * 操作文件的字节流 + 默认的编码表
         */ 
        osw.write("你好吗"); 
        osw.close(); 
    } 

分享到:
评论

相关推荐

    Java读取TXT文本文件乱码解决方案.doc

    Java 读取 TXT 文本文件乱码解决方案 Java 读取 TXT 文本文件时可能会出现乱码问题,这个问题是由于字符集编码不正确引起的。解决方案是使用正确的编码方式读取文本文件。下面是详细的解决方案: 首先,需要了解 ...

    eclipse下properties文件中文乱码的解决方案

    ### Eclipse下Properties文件中文乱码解决方案详析 在IT开发领域,尤其是使用Eclipse作为集成开发环境(IDE)的开发者,经常会遇到一个令人头疼的问题——Properties文件中的中文字符出现乱码。这一现象不仅影响...

    JSP乱码 N种解决方案

    本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码是计算机对文字进行存储和处理的标准,常见的有ASCII、GBK、UTF-8等。 - JSP页面默认使用ISO-8859-1...

    java读写csv文件,中文乱码问题

    下面我们将深入探讨如何在Java中正确地读取和写入CSV文件,以及解决中文乱码的问题。 1. **字符编码的理解**: - 在处理中文字符时,必须确保使用正确的字符编码,例如UTF-8。UTF-8是一种广泛支持的编码格式,可以...

    乱码解决 乱码解决 乱码解决 乱码解决 乱码解决

    下面将详细讨论乱码产生的原因、解决方案以及如何预防。 一、乱码产生的原因 1. **编码格式不一致**:不同系统、软件或文件可能采用不同的字符编码,如ASCII、GBK、UTF-8等。当这些编码格式不兼容时,就会出现乱码...

    解决Arcgis10.2.2中dbf文件用EXCEL打开乱码问题

    6. **批处理解决方案**:如果你有大量的dbf文件需要处理,可以编写批处理脚本(如Python或VBScript)来自动转换文件编码或导出到Excel。 7. **更新软件版本**:考虑升级ArcGIS到最新版本,因为新版本可能会修复已知...

    Java读取TXT文本文件乱码解决方案.pdf

    总之,Java 读取 TXT 文件乱码的解决方案在于确定文件的正确编码,并在读取时指定该编码。通过使用 `InputStreamReader` 并传递正确的编码字符串,可以有效地解决这类问题。同时,了解各种编码格式的特点以及如何...

    JSP乱码解决方案

    本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...

    springboot乱码问题解决方案

    SpringBoot乱码问题解决方案可以通过配置文件中添加编码设置和Maven插件配置来解决。开发者可以根据实际情况选择适合的解决方案,以确保项目的正确运行。 五、参考文献 * SpringBoot官方文档: * Maven官方文档: ...

    ZipOutputStream 压缩文件以及乱码问题解决方案

    确保整个项目的资源文件都以UTF-8编码读取,避免在压缩过程中出现乱码。 总的来说,使用`ZipOutputStream`压缩文件需要注意文件名的编码问题,特别是处理包含非ASCII字符的文件名。通过指定正确的编码,我们可以...

    CHM文件打开乱码问题解决方案

    本文将深入探讨CHM文件乱码的原因,并提供一系列解决方案。 #### 一、CHM文件乱码原因分析 1. **编码不匹配**:CHM文件中的文本默认使用的是Windows ANSI编码,但不同地区的Windows系统可能有不同的默认编码设置。...

    工作流乱码解决方案

    "工作流乱码解决方案"这个主题就针对Activiti5在处理中文或其他非ASCII字符时可能出现的显示异常进行探讨。 Activiti5是一个开源的工作流和业务流程管理平台,它基于Java,支持BPMN 2.0标准,为企业提供了一套强大...

    Lua文件反编译汉字乱码处理

    在提供的压缩包文件中,"LuaChineseCharDeal.sln"是Visual Studio的解决方案文件,用于组织和管理项目。"LuaChineseCharDeal.v12.suo"是用户选项文件,存储了用户特定的设置,如最近打开的文件列表。至于...

    U盘文件的乱码解决方案及相关数据恢复

    当U盘出现文件乱码、格式化问题、RAW文件系统状态以及FOLDER FORCEDHIDDEN等问题时,这通常是由于不正确的拔插操作、文件系统损坏或病毒感染等原因所致。以下是一些针对这些问题的解决策略。 首先,不要立即假设是...

    Tomcat 在IE中下载rar文件为乱码解决方案

    ### Tomcat 在IE中下载rar文件为乱码解决方案 #### 问题背景 在使用Tomcat作为Web服务器的应用程序中,可能会遇到一个常见的问题:当用户尝试通过Internet Explorer(IE)浏览器下载rar格式的文件时,文件会被误...

    java读取远程网页乱码解决方案

    本文将深入探讨这个问题,提供有效的解决方案,确保正确地读取和处理远程网页的字符编码。 首先,理解网页编码至关重要。网页通常使用UTF-8、GBK等字符集编码,Java在读取时必须识别并匹配这种编码,才能正确解析...

    解决方案_EXCEL打开Tableau导出数据存在中文乱码情况的解决方案

    解决方案_EXCEL打开Tableau导出数据存在中文乱码情况的解决方案...解决方案_EXCEL打开Tableau导出数据存在中文乱码情况的解决方案可以帮助我们避免中文乱码的问题,确保从Tableau中导出的数据可以正确地显示在EXCEL中。

    java 解析csv文件例子,csv文件 中文乱码问题

    你可以尝试以下几种解决方案: 1. **确定正确的编码**:确认CSV文件的实际编码。可以使用一些工具,如Notepad++,查看或更改文件的编码。 2. **使用`CharsetDetector`**:如果不确定编码,可以使用Apache Commons ...

    解决Ubuntu和Windows的文件乱码问题

    3. 解压zip文件乱码的解决方案。除了使用unzip命令,我们还可以安装7-zip来解压zip文件,配合convmv使用解决乱码问题。安装7-zip和convmv的命令是sudo apt-get install convmv p7zip-full,解压zip文件的命令是 LANG...

    Qt中文乱码完美解决方案.docx

    Qt 中文乱码解决方案 在 Qt 开发中,中文乱码问题是一常见的问题,特别是在 UTF-8 编码格式下。为了解决这个问题,我们需要从源头解决乱码问题,包括源文件的编码格式和 QSS 文件的使用问题。 源文件编码格式 在 ...

Global site tag (gtag.js) - Google Analytics