黑马程序员技术交流社区
标题:
IO编程中的那个len
[打印本页]
作者:
晏文根
时间:
2012-6-13 19:17
标题:
IO编程中的那个len
import java.io.*;
class FileReaderTest
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("1.txt");
char[] buf = new char[1024];
int len= 0;
while((len=fr.read(buf))!=-1)
{
System.out.println(new String(buf,0,num));
}
fr.close();
}
}
System.out.println(new String(buf,0,num));从这段代码可以知道len是用来计算read读取字节的长度,我不知道len是如何来实现自增的?这是问题1
另外read怎么知道里面已经读取了1024个字符,是通过len与1024的比较吗?这是问题2
请高手们指教。
作者:
田林
时间:
2012-6-13 19:33
首先,len并不需要自增,len代表每次读入数组buf中的字节数。每执行一次:len=fr.read(buf)) 就为len重新赋一次值。每次的值是读入到数组buf的实际字节数。
read是将fr对应的数据读入到数组buf中,直到buf数组读满或者fr对应的内容被读完。
在读入数据时,fr内部的指针会向后移动,移动的位数是读入数组中的字节数值。所以每次调用read方法,都会从指针位置开始接着上一次的内容往后继续读数据,直到数据被读完,循环停止。
作者:
郑传庆
时间:
2012-6-13 19:44
len是通过每读一个字符就自增1;问题2:是通过数组的大小来决定的,开始char数组定义了大小是1024个字符,read()每读一个字符就添加到char数组里,当超过char数组长度时,就会返回一个值,直到等于-1为止。
作者:
薄炳鑫
时间:
2012-6-13 19:54
read()方法没有读完的时候,都会有一个标记位,下次从这个标记位开始读后面的数据。所以不是通过len与1024比较。
另外一个问题解释见代码部分的注释,具体可以参考一下jdk的api文档中的reader的read方法。
import java.io.*;
class FileReaderTest
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("1.txt");
char[] buf = new char[1024];
int len= 0;
while((len=fr.read(buf))!=-1)//read()方法返回的是读取的字符数,如果已到达流的末尾,则返回 -1 ,len不用自增。
{
System.out.println(new String(buf,0,len));//这里应该是len不是num
}
fr.close();
}
}
复制代码
作者:
王月
时间:
2012-6-13 20:02
问题1:
字符流的读取过程中,每读取一个字符,read就返回一个int型值来表示,比如第一次读取一个字符len为1,读取第二个变为2,
依次类推,直到读完所有的数据。事实上read方法的返回值是int型就是这个原因。然后
以int类型的-1来表示已读到结尾
。
问题2:
注意:
这里的字符数组相当于缓冲区。缓冲区的作用只是临时存储,读取完缓冲区的数据后,只要源中还有数据,就还会把数据临时存储到缓冲区,继续读取。
程序的目的是读取到所有的数据,不管把缓冲区定义多大(可以不是1024),只要1.txt中还有数据,就会一直读下去,它的大小与len没有关系的。
len负责读取了多少个,什么时候读取完,缓冲区负责临时存储数据
。就算len记录下了刚好读取的第1024个字符,也没有什么实际意义,只要还有数据没读完,还会继续重新把数据临时存储到缓冲区,然后继续读取。
作者:
王红霞
时间:
2012-6-13 20:29
问题1 我觉得len不用自增 而是通过while循环来判断len=fr.read(buf))的值;
问题2 通过read方法逐个读取buf数组中的字符,直到全部读完。当不可再读时,就赋以-1值结束
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2