必威体育Betway必威体育官网
当前位置:首页 > IT技术

详解OutputStream和InputStream Reader和Writer InputStreamReader

时间:2019-08-07 15:13:13来源:IT技术作者:seo实验室小编阅读:90次「手机版」
 

inputstreamreader

  1. outputstream和InputStream

    字节输入和输出流,有字节文件流,字节对象流。ObjectOutputStream是对象序列化用的。fileinputstream/FileOutputStream用来读写文件。

  2. Reader和Writer

    字符流,字节流中包含FileRead,inputstreamreader和BufferedReader。最重要的类是InputStreamReader,它是字节转换为字符的桥梁,这里就用到了适配器模式。关于适配器模式看我其他的博客java默认的编码方式是unicode,在字符流中默认的编码方式是GBK,在创建InputStreamReader对象的时候可以指定编码的方式。

  3. 字节流和字符流的区别

    字节流读取二进制文件,字符流读取文本文件。

    实际上字符流是这样工作的:

    输出字符流:把要写入文件的字符序列(实际上是Unicode码元序列)转为指定编码方式下的字节序列,然后再写入到文件中;

    输入字符流:把要读取的字节序列按指定编码方式解码为相应字符序列(实际上是Unicode码元序列从)从而可以存在内存中。

    所以字符流是自带缓存功能的。

字节流不带缓存功能,如果要缓存得用BufferedInputStream。即使是FileInputStream中read()方法,传入byte[]数组参数,它在源代码中也是循环从电脑中一个一个读取。

所以字节流无形中增加了磁盘IO。

这里写图片描述

字节流读取写入代码

public class Solution {
    public static void main(String[] args){
        //Out();
        In();
    }
    private static void Out(){
        //0确定目标文件
        File file = new File("D:/test.txt");
        try {
            OutputStream out = new FileOutputStream(file, true);
            String info = "小河流水测试河流";
            try {
                out.write(info.getBytes());
                out.close();
                System.out.println("write success");
            } catch (IOException e) {
                e.printstacktrace();
            }
        } catch (filenotfoundException e) {
            e.printStackTrace();
        }
    }

    private static void In(){
        File file = new File("D:/test.txt");
        try {
            InputStream in = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(in,"UTF-8");
            byte[] bytes = new byte[6];
            stringbuilder buf = new StringBuilder();
            int len = -1;
            try {
                while ((len = in.read(bytes)) != -1){
                    buf.APPend(new String(bytes));
                }
                in.close();
                System.out.println("输出打印内容");
                System.out.println(buf);
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

}

这里如果写入txt文件的是纯字母的话没有问题,因为一个英文字母是一个字节,用byte[]

刚刚碰到一个问题:java中char占用2个字节,值范围是0-65535,byte是1个字节,值范围是-128-127。在InputStream实现类中有方法read(),字符串中如果没有参数是用read()的返回的是char类型的字符对应的数值,然后我们用char强制转换,这里返回的结果不会是-1。所以我们可以用-1来判断是否读取到最后一位了。但是在字节流中,我们返回的值是-128到127的范围,那-1是涵盖在里面的,如果得到了-1,如何判断是结束呢还是我得到的就是-1。

经过查资料,我发现,在字节流读取中,得到的字符会将高位的1转化为0,转到字节的时候再用byte强制转换回来。

http://blog.csdn.net/daijunjian/article/details/7316275可以参考这篇博客

第二个问题:在字节流中写入的是字节,英文和数字对应的就是单字节。但是在java中这些表示自然语言肯定不够,所以会有其他编码集。但是在字节流中,不管输入的是什么就是当做二进制文件的。

https://www.cnblogs.com/haojun/p/7759955.html可以参考这篇博客

字符流

public class Solution {
    public static void main(String[] args){
        //Out();
        In();

    }

    private static void In(){
        File file = new File("D:/test.txt");
        try {
            Reader in = new FileReader(file);
            char[] cs = new char[1];
            int len = -1;
            StringBuilder buf = new StringBuilder();
            try {
                while ((len = in.read(cs)) != -1){
                buf.append(new String(cs));
                }
                in.close();
                System.out.println("读入成功");
                System.out.println(buf);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
    private static void Out(){
        File file = new File("D:/test.txt");
        try {
            Writer out = new FileWriter(file);
            out.write("村花到我家");
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

适配器,InputStreamReader

在字节流的代码中,如果写入的是汉子,用字节流的话,很容易乱码。这是可以把字节流转换为字符流来读取。然后指定编码方式,默认的是GBK。

这就是字节流,每个数字都是一个字节(Byte,8位),所以如果读取英文的话,用字节流,然后用(char)强制转化一下就行了,但如果有中文等双字节语言或者说需要指定字符编码集的情况,就必须用到InputStreamReader将字节流转化为字符流了。

http://blog.csdn.net/zgljl2012/article/details/47267609这个可以参考这篇博客,这篇博客举了URL获取网页字节流的例子。

public class Solution {
    public static void main(String[] args){
        Out();
        In();
    }
    private static void Out(){
        //0确定目标文件
        File file = new File("D:/test.txt");
        try {
            OutputStream out = new FileOutputStream(file, true);
            String info = "小河流水测试河流";
            try {
                out.write(info.getBytes());
                out.close();
                System.out.println("write success");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static void In(){
        File file = new File("D:/test.txt");
        try {
            InputStream in = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(in,"UTF-8"); //字节流转字符流 用到了适配器模式。
            byte[] bytes = new byte[6];
            char[] chars = new char[1];
            StringBuilder buf = new StringBuilder();
            int len = -1;
            try {
                while ((len = isr.read(chars)) != -1){
                    //buf.append(new String(bytes));
                    buf.append(chars);
                }
                in.close();
                System.out.println("输出打印内容");
                System.out.println(buf);
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

}

相关阅读

adobe reader安装失败提示错误代码150210该怎么办?

在安装Adobe Reader XI 的时候提示【Adobe Reader XI -Chinese Simplelified 安装完成之前被中断,错误代码150210】经了解同事之前

C#查询数据库--ExecuteReader方法的使用

在做数据库的查询过程中,使用方法ExecuteReader,其返回结果为MySqlDataReader,由于参考的信息有误,走了好长时间的弯路,记录下来; stri

InputStream,InputStreamReader和Reader之间的区别与关

InputStream:得到的是字节输入流,InputStream.read(“filename”)之后,得到字节流 Reader:读取的是字符流 InputStreamReader

C#——读文件方法(Filestream、File、StreamReader)

方法一:使用Filestream,将文本一次性全部转换为字节,之后转换为string显示在text中OpenFileDialog fd = new OpenFileDialog();

FileInputStream与FileOutputStream

输入与输出  我们编写的程序除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身的数据发送到外界。比如,我们编写

分享到:

栏目导航

推荐阅读

热门阅读