FileInputStream.read()方法为什么是顺序读取

FileInputStream.read()方法为什么是顺序读取  


|举报|字号 订阅

import java.io.*;
public class TestFileInputStream {
  public static void main(String[] args) {
    int b = 0;
    FileInputStream in = null;
    try {
      in = new FileInputStream("d:\\share\\java\\io\\TestFileInputStream.java");
    } catch (FileNotFoundException e) {
      System.out.println("找不到指定文件");
      System.exit(-1);
    }
   
    try {
      long num = 0;
      while((b=in.read())!=-1){
        System.out.print((char)b);
        num++;
      }
      in.close(); 
      System.out.println();
      System.out.println("共读取了 "+num+" 个字节");
    } catch (IOException e1) {
      System.out.println("文件读取错误"); System.exit(-1);
    }
  }
}
 
read()方法我知道是读一个字节,如果用while循环读取的话,为什么他第二次循环的时候就自动read后面的字节了呢?不知道内存里是怎么分配的,你能给我解释一下吗?
还有我现在学JAVA没什么方向,不知道先学什么后学什么,哪个方面才是重点?
---------------------------------------------------- 巨牛B的分割线---------------------------------------------------------
首先回答你第一个问题:
1、如果用while循环读取的话,为什么他第二次循环的时候就自动read后面的字节了呢?
解答:要解释为什么会自动读取后面的字节,首先需要了解大体上文件在硬盘物理结构上的存取方式。这涉及到很多很多专业知识,比如文件系统等,简单来说就是,当你保存文件的时候步骤基本上是:操作系统首先在DIR区中找到空区写入文件名、大小和创建时间等相应信息,然后在Data区找到闲置空间将文件按照簇尽可能找到连续的数据区,依次将写入流从头开始每个字节进行顺序保存。当要进行文件的读取,Java封装的FileInputStream.read方法也会调用操作系统的API依次读取这些数据。在读取文件数据的时候必须是顺序的,不可能说先读取第一个字节,后读取倒数第二个字节。循环读取的时候就read方法将读取的位置++,因此造成每次read都是顺序读取后面的字节,直到遇到文件末尾标记。
另外说一下读取出来的每一个字节在你这个程序中的保存方式:
文件流FileInputStream的读取是单向的,也就是说从第一个字节到最后一个字节。如果文件总共|1|2|3|4|5|个字节,那么文件读取的顺序肯定是12345,假设当前已经读到3,那么接下来要么你停止读取,要么你读取4,不可能再回头读取2和1,也不能直接去读取5。通过 in.read()读取出来的数据是个临时变量,java会自动在堆中为它分配一个内存空间,但是党 in.read()执行结束后,垃圾回收器会立刻将其删除,因此在你这个程序中,读取出来的文件其实只保存了最后一个字节,这个字节放在b变量中。如果你想保存整个文件数据,你可以建立一个与文件长度等长的byte数组。
 
接下来回答你第二个问题:
2、Java的发展方向,目前来说就是J2EE和J2SE(Mobile)Java嵌入式开发。按照找工作容易程度来说,J2EE比较好。
要走J2EE方向,首先学习Java的基础知识,你可以自学我们上学期学的《Java核心技术》,然后学习JSP编程,再然后就是Struts、Hibernate、Spring,如果都学完了,可以看看JSF等内容,基本上找工作就不难了。
 
当然上述回答仅代表我个人意见,难免有不当之处,希望你酌情采纳。
 
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值