字节流读取数据的方式和问题

本文探讨了如何通过使用缓冲流减少程序与磁盘交互,提高程序性能,与字节流(无缓冲)的效率低对比,并解释了字节流和字符流的区别。重点介绍了FileInputStreamTest示例中字节流的局限和缓冲流的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道,程序与磁盘的交互相对于内存运算是很慢的,容易成为程序的性能瓶颈。减少程序与磁盘的交互,

  • 是提升程序效率一种有效手段。缓冲流,就应用这种思路:普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,
  • 缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,
  • 减少了交互次数。 字节流是程序直接和磁盘交互,没用用到缓冲流,效率低下。
  • 但是字节流可以读取任何文件,字符流只能读取纯文本内容的数据
  • 字节流是数据通过字节的方式以通道进行传输,先进先出。必须有输入和输出两个动作完成,一个读取,一个写入。两个方法实现。
public class FileInputStreamTest {
  public static void main(String[] args) throws IOException {
   File file = new File("D:\\Test.txt");
   write(file);
   String read = read(file);
  System.out.println(read);
}
/**
 * 使用的是字节输出流FileOutputStream 字节流没有用到缓冲流,效率低
 * 写入txt文件中,输出流
 * @param file
 */
public static void write(File file) throws IOException {
    FileOutputStream fos = new FileOutputStream(file);
    String s = "松下问童子,言师采药去。只在此山中,云深不知处.";
    System.out.println(s.getBytes());
    fos.write(s.getBytes());
    fos.close();
}

/**
 * 使用的字节输入流FileInputStream 字节流没有用到缓冲流,效率低
 * 读取txt文件中,输入流
 * @param file
 * @throws IOException
 */
public static String read(File file) throws IOException {
    FileInputStream fis = new FileInputStream(file);
    //先定义读取的字节存放到该字节数组下容量为1024,可以存储1024个字节为1KB
    byte[] bytes = new byte[1024];
    //将存储到字节数组的内容拿出来存到String1Bulider中
    StringBuilder stringBuilder = new StringBuilder();
    //计算一下循环次数
    int i =0;
    /**
     * 从该输入流读取最多len字节的数据为字节数组。 如果len不为零,该方法将阻塞,直到某些输入可用; 否则,不会读取字节,并返回0 。
     * 重写:
     * read在类 InputStream
     * 参数
     * b - 读取数据的缓冲区。
     * off - 目标数组 b的起始偏移量
     * len - 读取的最大字节数。
     * 结果:读取到缓冲区的总字节数,如果没有更多的数据,因为文件的结尾已经到达, -1 。
     *
     * UTF-8编码中,一个中文字符是3个字节
     * 如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。
     */
     while((fis.read(bytes, 0, 3))!= -1){
         i++;
         //bytes数组一直被覆盖
         System.out.println("byte数组长度一直为"+bytes[4]);
         /**
          * bytes - 要解码为字符的字节
          * offset - 要解码的第一个字节的索引
          * length - 要解码的字节数
          */
         stringBuilder.append(new String(bytes,0,3));
    }
    System.out.println("20个汉字有60个字节,每次读取三个字节总共循环了"+i+"次");
    fis.close();
    return stringBuilder.toString();
} }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值