IO流及字符集

IO流

作用:

        用于读写文件中的数据

分类:

                图来自黑马程序员网课 

        纯文本文件:Windows自带的记事本打开能读懂的文件,word excel不是纯文本文件

        图来自黑马程序员网课 

 FileOutputStream:

        操作本地文件的字节输出流,可以把程序中的数据写到本地文件中

        书写步骤:

        1)创建字节输出流对象

                参数是字符串表示的路径或者File对象都是可以的

                如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

                如果文件已经存在,则会清空文件

        2)写数据

                write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII码上对应的字符

                97--》a

        3)释放资源

                每次使用完流之后都要释放资源

package com.lazyGirl.iodemo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("a.txt");
        FileOutputStream fos = new FileOutputStream("a.txt");
        fos.write(97);
        fos.close();

    }
}

输出:

写数据的3种方式:

        图来自黑马程序员网课 

        

package com.lazyGirl.iodemo;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamDemo2 {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("a.txt");

        byte[] bytes = {98,99,100,101,102,103,104,105};
        fos.write(bytes,1,2);

    }
}

        输出:

写数据的两个小问题:

换行写和续写

package com.lazyGirl.iodemo;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class ByteStreamDemo2 {
    public static void main(String[] args) throws IOException {

        FileOutputStream fos = new FileOutputStream("a.txt",true);

//        byte[] bytes = {98,99,100,101,102,103,104,105};
        String str = "hhhhhhhhhhh";
        byte[] bytes = str.getBytes();
//        System.out.println(Arrays.toString(bytes));
        fos.write(bytes);
        //换行 windows: \r\n Linux : \r mac: \r

        String wrap = "\r\n";
        byte[] wrapBytes = wrap.getBytes();
        fos.write(wrapBytes);

        String str2 = "6666666666666666";
        byte[] bytes2 = str2.getBytes();
        fos.write(bytes2);
        fos.close();

    }
}

输出:

FileInputStream:

        操作本地文件的字节输入流,可以把本地文件中的数据读到程序中来

书写步骤:

        1)创建字节输入流对象

        细节一:如果文件不存在,就直接报错

        2)读数据

        细节一:一次读一个字节,读出来的数数据在ASCII上对应的数据

        细节二:读到文件末尾,read方法返回-1 空格对应的是32

        3)释放资源

package com.lazyGirl.iodemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
        //按字符读,读不到返回-1
        int b1 = fis.read();
        System.out.println((char)b1);



        fis.close();
    }
}

输出:

循环读取:

package com.lazyGirl.iodemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
        //按字符读,读不到返回-1
//        while (fis.read() != -1){
            System.out.print((char)fis.read());
//        }
//        System.out.println();
        int b;
        while ((b = fis.read()) != -1){
            System.out.print((char)b);
        }
        fis.close();
    }
}

输出:

 

 文件拷贝:

package com.lazyGirl.iodemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class InputDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos = new FileOutputStream("copy.txt");
        int b;
        while ((b = fis.read()) != -1)
            fos.write(b);
        fos.close();
        fis.close();
    }

}

        输出:

         

文件读取的问题:

        弊端:FileInputStream一次读写一个字节,速度太慢了

                        

                                图来自黑马程序员网课

                注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满

        

                图来自黑马程序员网课

         文件拷贝:

        

package com.lazyGirl.iodemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class InputStreamDemo2 {
    public static void main(String[] args) throws IOException {

        long start = System.currentTimeMillis();
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos = new FileOutputStream("copy.txt");
        byte[] buf = new byte[1024 * 1024 * 5];
        int len = fis.read(buf);
        while ((len = fis.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }
        fos.close();
        fis.close();

        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

        提升速度 

        输出:

try...catch异常处理:

         try ...catch...finally 特点:finally里面的代码一定会执行,除非虚拟机停止

        接口:AutuCloseable 在特定的情况下,可以自动释放资源

package com.lazyGirl.iodemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class InputStreamDemo2 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos = new FileOutputStream("copy.txt");
        try(fis;fos) {
            long start = System.currentTimeMillis();
            byte[] buf = new byte[1024 * 1024 * 5];
            int len;
            while ((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
            long end = System.currentTimeMillis();
            System.out.println(end - start);
        } catch (IOException e) {
           e.printStackTrace();
        }
    }
}

        字节流读取文件的时候,文件中不要有中文        

计算机的存储规则:

字符集:

ASCII 字符集:存储英文,一个字节就足以 128个字符 0~127

        图来自黑马程序员网课

GB2312字符集:

 

                图来自黑马程序员网课 

        1980年发布,1981年5月1日起实施简体中文汉字编码国家标准,收录7445个图形字符,其中包括6763个简体汉字

BIG5字符集:

        台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施

GBK字符集:

        2000年发布,收录21003个汉字,包括国家标准GB13000-1中的全部中日韩汉字和BIG5编码中的所有汉字

        windows系统默认使用的是GBK,系统显示ANSI

        一个汉字使用两个字节存储

        

                图来自黑马程序员网课 

Unicode字符集:

        国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言,跨平台的文本信息转换。

        

 

 

                        以上3个图来自黑马程序员网课 

乱码:

         原因1:读取数据时未读完整个汉字

        

                图来自黑马程序员网课

         原因2:编码和解码不统一

   

  避免乱码:

        1. 不要用字节流读取文本文件

        2. 编码解码时使用同一个码表,同一个编码方式

扩展:字节流读取中文会乱码,但是拷贝不会乱码(信息不会丢失)

package com.lazyGirl.iodemo;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class CharSetDemo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "爱你ai";
        byte[] bytes = str.getBytes();
        System.out.println(Arrays.toString(bytes));

        byte[] bytes2 = str.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        //解码
        String str2 = new String(bytes, "GBK");
        String str3 = new String(bytes);
        System.out.println(str2);
    }
}

输出:

 字符流:

        字符流的底层就是字节流

        字符流 = 字节流 + 字符集

 特点:

        输入流:一次读一个字节,遇到中文时,一次读多个字节

        输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景:

        对于纯文本文件进行读写操作

        

         以上2张图来自黑马程序员网课

FileReader:

         书写步骤:

          1)创建字符输入流对象

   

                图来自黑马程序员网课

         2)读取数据

        

        图来自黑马程序员网课 

        3)释放资源

        空参read方法:

        

