Java IO流体系、FileInputStream字节输入流的使用、解决字节输入流读取中文内容输出乱码的问题

本文深入讲解了Java中IO流的体系结构,包括字节流和字符流的不同应用场景,重点介绍了FileInputStream和FileOutputStream的使用方法,以及如何解决字节流读取中文文件时的乱码问题。
摘要由CSDN通过智能技术生成

IO流的体系:

		字节流							字符流
字节输入流		字节输出流			字符输入流	字符输出流
InputStream		OutputStream		Reader		Writer     (抽象类)
FileInputstream	FileOutputStream	FileReader	Filewriter (实现类)

一、FileInputstream文件字节输入流的使用

作用:
以内存为基准,把磁盘文件中的数据按照字节的形式读入到内存中的流。就是按照字节读取文件数据到内存。
构造器:

public FileInputStream(File path) : 创建一个字节输入流管道与源文件对象接通。
public FileInputStream(String pathName) : 创建一个字节输入流管道与文件路径对接。

方法:

1. public int read() :每次读取一个字节返回,读取完毕会返回-1。一次一个字节读。
读取英文和数字没有问题,但是遇到中文会乱码,其会截断中文。
中文UTF-83个字节。

举例:

        FileInputStream file = new FileInputStream(new File("src/test.txt"));

        int ch = 0; //存储读取的字节
        while ((ch = file.read()) != -1){
            System.out.print((char)ch);
        }



2. public int read(byte[] buffer) : 从字节输入流中读取字节到字节数组中去,
返回读取的字节数量,没有字节可读返回-1。
中文还是会乱码

举例:

        FileInputStream file = new FileInputStream(new File("src/test.txt"));

        byte []buffer = new byte[3]; //3个字节的读,定义一个字节数组
        int len;//存储每次读取的字节数
        while ((len = file.read(buffer)) != -1){
            String rs = new String(buffer,0,len);
            System.out.print(rs);
        }

二、解决字节输入流读取中文内容输出乱码的问题

一个一个字节读取中文输出,一个一个字节数组读取中文输出均无法避免乱码。
如何实现读取可以避免乱码呢?

  1. 可以使用字符流。FileReader。
  2. 使用字节流的话,可以定义一个字节数组与文件的大小刚号一样大,然后全部读取全部字节数据再输出。适用于读取小文件。
        File file = new File("src/test.txt");
        FileInputStream fileInputStream = new FileInputStream(file);

        int length = (int) (file.length());
        byte []buffer = new byte[length];//获取文件大小

        int len = fileInputStream.read(buffer);
        
        String rs = new String(buffer);
        System.out.println(rs);

JDK1.9后,java有自带API,readAllBytes()

        File file = new File("src/test.txt");
        FileInputStream fileInputStream = new FileInputStream(file);

        byte[] bytes = fileInputStream.readAllBytes();
        
        String rs = new String(bytes);
        System.out.println(rs);

小结:字节流并不适合读取文本文件内容输出,读写文件内容建议使用字符流。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值