字节流InputStream和OutputStream(二)下

简介: 字节流InputStream和OutputStream(二)

二.三.五 read(byte[]b ,int offset, int len) 循环读取内容


@Test
    public void read6Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"Hello3.txt");
        InputStream inputStream=new FileInputStream(file);
        StringBuilder sb=new StringBuilder();
        byte[] bytes=new byte[10];
        int len=-1;
        while((len=inputStream.read(bytes))!=-1){
            //依次读取的内容
            String temp=new String(bytes,0,len);
            sb.append(temp);
        }
        System.out.println("输出读取的内容:"+sb.toString());
 inputStream.close();
    }


控制台打印输出:


20200617105333968.png


可以读取全部的内容信息,但是发现,产生了中文乱码的问题。


这是由于在读取中文时,准确地说在读取到 汉字’个’时, 正好将个这个词的字节给分开了, 一半在 bytes[9], 另一半在下一次bytes数组的 的bytes[0]位置。


如果将字节数组bytes的长度扩大,如扩大到 1024, 就不会产生乱码问题了。


20200617105340519.png


二.四 字节读取时,中文乱码问题


在fileSrc目录下,新创建一个 rz.txt 文件, 填充内容为:


你好我是两个蝴蝶飞你好我是两个蝴蝶飞


我们读取这个文件,来演示中文乱码问题。


二.四.一 字节数组长度为奇数时


字节数组为奇数时,很容易造成中文乱码。


@Test
    public void read7Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rz.txt");
        InputStream inputStream=new FileInputStream(file);
        StringBuilder sb=new StringBuilder();
        byte[] bytes=new byte[5];
        int len=-1;
        while((len=inputStream.read(bytes))!=-1){
            //依次读取的内容
            String temp=new String(bytes,0,len);
            sb.append(temp);
        }
        System.out.println("输出读取的内容:"+sb.toString());
    inputStream.close();
    }


运行程序:


20200617105348317.png


有很大概率,会将中文进行拆分。


这个例子时,将 byte[5] 转换成 byte[6],换成偶数时:


20200617105352936.png


这个时候,就可能不乱码了。


二.四.二 字节数组长度不被3整除时


上面的字节长度为6时,不乱码,为10时就乱码了。


20200617105359506.png


为12时,就不乱码了,为 14时乱码了,为18时不乱码了。


老蝴蝶建议,接收的字节数组的长度最好是能被3整除的偶数。 读取时,为了方便,常常是1024的整数被。


所以,综合起来就是: 能同时被1024和3整除的偶数。


为了方便,老蝴蝶还是以 1024为主。


二.五 读取文件内容综合


  @Test
    public void read8Test() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"Hello3.txt");
        InputStream inputStream=new FileInputStream(file);
//长度设置成1024
        byte[] bytes=new byte[1024];
        int len=-1;
        while((len=inputStream.read(bytes))!=-1){
            //依次读取的内容
            System.out.println("读取的内容为:"+new String(bytes,0,len));
        }
    inputStream.close();
    }


三. OutputStream和InputStream的应用: 文件复制


文件复制,实际上就是将 InputStream和 OutputStream 结合起来使用, 两者共同使用同一个 字节数组, InputStream将读出的内容批量写入到字节数组里面, OutputStream将字节数组批量写入到文件里面。


三.一 文件复制方法


 /**
     * 复制字节文件
     * @param src 源文件
     * @param desc 目标文件
     * @return
     */
    public static boolean copyBin(String src,String desc) throws Exception{
        //定义两个文件
        File srcFile=new File(src);
        File descFile=new File(desc);
        if(!srcFile.exists()||!srcFile.isFile()){
            throw new RuntimeException("源文件不存在或者源文件是目录");
        }
        //定义InputStream 和 OutputStream
        InputStream inputStream=new FileInputStream(srcFile);
        OutputStream outputStream=new FileOutputStream(descFile);
        //1M 1M的读取
        byte[] bytes=new byte[1024];
        int len=-1;
        //将内容写入到 bytes字节数组里面
        while((len=inputStream.read(bytes))!=-1){
            //将bytes字节数组写入到文件里面
            outputStream.write(bytes,0,len);
        }
        outputStream.flush();
        //关闭流
        outputStream.close();
        inputStream.close();
        return true;
    }


三.二 测试文件复制


复制文件和复制图片类型都可以。


 @Test
    public void copyTest(){
        //复制普通文件
       /* String src="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rz.txt";
        String desc="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rzcopy.txt";*/
       //复制图片
        String src="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"129.png";
        String desc="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"129copy.png";
        try {
            CopyUtils.copyBin(src,desc);
            System.out.println("文件复制成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


运行程序,查看文件系统


20200617105410572.png


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
4月前
|
存储 Java
使用OutputStreamWriter写入数据
使用OutputStreamWriter写入数据
|
C语言 C++ 开发者
C++输入流和输出流介绍
C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。 要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含
81 0
FileReader和FileWriter流
FileReader和FileWriter流
49 0
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
559 0
|
存储 缓存 Java
【Java I/O 流】字节输入输出流:InputStream & OutputStream
本篇介绍字节输入输出流,它们是所有字节流的超类,提供了一些常用方法,我们一起看一下。
78 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
148 0
|
文件存储
IO流的字节输入输出流(InputStream,OutputStream)及文件复制
字节输出流与文件字节输出流 文件存储原理和记事本打开文件原理 OutputStream及FileOutputStream import java.io.FileOutputStream; import java.io.IOException; /* java.io.OutputStream:字节输出
|
存储 缓存 Java
输入流--outputStream
输入流--outputStream
|
存储 Java API
输入流--InputStream
输入流--InputStream
|
消息中间件 前端开发 JavaScript
InputStream 和 OutputStream 基础
大家好,我是指北君。 PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】
InputStream 和 OutputStream 基础