A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闲人 中级黑马   /  2014-4-9 10:35  /  837 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 闲人 于 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呢?

8 个回复

正序浏览
闲人 发表于 2014-4-9 13:29
额,我知道0角标,但是你不是说num是长度么,我想知道的是长度怎么会有0呢 ...

new String(buf,0,num)这句代码的意思是,从数组buf的0角标开始到它的结尾num把里面的内容变为一个字符串
回复 使用道具 举报
闲人 发表于 2014-4-9 13:14
额。。我调用的是字符流的Reader方法,怎么出来字节了呢

~~~~

不好意思,我刚开始看错了,如果是Reader的话读到的是字符,不过我建议用字符的话readLine()会更好一些
回复 使用道具 举报
郭黎明 发表于 2014-4-9 13:24
数组里面是有零角标的,比如 int []arr={1,2,3} arr的零角标对应的就是元素1,arr[0]=1 ...

额,我知道0角标,但是你不是说num是长度么,我想知道的是长度怎么会有0呢
回复 使用道具 举报
闲人 发表于 2014-4-9 13:12
num = fr.read(buf)返回的num指的是读进buf数组的长度
那么num=0的时候,while循环是代表没有呢,还是代 ...

数组里面是有零角标的,比如 int []arr={1,2,3} arr的零角标对应的就是元素1,arr[0]=1
回复 使用道具 举报
lren 发表于 2014-4-9 11:13
fr.read():读取的是字节
fr.read(buf):读取到的是字符,返回值是读取的长度。如果长度不等于-1,代表读取到 ...

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

~~~~
额,也许我看的太慢,后面没有看吧
回复 使用道具 举报
郭黎明 发表于 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开始输出的呢?
回复 使用道具 举报
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()方法读取的是字节
回复 使用道具 举报
fr.read()读到的是字节,fr.read(buf)是将读到的字节放进buf数组里,num = fr.read(buf)返回的num指的是读进buf数组的长度,fr.read(buf)返回-1的时候带代表已经没有字节可读,这个等到是-1的时候就直接while循环就直接跳出了,不存在减一的情况
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马