package com.lazyGirl.iodemo;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class CharStreamDemo1 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("a.txt");
        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.print(ch + " ");
        }
        fr.close();

    }
}

 有参read方法:

 有参的read方法:读取数据,解码,强制转换三步合并

package com.lazyGirl.iodemo;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class CharStreamDemo1 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("a.txt");
//        int ch;
//        while ((ch = fr.read()) != -1) {
//            System.out.print(ch + " ");
//        }
//        fr.close();
//
        char[] chars = new char[2];
        int len;
        while ((len = fr.read(chars)) != -1) {
            System.out.print(new String(chars, 0, len) + " ");
        }


    }
}

        输出: 

 FileWriter构造方法:

        

    成员方法:

        

书写步骤: 

         1)创建字符输出流对象

                细节一:参数是字符串表示的路径或者File对象都是可以的

                细节二:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

                细节三:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

          2)写数据

                如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

          3)释放资源

原理解析:

                图来自黑马程序员网课 

        

                        图来自黑马程序员网课 

总结:

字节流和字符流的使用场景:

字节流:拷贝任意类型的文件

字符流:读取纯文本文件中的数据 往纯文本文件中写出数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/710626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer 借助Navcate做定时备份的脚本

首先创建SQLServer链接,然后在Query标签种创建一个查询 查询内容如下 use ChengYuMES declare ls_time varchar(1000) declare ls_dbname varchar(1000) set ls_time convert(varchar, getdate(), 112) _ replace(convert(varchar, getdate(), 108), :, )-- 需…

【单片机毕业设计选题24006】-基于STM32的智能鱼缸系统

系统功能: 采用STM32最小系统板控制,采集传感器数据显示在OLED上 并可通过按键或蓝牙APP控制两路继电器和舵机。 1. 使用DHT11模块采集环境温湿度 2. 使用DS18B20采集鱼缸水温 3. 继电器控制水泵(水位过低时加水) 4. 继电器模拟控制增氧…

【docker】如何解决artalk的跨域访问问题

今天折腾halo的时候,发现artalk出现跨域访问报错,内容如下。 Access to fetch at https://artk.musnow.top/api/stat from origin https://halo.musnow.top has been blocked by CORS policy: The Access-Control-Allow-Origin header contains multipl…

汽车电子零部件(15):车载摄像头

前言: 在车载IVI、智能座舱系统中,有一个重要的应用场景就是视频。视频应用又可分为三种,一种是直接解码U盘、SD卡里面的视频文件进行播放,一种是手机投屏,就是把手机投屏软件已视频方式投屏到显示屏上显示,另外一种就是对视频采集设备(主要就是摄像头Camera)的视频源…

FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》

系列文章 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》 说明 上一篇 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》 主要讲了一下如何快速搭建一个 STM32 裸机工程,其实 STM32CubeMX 可以生成 FreeRTOS 的工程,这就…

扣子arixv论文检索工作流开源(Sam老师作品)

因为在扣子上找不到好用的AI论文检索Bot,之前借助工作流和arxiv.org API开发了一个工具,当时写了一篇介绍。 核心流程比较简单,但有很多同学咨询了解,今天抽了点时间把工作流完全开源了。为了方便对比,在公共Team中通过…

LabVIEW开发中的常见通讯协议详解

介绍LabVIEW开发中常见的通讯协议,包括RS-232、RS-485、I2C、SPI、CAN、Ethernet、Modbus和GPIB等。通过对各协议的具体内容、特点、使用范围及注意事项进行全面解析,帮助开发者选择合适的通讯协议,提高系统性能和可靠性。 1. RS-232 内容&a…

