黑马程序员技术交流社区

标题: IO流读取的疑问 [打印本页]

作者: 闲人    时间: 2014-4-9 10:35
标题: IO流读取的疑问
本帖最后由 闲人 于 2014-4-9 14:55 编辑
  1. import java.io.*;
  2. public class IODemo4 {

  3.         public static void main(String[] args) throws IOException{
  4.                 FileReader fr = new FileReader("C:\\Users\\lenovo\\Desktop\\demo.txt");
  5.                 char[] buf = new char[1024];

  6.                 int num = 0;
  7.                 while((num = fr.read(buf))!=-1)
  8.                 {
  9.                         System.out.println(new String(buf,0,num));
  10.                 }
  11.                 fr.close();
  12.         }
  13. }
复制代码

问:
fr.read()是一次读一个字符,并自动往下读,fr.read()读到的应该是字符吧
那fr.read(buf)为什么会成为数字呢?
还有fr.read(buf)返回的是数组的个数还是脚标?(额,这里想问的是他是从0开始,还是1开始)
最后fr.read(buf)返回-1的时候,代表他是否指向了最后一位字符的后一位,那他所代表的数值,是否要减1呢?
作者: 郭黎明    时间: 2014-4-9 11:00
fr.read()读到的是字节,fr.read(buf)是将读到的字节放进buf数组里,num = fr.read(buf)返回的num指的是读进buf数组的长度,fr.read(buf)返回-1的时候带代表已经没有字节可读,这个等到是-1的时候就直接while循环就直接跳出了,不存在减一的情况
作者: lren    时间: 2014-4-9 11:13
fr.read():读取的是字节
fr.read(buf):读取到的是字符,返回值是读取的长度。如果长度不等于-1,代表读取到了内容;当等于-1时,说明没有读取到内容,此时就可以结束读取了。

详细说明fr.read(char[]):
1、在read(char[])方法中会调用read(cbuf, 0, len)方法
  1. public int read(java.nio.CharBuffer target) throws IOException {
  2.         int len = target.remaining();
  3.         char[] cbuf = new char[len];
  4.         int n = read(cbuf, 0, len);
  5.         if (n > 0)
  6.             target.put(cbuf, 0, n);
  7.         return n;
  8.     }
复制代码

2、在read(cbuf, 0, len)方法中会将read()读取的内容强制转换为char类型
  1. public int read(char[] cbuf, int off, int len) throws IOException {
  2.       for(int i=0; i < len; i++)
  3.         cbuf[off + i] = (char)read();

  4.       return len;
  5.     }
复制代码

3、read()方法读取的是字节

作者: 闲人    时间: 2014-4-9 13:12
郭黎明 发表于 2014-4-9 11:00
fr.read()读到的是字节,fr.read(buf)是将读到的字节放进buf数组里,num = fr.read(buf)返回的num指的是读 ...

num = fr.read(buf)返回的num指的是读进buf数组的长度
那么num=0的时候,while循环是代表没有呢,还是代表第一个数呢
还有为什么System.out.println(new String(buf,0,num));
是从0开始,而不是从1开始输出的呢?
作者: 闲人    时间: 2014-4-9 13:14
lren 发表于 2014-4-9 11:13
fr.read():读取的是字节
fr.read(buf):读取到的是字符,返回值是读取的长度。如果长度不等于-1,代表读取到 ...

额。。我调用的是字符流的Reader方法,怎么出来字节了呢

~~~~
额,也许我看的太慢,后面没有看吧

作者: 郭黎明    时间: 2014-4-9 13:24
闲人 发表于 2014-4-9 13:12
num = fr.read(buf)返回的num指的是读进buf数组的长度
那么num=0的时候,while循环是代表没有呢,还是代 ...

数组里面是有零角标的,比如 int []arr={1,2,3} arr的零角标对应的就是元素1,arr[0]=1
作者: 闲人    时间: 2014-4-9 13:29
郭黎明 发表于 2014-4-9 13:24
数组里面是有零角标的,比如 int []arr={1,2,3} arr的零角标对应的就是元素1,arr[0]=1 ...

额,我知道0角标,但是你不是说num是长度么,我想知道的是长度怎么会有0呢
作者: 郭黎明    时间: 2014-4-9 13:29
闲人 发表于 2014-4-9 13:14
额。。我调用的是字符流的Reader方法,怎么出来字节了呢

~~~~

不好意思,我刚开始看错了,如果是Reader的话读到的是字符,不过我建议用字符的话readLine()会更好一些
作者: 郭黎明    时间: 2014-4-9 13:35
闲人 发表于 2014-4-9 13:29
额,我知道0角标,但是你不是说num是长度么,我想知道的是长度怎么会有0呢 ...

new String(buf,0,num)这句代码的意思是,从数组buf的0角标开始到它的结尾num把里面的内容变为一个字符串




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2