IO流-进一步学习

本文介绍了Java中使用FileInputStream进行文件读取的操作,包括创建字节输入流对象、读取数据和释放资源。讨论了read方法的使用,当文件内容少于读取次数时,后续调用会返回-1。文章还提到了字节流处理ASCII和GBK等字符集的问题,以及大文件拷贝的优化方法,如使用缓冲区提高效率。最后,讨论了资源释放的finally块和Java的AutoCloseable接口。
摘要由CSDN通过智能技术生成

FileInputStream操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
书写步骤:
1.创建字节输入对象。
2.读数据。
3.释放资源。
我写了代码块,来演绎上述操作:

 FileInputStream stream=new FileInputStream("Game\\\\a.txt");
        System.out.println((char) stream.read());
        System.out.println((char)stream.read());
        System.out.println((char)stream.read());
        System.out.println((char)stream.read());
        System.out.println((char)stream.read());
        stream.close();

其中,read方法就是将文件中的字节调用到程序中,其中(char)是强制转换,把我们看不懂的那些数字转化成为看得懂的。
那有朋友就要问了,如果文件中一共只有五个字节,但是我read方法调用了六次会发生什么,没关系,我们写一写,跑一下就知道了,如下:

 FileInputStream stream=new FileInputStream("Game\\\\a.txt");
        System.out.println((char) stream.read());
        System.out.println((char)stream.read());
        System.out.println((char)stream.read());
        System.out.println((char)stream.read());
        System.out.println((char)stream.read());
         System.out.println((char)stream.read());
	  stream.close();

此时,运行出来的结果是空的,什么都没有,将char强转去掉以后,会打印-1。
接下来,说一说字节输入流的小细节
1.输入流中文件不存在会报错,这使我们想起了输出流中的文件不存在会自动添加文件(前提是父级目录要存在)。
2.写数据:
一次读取一个字节,读出来的是数据在ASCII上对应的数字,读到文件末尾时,会返回-1.
3.释放资源
每次使用完流之后记得释放资源。
然后,我们介绍一下字节输入流的循环读取
在之前,我们学习了输入流的读取文件的方法,但是一次只能读取一个字节,字节一多,会非常麻烦,所以我们会用其他办法来读取字节多的文件。
如下:

 FileInputStream stream=new FileInputStream("Game\\\\a.txt");
        int b;
        while (( b=stream.read())!=-1){
            System.out.print((char) b);
        }


利用循环读取,我们可以明白拷贝的逻辑,核心思想就是:边读边写

1.创建对象,读和写的都需要创建。
2.拷贝
核心思想:边读边写

 FileInputStream stream=new FileInputStream("Game\\\\a.txt");
        FileOutputStream fis=new FileOutputStream("Game\\\\b.tet");
        int b;
        while (( b=stream.read())!=-1){
         fis.write(b);
        }
	  fis.close();
        stream.close();

大文件的拷贝:

 long start=System.currentTimeMillis();
        FileInputStream stream=new FileInputStream("Game\\\\a.txt");
        FileOutputStream fis=new FileOutputStream("Game\\\\b.tet");
        int b;
        byte b1[]=new byte[1024*1024*10];
        while (( b=stream.read(b1))!=-1){
         fis.write(b1,0,b);

        }
        long fin=System.currentTimeMillis();
        System.out.println(fin-start);
        stream.close();

    }
}


其中我们将b1这个数组传输到read方法中的目的是将读取的数据缓存到数组中,这样可以提高效率。所以大文件的拷贝一般是这样拷贝的。
之前我的博客中曾经写过,try catch语句其实还有一个语句叫做finally代码块,finally代码块中的代码是一定会执行的,我之前也提到过,这个很重要,因为IO流中会经常用到这个语句,用作资源的释放。咱们知道,被finally控制的语句一定会执行,除非JVM退出。
但是如果我们使用try catch语句的话,会太过麻烦,还会有嵌套,所以在JDK7的时候,JAVA推出了一个接口,名字叫做AutoCloseable(关闭)在特定情况下,调用这个接口,可以自动释放资源。
在博主自己写的代码中,一般会直接抛出IOException,因为博主水平低,所以觉得简洁明了。

在计算机中,任意数据都是以二进制的形式来存储的,一个0或者一个1,都是用一个bit来存储的,八个bit叫做一个字节,计算机在存储英文的时候,一个字节就可以了
1.ASCLL字符集,其实就是一个编码表,在ASCLL字符集中,最大的数字是127,而字符集是从0开始的,所以ASCLL字符集一共有128位,比如说a这个字母,在查询ASCLL字符集以后得出其对应的数字是,1100001,以供只有7位,不满足计算机要求的8个bit的要求,所以计算机会开始编码,也就是在数字前面补0,补齐8位。在解码时,直接转成10进制,也就是97,然后再查询ASCLL,读取到英文a。
2.如果是汉字呢?我们也有属于自己的字符集,在windows系统中默认使用的就是GBK字符集,而美国也弄出来了一套字符集,叫做Unicode字符集,是国际标准字符集,将世界的各种语言的每一个字符定义一个唯一的编码,以满足跨语言,跨平台的文本信息转换。
3.GBK完全兼容ASCLL,在GBK中汉字对应的数字非常长,有两个字节,所以需要两个字节储存,这也解释了如下代码跑出来的为啥是乱码
FileInputStream fis=new FileInputStream(“Game\\a.txt”);
int b;
while ((b=fis.read())!=0){
System.out.print((char) b);
}
fis.close();
在文件中,我写了中文,因为字节流是一个字节一个字节的流,而汉字是两个字节才能存储,所以会出现乱码。高位字节二进制一定以1开头,转成十进制之后是一个负数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值