进口二手RS FSH4规格3.6G罗德与施瓦茨 FSH6参数

Rohde & Schwarz FSH4 的规格包括&#xff1a; 频率范围从 9 kHz 到 3.6 GHz 高灵敏度&#xff08;<-141dBm&#xff08;1Hz&#xff09;&#xff0c;或使用可选前置放大器<-161dBm&#xff08;1Hz&#xff09;&#xff09; 低测量不确定度&#xff08; 内部跟踪发生…

开源医疗大模型Llama3-Aloe-8B-Alpha,性能超越 MedAlpaca 和 PMC-LLaMA

前言 近年来&#xff0c;大型语言模型 (LLM) 在医疗领域展现出巨大潜力&#xff0c;能够帮助医生和研究人员更快地获取信息、分析数据&#xff0c;并提高医疗服务效率。然而&#xff0c;目前市场上大多数医疗 LLM 都是闭源模型&#xff0c;限制了其在学术研究和应用领域的推广…

【Golang】Go语言中defer与return的精妙交织:探索延迟执行与返回顺序的微妙关系

【Golang】Go语言中defer与return的精妙交织&#xff1a;探索延迟执行与返回顺序的微妙关系 大家好 我是寸铁&#x1f44a; 总结了一篇defer 和 return 返回值 的执行顺序探讨的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 在Go语言中&#xff0c;defer 和return是两…

宝藏速成秘籍(5)插入排序法

一、前言 1.1、概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;其工作原理类似于人们整理一手扑克牌。插入排序通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入…

log4j漏洞学习

log4j漏洞学习 总结基础知识属性占位符之Interpolator&#xff08;插值器&#xff09;模式布局日志级别 Jndi RCE CVE-2021-44228环境搭建漏洞复现代码分析日志记录/触发点消息格式化 Lookup 处理JNDI 查询触发条件敏感数据带外漏洞修复MessagePatternConverter类JndiManager#l…

15. STUN协议和ICE工作原理

NET介绍 NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。 在大多数网络环境中&#xff0c;我们都需要通过 NAT 来访问 Internet。 NAT作为一种缓解IPv4公网地址枯竭的过渡技术&#xff…

[C++]使用C++部署yolov10目标检测的tensorrt模型支持图片视频推理windows测试通过

【测试通过环境】 vs2019 cmake3.24.3 cuda11.7.1cudnn8.8.0 tensorrt8.6.1.6 opencv4.8.0 【部署步骤】 获取pt模型&#xff1a;https://github.com/THU-MIG/yolov10训练自己的模型或者直接使用yolov10官方预训练模型 下载源码&#xff1a;https://github.com/laugh12321/yol…

五、Nginx配置文件-server模块

目录 一、概述 二、虚拟主机设置的三种形式 1、基于端口号配置 2、基于域名配置 3、基于ip配置 三、常用参数 1、listen 2、server_name 3、location 3.1、常见的Nginx正则表达式 3.2、location正则&#xff1a; 3.3示例 4、root 5、index 6、error_page 7、deny…

长亭培训加复习安全产品类别

下面这个很重要参加hw时要问你用的安全产品就有这个 检测类型产品 偏审计 安全防御类型 EDR类似于杀毒软件 安全评估 任何东西都要经过这个机械勘察才能上线 安全管理平台 比较杂 比较集成 审计 漏扫 评估 合在这一个平台 也有可能只是管理 主机理解为一个电脑 安了终端插件…

LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等

前言 自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮[自然语言处理]领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都…

SM5101 SOP-8 充电+触摸+发执丝控制多合一IC触摸打火机专用IC

SM5101 SOP-8 2.7V 涓流充电 具电池过充过放 触摸控制 发热丝电流控制多功能为一体专用芯片 昱灿-海川 SM5101 SOP-8 充电触摸发执丝控制多合一IC触摸打火机方案 &#xff01;&#xff01;&#xff01; 简介&#xff1a; SM5101是一款针对电子点烟器的专用芯片&#xff0c;具…

阻塞IO、非阻塞IO、IO复用的区别 ?(非常详细)零基础入门到精通,收藏这一篇就够了

前言 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型&#xff0c;供大家参考学习。 一、什么是IO 计算机视角理解IO: 对于计…

苹果电脑装虚拟机和双系统的区别 苹果笔记本虚拟机和双系统哪个好 虚拟机能装MacOS吗 虚拟机类似的软件

Mac电脑用户在需要使用Windows操作系统的软件时&#xff0c;通常会面临两个选择&#xff1a;安装双系统或使用虚拟机。两种方式各有优缺点&#xff0c;适用于不同的使用场景。本文将详细分析和说明Mac电脑装双系统和虚拟机之间的区别&#xff0c;帮助用户选择最适合自己的方案。…