IO流详解

一、什么是IO流

  1. IO流即存储和读取文件数据的解决方案
  2. I:input即程序读取文件数据
  3. O:output即程序写出文件数据
  4. 因为IO流在工作时像流水一般通过字节或则字符读取或写出数据的所以成为IO流
  5. IO流分为字符流和字节流,字符流只能处理纯文本文件,字节流能处理所有文件

二、IO流的使用 

1、字节输入输出流

a.txt原本内容为

defg

public class FileIOStream {
    public static void main(String[] args) throws IOException {
        String str = "abc";
        //创建输出流第二个参数为true开启续写
        FileOutputStream fos = new FileOutputStream("a.txt", true);
        //将字符串转化成字节写入文件
        fos.write(str.getBytes());
        //关闭资源占用
        fos.close();

        //创建第二个输出流用于拷贝
        FileOutputStream copyFos = new FileOutputStream("b.txt");
        //创建读取流
        FileInputStream fis = new FileInputStream("a.txt");
        //创建一个字节数组容器用于读取
        byte[] bytes = new byte[3];
        //记录读取长度
        int len;
        //传入字节数组容器,如果不传则返回1个字节不返回长度
        while ((len = fis.read(bytes)) != -1 ){
            //输出并将数据写入b.txt文件写入长度为读取到的数据字节长度
            System.out.println(new String(bytes, 0, len));
            copyFos.write(bytes, 0, len);
        }
    }
}

 运行后a.txt

defg

abc

b.txt

defg

abc

 注意:使用字节输入流读取中文时容易出现乱码,像这样:

a.txt

a啊这

 再运行以上代码打印出

a�
��

 idea默认使用的时Unicode的utf-8编码格式,中文字符占3个字节。

如果是GBK编码则中文占用两个字节

String str = "a啊这";
System.out.println(Arrays.toString(str.getBytes()));//UTF-8
System.out.println(Arrays.toString(str.getBytes("GBK")));//GBK

输出结果: [97, -27, -107, -118, -24, -65, -103]
                   [97, -80, -95, -43, -30]

示例代码中每次读取3个字节

第一次读取到了a和三分之二个“啊”字

第二次读取三分之一的“啊”和三分之二的“这”

第三次读取剩下的三分之一的“这”

2、字符输入流

使用字符流读取时,字符流就会帮助我们检查编码规则。

public class ReaderTest {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("a.txt");
        int a;
        while ((a =  fileReader.read()) != -1){
            System.out.println((char)a);
        }
        fileReader.close();
    }
}

输出内容:a

                 啊

                 这

 需要注意的时字符流读取数据会将读取到的二进制码转变成十进制,我们把(char)强转删除就能看到。

输出内容:97

                  21834
                  36825

 字符流在初始化时会创建一个长度为8192字节(8KB)的字节数组作为缓冲区。

在执行read方法时会从目标文件中试图获取8KB的数据,然后从缓冲区中读取数据。

如果读完则会继续像目标文件获取数据,如果目标文件没有数据了则返回-1。

3、字符输出流

与字符出入流相似,字符输出流也有缓冲区。

字符输出流在执行write方法时会先将数据写入缓冲区而不是直接写入目标文件。

当缓冲区写满(8KB)时数据会一次性从缓冲区写入文件。

除了缓冲区写满,调用flush和close方法也会将缓冲区的数据写入目标文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值