zoukankan      html  css  js  c++  java
  • IO流(二)字符流

    1.字符流:在字节流的基础上添加了编码机制。很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件。例如.txt,.java,.cpp,.html等

                       编码:每一个国家都有自己的编码,编码不一致往往导致的结果就是!!乱码!!。中国编码的编码:gbk

                                gbk:英文字母:1个字节,中文:2个字节,系统的默认编码。

                                unicode:统一编码。中文还是英文字母都是占2个字节。

                                utf-8: 国际编码。英文占1个字节,中文占3个字节。

                                文件是用什么编码来写的,那么就用什么编码来读取。最常用的编码是gbk和utf-8.一般的情况下,都设置为utf-8.(还有其他的很多编码:例如GB2312,big5等等)。如果想测试是否像上面所说那么多个字节的话,建议使用Notepad2文本软件,体积小功能强!(似乎再买广告了。。。)

                       Reader:读取数据

                                FileReader:文件读取字符流

                                BufferedReader://带缓冲区的字符输入流

                                         readLine() ;读取一行数据

                                         LineNumberReader;带行号.通过getLineNumber()方法获取行号

     1 import java.io.FileReader;
     2 import java.io.IOException;
     3 import java.io.LineNumberReader;
     4 
     5 /*LineNumberReader是BufferedReader的子类,
     6  * 比BufferedReader多了设置行号和获取行号的功能。
     7  * 使用LineNumberReader流读取文本文件,并打印在控制台上。
     8  * 在每行的前面添加行号。
     9  */
    10 
    11 public class LineNumberReaderDemo1 {
    12     public static void main(String[] args) throws IOException {
    13         LineNumberReader lnr = new LineNumberReader(new FileReader("e:\io.txt"));
    14         String str = null;
    15         while((str = lnr.readLine()) != null){
    16 //            lnr.setLineNumber(90);//设置行号
    17             System.out.print(lnr.getLineNumber()+" : ");
    18             System.out.println(str);
    19         }
    20         lnr.close();
    21     }
    22 }
    带行号功能的字符输入流

                       Writer:写入数据

                                FileWrite:写入数据,记得刷新。

                                BufferedWriter://带缓冲区的字符输出流

                                         newLine():写入换行字符。

                                         write(String str):写入字符串。

    /*
         * 2:用字符流复制文本文件。
         */
        public static boolean copyText(String textPath, String targetPath){
            boolean flag = false;
            if(textPath==null || textPath.trim().equals("")){
                return flag;
            }
            if(targetPath == null || targetPath.trim().equals("")){
                int end = textPath.lastIndexOf(".");
                String endStr = textPath.substring(end);//后缀名
                int index = textPath.lastIndexOf("\");
                if(index == 0){
                    index = textPath.lastIndexOf("/");
                }
                targetPath = textPath.substring(0,end)+"2"+endStr;//新文件名
            }
            
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                //字符输入流
                FileReader fr = new FileReader(textPath);
                br = new BufferedReader(fr);
                //字符输出流
                FileWriter fw = new FileWriter(targetPath);
                bw = new BufferedWriter(fw);
                
                String str = "";
                while((str=br.readLine()) != null){
                    bw.write(str);
                    bw.newLine();
                    bw.flush();
                }
                flag = true;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try{
                    bw.close();
                    br.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            return flag;
        }

                       转换流:可带编码格式的流

                                InputStreamReader;字节转换为字符流

    public class SystemReadDemo1 {
        
        public static void main(String[] args) throws IOException {
            //获取键盘输入
            InputStream is = System.in;
            //将字节流转换为字符流,用到InputStreamReader(InputStream in)---转换流
            InputStreamReader isr = new InputStreamReader(is,"utf-8");
            //将字符流再转为带缓冲区的字符流
            BufferedReader br = new BufferedReader(isr);
            
            String str = null;
            while(true){
                str = br.readLine();
                if("886".equals(str)){
                    break;
                }
                System.out.println(str);
            }
            br.close();
        }
    
    }
    转换流示例

                                OutputStreamWriter ;字符流转换为字节流。

    package com.java.homework;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    
    /*
     * 1:获取键盘录入的数据,将数据写到文件中,但是以utf-8编码的形式写到文件中去。
     */
    public class HomeWork1 {
        
        public static void main(String[] args) {
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                br = new BufferedReader(new InputStreamReader(System.in));
                bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e:\aa.txt"), "utf-8"));
                
                String str = "";
                while(true){
                    str = br.readLine();
                    if("exit".equals(str)){
                        //可以尝试不同的编码
                        OutputStreamWriter osw = new OutputStreamWriter(System.out, "GBK");
                        BufferedWriter bw2 = new BufferedWriter(osw);
                        bw2.write("输入结束!");
                        bw2.flush();
                        break;
                    }
                    bw.write(str);
                    bw.newLine();
                    bw.flush();
                }
                
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    bw.close();
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    转换流示例二
  • 相关阅读:
    (连通图 模板题 无向图求桥)Critical Links -- UVA -- 796
    (连通图 模板题)迷宫城堡--hdu--1269
    (连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)
    (线段树 区间合并更新)Tunnel Warfare --hdu --1540
    (线段树 区间查询更新) Can you answer these queries? -- hdu--4027
    (线段树)Balanced Lineup --POJ --3264
    (线段树) Count the Colors --ZOJ --1610
    (线段树)Just a Hook -- hdu -- 1689
    All about <httpRuntime targetFramework>
    ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方 【转】
  • 原文地址:https://www.cnblogs.com/xinge1993/p/4716472.html
Copyright © 2011-2022 走看看