字节流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


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

相关文章
|
18小时前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
3天前
|
云安全 监控 安全
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1000 5
|
10天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
680 40
|
13天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1113 41
|
13天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
816 70
大厂CIO独家分享:AI如何重塑开发者未来十年
|
9天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
497 31
|
16天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
957 59
Meta SAM3开源:让图像分割,听懂你的话
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
具身智能核心突破:物理模拟器与世界模型协同技术拆解
本文系统综述了物理模拟器与世界模型在具身智能发展中的协同作用,提出五级智能机器人分类体系(IR-L0至IR-L4),分析其在运动、操作与交互中的进展,并对比主流仿真平台与世界模型架构,探讨其在自动驾驶与关节机器人中的应用及未来挑战。
160 113