Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

IO流之字符流

$
0
0

学习导航

第二节:IO流之字节流http://blog.csdn.net/bobo8945510/article/details/52958491


IO流之基础讲解

一、什么是IO流?

这里写图片描述

二、字节流和字符流的区别?

这里写图片描述

三、IO流的分叉图!

这里写图片描述


四、字符流InputStreamReader和OutputStreamWriter!

一。InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。你可以在构造器重指定编码的方式,如
果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等

1、要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
2、为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
3、BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

二。OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。

1、每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积
2、为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
3、BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

四—1:字符流之:使用InputStreamReader读取一个txt文档到控制台

前提你创建好了这个文档

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class TextRWByteStream04 {
    /*
     * 使用字符流,读取一个txt文档到控制台
     * */
    public static void main(String[] args) {

        try {
            //指定我次路径的一个txt文档
            File file = new File("d://data//newhello.txt");
            FileInputStream fin = new FileInputStream(file);

            //我们需要把子节流转换为字符流
            InputStreamReader  ird = new InputStreamReader(fin,"gbk");

            //创建一个数组,注意,字符数组用的是char存放每次读取的字节
            char input[] = new char[200];
            //有时候当你剩余字节,不足100的时候,如果不定义偏移量,在读取文件的时候就容易多出
            int num = 0;
            while ((num = ird.read(input))!=-1) {
                //这样就能表示,数组中有多少读取多少。而不会当【200】不满的时候用空字符代替
                System.out.println(new String(input,0,num));
            }
            System.out.println("读取完毕");
            ird.close();
            fin.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行结果
这里写图片描述

四—2: 字符流之:使用字符流复制文件(InputStreamReader和InputStreamReader)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;


public class TextRWByteStream05 {
    /*
     * 使用字符流,读取一个txt文档到控制台并复制一份新的txt文档,
     * */
    public static void main(String[] args) {

        try {
            //创建一个字符流,指定我次路径的一个txt文档
            FileInputStream fin = new FileInputStream(new File("d://data//newhello.txt"));
            FileOutputStream outf= new FileOutputStream("d://data//newhello_two.txt");

            //我们需要把子节流转换为字符流
            InputStreamReader  ird = new InputStreamReader(fin,"GBK");
           //字符流通向字节流的桥梁。
            OutputStreamWriter iwd = new OutputStreamWriter(outf,"GBK");

            //创建一个数组,注意,字符数组用的是char存放每次读取的字节
            char input[] = new char[200];
            //有时候当你剩余字节,不足100的时候,如果不定义偏移量,在读取文件的时候就容易多出
            int num = 0;
            while ((num = ird.read(input))!=-1) {
                //这样就能表示,数组中有多少读取多少。而不会当【200】不满的时候用空字符代替
                System.out.println(new String(input,0,num));
                iwd.write(input,0,num);
            }
            System.out.println("复制完毕");
            iwd.close();
            outf.close();
            ird.close();
            fin.close();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行结果:

这里写图片描述

四—3: 字符流之:使用字符流复制文件带缓存(InputStreamReader和InputStreamReader)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;


public class TextRWByteStream06 {
    /*
     * 使用带缓冲的字符流,读取一个txt文档并复制到一个新的txt文档
     * */
    public static void main(String[] args) {

        try {
            //创建一个字符流,指定我次路径的一个txt文档
            FileInputStream fin = new FileInputStream(new File("d://data//newhello.txt"));
            FileOutputStream outf= new FileOutputStream("d://data//newhello_two.txt");

            //InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。
            InputStreamReader  ird = new InputStreamReader(fin,"GBK");
            //OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。
            OutputStreamWriter iwd = new OutputStreamWriter(outf,"GBK");

            //用BufferedReader 和 BufferedWriter 可以提高读写的效率
            //但是有一个弊端,就是写入到新txt文件的时候,他不会自动换行。所以这里大多建议使用
            BufferedReader bfd = new BufferedReader(ird);
            BufferedWriter bw = new BufferedWriter(iwd);

            String value = "";
            while ((value =bfd.readLine())!=null) {
                System.out.println(value);
                //添加“\r\n”才可以换行
                bw.write(value);

            }

            System.out.println("复制完毕");
            bfd.close();
            bw.close();
            iwd.close();
            outf.close();
            ird.close();
            fin.close();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

结果也是复制成功,下面我没有添加“\r\n”,所以没有换行

这里写图片描述


四—4: 字符流之:打印流PrintWriter 好处,就是可以更简便的处理缓存区的内容

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;


public class TextRWByteStream07 {
    /*
     * 使用带缓冲的字符流,读取一个txt文档并复制到一个新的txt文档
     * //用BufferedReader 和 BufferedWriter 可以有效的提高读写的效率
     * 
     * 但是BufferedWriter有一个弊端,就是写入到新txt文件的时候,他不会自动换行。!
     * 所以这里大多建议这里使用打印流,所以这里大多建议这里使用打印流,PrintWriter
     * */
    public static void main(String[] args) {

        try {
            //创建一个字符流,指定我次路径的一个txt文档
            FileInputStream fin = new FileInputStream(new File("d://data//newhello.txt"));
            FileOutputStream outf= new FileOutputStream("d://data//newhello_two.txt");

            InputStreamReader  ird = new InputStreamReader(fin,"GBK");
            OutputStreamWriter iwd = new OutputStreamWriter(outf,"GBK");

            BufferedReader bfd = new BufferedReader(ird);
//            BufferedWriter bw = new BufferedWriter(iwd);

            //这里大多建议这里使用打印流,因为他比BufferedWriter 更有用些,
            //后面跟一个true表示,当缓存区没有填满数据是,不调用true,剩下的数据就会被遗漏。造成复制内容不全。
            PrintWriter pw = new PrintWriter(iwd,true);

            String value ;
            while ((value =bfd.readLine())!=null) {
                System.out.println(value);
//              bw.write(value);
                pw.write(value+"\r\n");

            }

            System.out.println("复制完毕");
            pw.close();
            bfd.close();
//          bw.flush();
//          bw.close();
            iwd.close();
            outf.close();
            ird.close();
            fin.close();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行结果:成功
这里写图片描述

五、FileReader与FileWriter纯文本操作,直接操作文件数据流,并包装为缓冲流进行文件拷贝

如果在进行文本操作的时候,有乱码出现。请查看自己的eclipse编码配置,或者留言给我

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;


public class TextRWByteStream08 {
    /*
     * 如果是纯文本操作,我们一般会用到FileReader与FileWriter
     * 他们的好处就是,相对于使用字节流或字符流。更简单
     * */
    public static void main(String[] args) {

        try {
         FileReader fReader = new FileReader("d://data//newhello.txt");
         BufferedReader bf = new BufferedReader(fReader);

         FileWriter fWriter =new FileWriter("d://data//newhello_two.txt");
         BufferedWriter bw = new BufferedWriter(fWriter);



         String ling ;
         while ((ling = bf.readLine())!=null) {
             System.out.println(ling);
             bw.write(ling+"\r\n");

        }
         System.out.println("写入完毕");
         bw.flush();
         bw.close();
         bf.close();
         fWriter.close();
         fReader.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行结果:成功
这里写图片描述

demo地址:http://download.csdn.net/detail/bobo8945510/9667082

作者:bobo8945510 发表于2016/10/28 17:05:25 原文链接
阅读:23 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>