初学JAVA 请问文件里的内容为什么要用while循环读取 java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ((n=b.read(bytes))!=-1 是检查你上面FileInputString 是否读完了,如果读到文件最后没有数据了就是 -1 b.read(bytes),是指最多读入bytes.length个byte(这里是1024)。你现在的inputStream只有那么几个字符,远小于1024,所以读一定就能读完,不需要while循环,但如果inputStream里有超过1024个byte的内容,那就要用while才能读完。 比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte这样说总能明白了吧 比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte这样说总能明白了吧抱歉现在才记起来这个了 哦 懂了 那怎么获取所有的文件里面的内容 对其进行统计筛选。按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢 比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte这样说总能明白了吧抱歉现在才记起来这个了 哦 懂了 那怎么获取所有的文件里面的内容 对其进行统计筛选。按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢定义一个对象,把每次读到的byte[]都存起来就行了StringBuilder sb = new StringBuild();byte[] buf = new byte[1024];int readCount=0;while((readCount=b.read(buf))>0){ sb.append(new String(buf,0,readCount));}//sb这个对象就是流里所有内容了System.out.println(sb.toString());以后不要贴图了,直接发代码,让人家好复制,手打麻烦 比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte这样说总能明白了吧抱歉现在才记起来这个了 哦 懂了 那怎么获取所有的文件里面的内容 对其进行统计筛选。按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢定义一个对象,把每次读到的byte[]都存起来就行了StringBuilder sb = new StringBuild();byte[] buf = new byte[1024];int readCount=0;while((readCount=b.read(buf))>0){ sb.append(new String(buf,0,readCount));}//sb这个对象就是流里所有内容了System.out.println(sb.toString());以后不要贴图了,直接发代码,让人家好复制,手打麻烦哦 谢谢 第一次提问,下次会注意的。但是还有一个问题不懂,像read()方法上说读取到结尾就返回-1,但是只要Bytes数组够用的话不是每次都能读到结尾吗?这样不是每次while语句中的代码都么运行,而且调试的时候while中的语句就是没有执行的,结果与直接运行的不一样啊。实在是麻烦了 有太多不懂得了 单纯的read()方法,是每次读一个byte,假如你有一串”abc“(这里用字符串表示,实际上是byte类型的)要读,调用一次read()方法就会读一个,所以“abc"你会读三个,读到第四个没有时当作结尾了,就返回-1;有一些输入流的read(byte[] buf)方法实际上就是调用read()方法来循环读取的,下面写了个伪read(byte[] buf)方法(当然与真正的方法有差别,只是让你了解思想),你认真理解下吧 public int read(byte[] buf) throws Exception { // 假设这个是要读的流 FileInputStream fis = null; int pos = 0; // 读到的字节总数 int count = 0; while (pos < buf.length) { int readInt = fis.read(); //读到结果 if (readInt == -1) { if (count > 0) { return count; } return -1; } buf[pos++] = (byte) readInt; count++; } return count; } public int read(byte[] buf) throws Exception { // 假设这个是要读的流 FileInputStream fis = null; int pos = 0; // 读到的字节总数 int count = 0; while (pos < buf.length) { int readInt = fis.read(); //读到结果 if (readInt == -1) { if (count > 0) { //情况一:内容读完后返回count return count; } //情况二:文件内没有内容时返回-1 return -1; } buf[pos++] = (byte) readInt; count++; }//情况三:说明文件内容字节太大,超过了buf数组的大小。此时count的大小就是buf.length return count;}}是这样理解的吗?那不是有问题吗 ?一般情况都是情况一 但是情况一不是已经读到了结尾了吗?按照真正的read(bytes[])不是应该返回-1的吗?如果返回-1的话,我上次的那个问题还是弄不清楚啊? 把while语句写直白点,这时候再读程序StringBuilder sb = new StringBuild();byte[] buf = new byte[1024];int readCount=0;while(true){ readCount=b.read(buf)); if(readCount == -1){ break; } sb.append(new String(buf,0,readCount));}//sb这个对象就是流里所有内容了System.out.println(sb.toString());假设流里有10个byte,第一次while循环,readCount值是10的(这是第一种情况了),第二次while循环,readCount的值就是-1了(看第二次情况),这时候就会进入if语句执行break退出循环。 用while来循环读取是一种保险的做法。若文件字节数在buffer之内,则一般会一次就可以将文件内容全读到buffer中,若文件字节数超过buffer,则就需要循环来读取了,直到不能从文件中读到字节为止,也就是将文件的内容全部读完了 把while语句写直白点,这时候再读程序StringBuilder sb = new StringBuild();byte[] buf = new byte[1024];int readCount=0;while(true){ readCount=b.read(buf)); if(readCount == -1){ break; } sb.append(new String(buf,0,readCount));}//sb这个对象就是流里所有内容了System.out.println(sb.toString());假设流里有10个byte,第一次while循环,readCount值是10的(这是第一种情况了),第二次while循环,readCount的值就是-1了(看第二次情况),这时候就会进入if语句执行break退出循环。如果是这样的话那可以理解了,但是还有两个问题1.我进行调试的时候,第一次while循环readcount的值就是-1;(我想弄清楚为什么调试时得到的与实际运行的不一样)2.如果第一次while循环readcount的值是10,那为什么第二次while循环时readcount的值是-1.真是太感谢你耐心的讲解了,学到了很多。就是自己总在郁闷read()返回值的问题, 个人觉得这和C语言当中的fread(....)相似,和while(i<n)性质是一样的,只是read一次之后,会自然而然的跳到下一个字节(下一个地址),这是我们看不到这个地址而已 嗯 就是这样的 read一次后就返回-1了 public int read(byte[] buf) throws Exception { // 假设这个是要读的流 FileInputStream fis = null; int pos = 0; // 读到的字节总数 int count = 0; while (pos < buf.length) {//当第二次while循环的时候,调用此方法时,因为fis.read()已经是都到末尾了就是-1了,所以count=0就返回-1了。 int readInt = fis.read(); //读到结果 if (readInt == -1) { if (count > 0) { //情况一:内容读完后返回count return count; } //情况二:文件内没有内容时返回-1 return -1; } buf[pos++] = (byte) readInt; count++; }//情况三:说明文件内容字节太大,超过了buf数组的大小。此时count的大小就是buf.length return count;}}这次终于理解了,我发现用eclipse的debug调试貌似是有问题的每次的出来的都是-1,用system.out.println()进行调试时第一次的结果不是-1.另外第二个问题也理解了,第二次while循环的时候,count=0;所以返回的是-1。这样理解的应该是对的了吧!谢谢!!! 一道 java 面试题 菜鸟求救啊,大侠们给我细细讲解下啊 奇怪?? 写了一个注册小程序,用Struts+DAO,在具体实现方法中出了点问题 看看这个demo,你还认为Swing做的东西丑吗? 一个小问题 网上有Java比较基础,比较经典的考题吗? 做一個Java程序員需要的條件? 可执行jar包的制作? 求助! 类中的构造函数出错,求助。 求List集合依赖项分组排序
你现在的inputStream只有那么几个字符,远小于1024,所以读一定就能读完,不需要while循环,
但如果inputStream里有超过1024个byte的内容,那就要用while才能读完。
比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
这样说总能明白了吧
比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
这样说总能明白了吧抱歉现在才记起来这个了
哦 懂了 那怎么获取所有的文件里面的内容 对其进行统计筛选。
按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢
比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
这样说总能明白了吧抱歉现在才记起来这个了
哦 懂了 那怎么获取所有的文件里面的内容 对其进行统计筛选。
按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢
定义一个对象,把每次读到的byte[]都存起来就行了
StringBuilder sb = new StringBuild();
byte[] buf = new byte[1024];
int readCount=0;
while((readCount=b.read(buf))>0){
sb.append(new String(buf,0,readCount));
}//sb这个对象就是流里所有内容了
System.out.println(sb.toString());以后不要贴图了,直接发代码,让人家好复制,手打麻烦
比如你文件里有2000个byte大小的内容,那就需要读二次,第一次是读1024个byte,第二次读2000-1024=976个byte
这样说总能明白了吧抱歉现在才记起来这个了
哦 懂了 那怎么获取所有的文件里面的内容 对其进行统计筛选。
按照你说的那么缓存数组存储的是第二次读的976个byte值。怎么统计所有的内容呢 ?谢谢
定义一个对象,把每次读到的byte[]都存起来就行了
StringBuilder sb = new StringBuild();
byte[] buf = new byte[1024];
int readCount=0;
while((readCount=b.read(buf))>0){
sb.append(new String(buf,0,readCount));
}//sb这个对象就是流里所有内容了
System.out.println(sb.toString());以后不要贴图了,直接发代码,让人家好复制,手打麻烦哦 谢谢 第一次提问,下次会注意的。
但是还有一个问题不懂,像read()方法上说读取到结尾就返回-1,但是只要Bytes数组够用的话不是每次都能读到结尾吗?这样不是每次while语句中的代码都么运行,而且调试的时候while中的语句就是没有执行的,结果与直接运行的不一样啊。
实在是麻烦了 有太多不懂得了
public int read(byte[] buf) throws Exception {
// 假设这个是要读的流
FileInputStream fis = null; int pos = 0;
// 读到的字节总数
int count = 0;
while (pos < buf.length) {
int readInt = fis.read(); //读到结果
if (readInt == -1) {
if (count > 0) {
return count;
}
return -1;
} buf[pos++] = (byte) readInt;
count++;
} return count;
}
// 假设这个是要读的流
FileInputStream fis = null; int pos = 0;
// 读到的字节总数
int count = 0;
while (pos < buf.length) {
int readInt = fis.read(); //读到结果
if (readInt == -1) {
if (count > 0) {
//情况一:内容读完后返回count
return count;
}
//情况二:文件内没有内容时返回-1
return -1;
} buf[pos++] = (byte) readInt;
count++;
}
//情况三:说明文件内容字节太大,超过了buf数组的大小。此时count的大小就是buf.length
return count;
}}是这样理解的吗?那不是有问题吗 ?一般情况都是情况一 但是情况一不是已经读到了结尾了吗?按照真正的read(bytes[])不是应该返回-1的吗?如果返回-1的话,我上次的那个问题还是弄不清楚啊?
把while语句写直白点,这时候再读程序
StringBuilder sb = new StringBuild();
byte[] buf = new byte[1024];
int readCount=0;
while(true){
readCount=b.read(buf));
if(readCount == -1){
break;
}
sb.append(new String(buf,0,readCount));
}//sb这个对象就是流里所有内容了
System.out.println(sb.toString());假设流里有10个byte,第一次while循环,readCount值是10的(这是第一种情况了),第二次while循环,readCount的值就是-1了(看第二次情况),这时候就会进入if语句执行break退出循环。
把while语句写直白点,这时候再读程序
StringBuilder sb = new StringBuild();
byte[] buf = new byte[1024];
int readCount=0;
while(true){
readCount=b.read(buf));
if(readCount == -1){
break;
}
sb.append(new String(buf,0,readCount));
}//sb这个对象就是流里所有内容了
System.out.println(sb.toString());假设流里有10个byte,第一次while循环,readCount值是10的(这是第一种情况了),第二次while循环,readCount的值就是-1了(看第二次情况),这时候就会进入if语句执行break退出循环。如果是这样的话那可以理解了,但是还有两个问题
1.我进行调试的时候,第一次while循环readcount的值就是-1;(我想弄清楚为什么调试时得到的与实际运行的不一样)
2.如果第一次while循环readcount的值是10,那为什么第二次while循环时readcount的值是-1.
真是太感谢你耐心的讲解了,学到了很多。就是自己总在郁闷read()返回值的问题,
// 假设这个是要读的流
FileInputStream fis = null; int pos = 0;
// 读到的字节总数
int count = 0;
while (pos < buf.length) {
//当第二次while循环的时候,调用此方法时,因为fis.read()已经是都到末尾了就是-1了,所以count=0就返回-1了。
int readInt = fis.read(); //读到结果
if (readInt == -1) {
if (count > 0) {
//情况一:内容读完后返回count
return count;
}
//情况二:文件内没有内容时返回-1
return -1;
} buf[pos++] = (byte) readInt;
count++;
}
//情况三:说明文件内容字节太大,超过了buf数组的大小。此时count的大小就是buf.length
return count;
}}
这次终于理解了,我发现用eclipse的debug调试貌似是有问题的每次的出来的都是-1,用system.out.println()进行调试时第一次的结果不是-1.
另外第二个问题也理解了,第二次while循环的时候,count=0;所以返回的是-1。这样理解的应该是对的了吧!
谢谢!!!