IO流
IO流的分类
      FileOutputStream
     FileOutputStream写数据的三种方式
     换行和续写
     FileInputStream
     FileInputStream循环读取
文件拷贝
IO流中不同JDK版本捕获异常的方式
字符集详解(ASCII,GBK)
     ASCII字符集
     计算机的存储规则(GBK)
     计算机的存储规则(Unicode)

IO流

IO流:存储和读取数据的解决方案,用于读写文件中的数据(可以读写文件,或网络中的数据…)
可以把程序中的数据保存到本地文件当中(写出数据output)
还可以把本地文件中的数据加载到程序当中(读取数据input)

IO流的分类

在这里插入图片描述
在这里插入图片描述
纯文本文件:Windows自带的记事本打开能读懂
在这里插入图片描述
在这里插入图片描述

FileOutputStream

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

书写步骤

  1. 创建字节输出流对象
    细节1:参数是字符串表示的路径或者是File对象都是可以的
    细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
    细节3:如果文件已经存在,则会清空文件
  2. 写数据
    细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
  3. 释放资源
    每次使用完流之后都要释放资源
	//创建对象
    FileOutputStream fos = new FileOutputStream("myio\\a.txt");
    //写出数据
    fos.write(97);
    //释放资源
    fos.close();

会根据我们创建对象的语句文件跟程序之间产生一个数据传输的通道,再去通过write方法写出数据,数据在这个通道上传输,close就是关闭这个通道

FileOutputStream写数据的三种方式

在这里插入图片描述

换行和续写

换行:再次写出一个换行符就可以了
windows:\r\n
Linux:\n
Mac:\r
细节:
在windows操作系统当中,java对回车换行进行了优化。虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。

续写:
如果想要续写,打开续写开关即可
开关位置:创建对象的第二个参数
默认false:表示关闭续写,此时创建对象会清空文件
手动传递true:表示打开续写,此时创建对象不会清空文件

FileInputStream

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

书写步骤

  1. 创建字节输入流对象
    细节1:如果文件不存在,就直接报错
    Java为什么会这么设计呢?
    输出流:不存在,创建。把数据写到文件中
    输入流:不存在,而是报错呢? 数据在哪?
    因为创建出来的文件是没有数据的,没有任何意义。所以Java就没有设计这种无意义的逻辑,文件不存在直接报错
  2. 读数据
    细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字
    细节2: 读到文件末尾了,read方法返回-1。
  3. 释放资源
    细节1:每次使用完流必须要释放资源。

FileInputStream循环读取

//1.创建对象
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        //2.循环数据
        //read:表示读取数据,而且是读取一个数据就移动一次指针
        int b;
        while ((b = fis.read()) != -1) {
            System.out.print((char) b);
        }
        //3.释放资源
        fis.close();

文件拷贝

在这里插入图片描述

int b;
while ((b = fis.read())!=-1){
fos.write(b);
}
程序运行在内存中,在代码中创建了输出流和输入流对象,也就是说我们的程序跟数据源和目的地产生了传输数据的通道,代码中我们边读边写,b临时变量记录当前读取到的数据,在调用read方法去读取数据把读取到的数据存储到变量b当中,再用write方法把数据写到目的地。

弊端:一次读写一个字节

FilelnputStream一次读多个字节

在这里插入图片描述
注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满
在这里插入图片描述
假如数据源:abcde

int len;//记录当前读了多少个数据
byte[] bytes = new byte[2];//表示读取到的数据 
len = fis.read(bytes);//读了两个,len=2 byte数组里面存ab,指针指向c
System.out.println(new String(bytes));//打印ab
len = fis.read(bytes);//还是读取两个 len=2 byte里面存入cd 原来的ab被覆盖 指向e
System.out.println(new String(bytes));
len = fis.read(bytes);//尽可能装满数组但是数据源只剩下一个没有两个,把e存入原来的c被覆盖,只读了一个数据d没有覆盖,len=1
System.out.println(new String(bytes));

修改:System.out.println(new String(bytes,0,len));//从0索引开始把len个元素变成字符串

I0流中不同JDK版本捕获异常的方式

特点:finally里面的代码一定被执行,除非虚拟机停止
接口:AutoCloseable
特点:特定的情况下,可以自动释放资源
在这里插入图片描述
jdk7中不能把所有的创建对象的代码写在小括号当中,只有实现AutoCloseable接口才可以,表示当整个try,catch执行完毕之后,小括号中的流会自动释放资源.

字符集详解(ASCII,GBK)

public static void main(String[] args) throws IOException {
        //字节流读取中文会出现乱码
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        int b;

        while((b = fis.read()) != -1){
            System.out.print((char)b);
        }

        fis.close();
    }
kanwozhenshuai
666kanwozhenshuai
666æ’’é’ç–¯

存储英文,一个字节就足以

ASCII字符集

在这里插入图片描述

计算机的存储规则(英文)

在这里插入图片描述
在这里插入图片描述

ASCI编码规则:前面补0,补齐8位
ASCII解码规则:直接转成十进制
编码: 把字符集当中查询到的数据,按照一定的规则进行计算,变成真实的实际存储在硬盘当中二进制数据
解码:把实际存储到硬盘上的二进制数据按照一定的规则进行计算变成字符集当中对应的数字

  1. GB2312字符集:1980年发布,1981年5月1日实施的简体中文汉字编码国家标准收录7445个图形字符,其中包括6763个简体汉字
  2. BIG5字符集:台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施
  3. GBK字符集:2000年3月17日发布,收录21003个汉字:包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字
    系统显示:ANS!windows系统默认使用的就是GBK。
  4. Unicode字符集:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。

计算机的存储规则(GBK)

英文

英文用一个字节存储,完全兼容ASCII在这里插入图片描述
GBK英文编码规则:不足8位,前面补0

汉字

在这里插入图片描述
在这里插入图片描述

前面是高位字节,后面是低位字节
规则1:汉字两个字节存储
规则2:高位字节二进制一定以1开头,转成十进制之后是一个负数
GBK汉字编码规则:不需要变动

计算机的存储规则(Unicode)

英文

在这里插入图片描述
UTF-16编码规则:用2~4个字节保存
UTF-32编码规则:固定使用四个字节保存
UTF-8编码规则:用1~4个字节保存
UTF-8编码规则:ASCII用一个字节表示,简体中文用三个字节表示
在这里插入图片描述

汉字

在这里插入图片描述

为什么会乱码???

原因1:读取数据时未读完整个汉字
原因2:编码和解码时的方式不统一

如何不产生乱码?
1,不要用字节流读取文本文件
2,编码解码时使用同一个码表,同一个编码方式

java中编码的方法

在这里插入图片描述

java中解码的方法

在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