字节流读取数据的两种方式

  • Post author:
  • Post category:其他




一次读取一个字节数据


读取文件内容


在这里插入图片描述

采用此方法:

一个字节一个的读,肯定会出现汉字乱码,因为汉字是好几个字符组成的

/*
    需求:
        把文件student.owl中的内容读取出来在控制台输出

        FileInputStream:从文件系统中的文件获取输入字节
        FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

    使用字节输入流读数据的步骤:
        1:创建字节输入流对象
        2:调用字节输入流对象的读数据方法【复杂】
        3:释放资源
 */


方法1

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        //FileInputStream(String name)
        FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");

        //调用字节输入流对象的读数据方法

        //方法1
        //int read():从该输入流一次读取一个字节的数据

        //第一次读取数据
        int by = fis.read();
        System.out.println(by);
        System.out.println((char)by);

        //第二次读取数据
        by = fis.read();
        System.out.println(by);
        System.out.println((char)by);

        //再多读取两次
        by = fis.read();
        System.out.println(by);
        by = fis.read();
        System.out.println(by);
        
        //当发现可以用循环的时候,然后找判断条件
        //如果达到文件的末尾, -1
        // 当数据读取完毕,返回值-1

        //释放资源
        fis.close();
    }
}

在这里插入图片描述


优化1

package sockethm;

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

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        //FileInputStream(String name)
        FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");

        //调用字节输入流对象的读数据方法
   
        //方法1。int read():从该输入流一次读取一个字节的数据
        
        int by = fis.read();
        while (by != -1) {
            System.out.print((char)by);
            by = fis.read();    //继续读取
        }

        //释放资源
        fis.close();
    }
}

在这里插入图片描述


优化2

package sockethm;

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

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        //FileInputStream(String name)
        FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");

        //调用字节输入流对象的读数据方法
   
        //方法1。int read():从该输入流一次读取一个字节的数据
        //优化上面的程序
        int by;
        while ((by=fis.read())!=-1) {
            System.out.print((char)by);
        }
        /*
            fis.read():读数据
            by=fis.read():把读取到的数据赋值给by
            by != -1:判断读取到的数据是否是-1
         */
        //释放资源
        fis.close();
    }
}

在这里插入图片描述



一次读取一个字节数组的数据

/*
    需求:把文件fos.txt中的内容读取出来在控制台输出

    使用字节输入流读数据的步骤:
        1:创建字节输入流对象
        2:调用字节输入流对象的读数据方法
        3:释放资源
 */
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo02 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");

        //调用字节输入流对象的读数据方法
        //int read(byte[] b):从该输入流读取最多 b.length个字节的数据到一个字节数组

        byte[] bys = new byte[5];   //每次读取5个字节

        //第一次读取数据
        int len = fis.read(bys);        //这个len获取的不是字节数组的长度,而是实际读取的数据的个数
        System.out.println(len);    //如果bys 没有数据,那么len长度为-1
        //String(byte[] bytes)      将字节数组的数据转到字符串里面,然后输出
//      string的一个构造方法,直接把字节数组变成字符串

//      System.out.println(new String(bys));
 //这样的缺点是,每次都读取数组5长度内容,然后每次都输出这么多
        //第二次读取数据不足5的时候,依旧会输出5个内容,会包含上次读到的内容
        System.out.println(new String(bys,0,len));  //0到实际读取长度
   //每次读到的内容长度就是len的长度,当最后一次不足5的时候,读到多少,就输出多少
        //第二次读取数据
        len = fis.read(bys);
        System.out.println(len);


//      System.out.println(new String(bys));
        System.out.println(new String(bys,0,len));

        //第三次读取数据
        len = fis.read(bys);
        System.out.println(len);
        //   System.out.println(new String(bys));     //这次只读了四个,所以还有一个上次读的没有替换掉
        //String(byte[] bytes, int offset, int length) 这个方法是只显示数组长度的内容
        System.out.println(new String(bys,0,len));

        //再多读取两次
        len = fis.read(bys);
        System.out.println(len);
        len = fis.read(bys);
        System.out.println(len);    //当实际读取长度为-1时,说明读到了末尾
        /*
            hello\r\n
            world\r\n

            第一次:hello
            第二次:\r\nwor
            第三次:ld\r\nr

         */

        //释放资源
        fis.close();
    }
}

在这里插入图片描述


优化1

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

public class FileInputStreamDemo02 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("SocketXml\\src\\student.owl");

        byte[] bys = new byte[1024]; //一般给1024及其整数倍
        int len;	 //这个len是实际每次读取的数据的个数

        while ((len=fis.read(bys))!=-1) {
            System.out.print(new String(bys,0,len));
        }

        //释放资源
        fis.close();
    }
}

在这里插入图片描述

参考链接:


一次读取一个字节数据



一次读取一个字节数组的数据



版权声明:本文为dd_Mr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。