
java中Reader类的public int read(char[] cbuf) 方法如何判断已到达流的末尾
packagecom.vince;importjava.io.IOException;importjava.io.InputStream;importjava.io.In...
package com.vince;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
/**
* 转换流
* @author DragonFly
*
*/
public class ChangeStreamDemo {
public static String reader(InputStream in){
Reader reader1=new InputStreamReader(in);
char[] cs=new char[2];
int len=-1;
StringBuffer buf=new StringBuffer();
try {
while((len=reader1.read(cs))!=-1){ //为什么会卡在这个循环跳不出去!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
buf.append(new String(cs,0,len));
}
reader1.close();
return buf.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
//Scanner input=new Scanner(System.in); //控制台输入(字节流)
String info=reader(System.in);
System.out.println(info);
}
}
为什么在那个循环中跳不出去,我用Debug查看循环到最后len值固定为在1,然后程序就无法继续执行了
我猜是read方法无法判断达到流末尾了,应该怎么让它知道呢?如果不是这个问题,那是什么问题?应该怎么解决? 展开
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
/**
* 转换流
* @author DragonFly
*
*/
public class ChangeStreamDemo {
public static String reader(InputStream in){
Reader reader1=new InputStreamReader(in);
char[] cs=new char[2];
int len=-1;
StringBuffer buf=new StringBuffer();
try {
while((len=reader1.read(cs))!=-1){ //为什么会卡在这个循环跳不出去!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
buf.append(new String(cs,0,len));
}
reader1.close();
return buf.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
//Scanner input=new Scanner(System.in); //控制台输入(字节流)
String info=reader(System.in);
System.out.println(info);
}
}
为什么在那个循环中跳不出去,我用Debug查看循环到最后len值固定为在1,然后程序就无法继续执行了
我猜是read方法无法判断达到流末尾了,应该怎么让它知道呢?如果不是这个问题,那是什么问题?应该怎么解决? 展开
2个回答
展开全部
您好,你控制台输入数据是没有末尾的,电脑不知道你输入完这一句是不是还要输入下一句话,所以会在哪里一直等待接受新的数据。。你可以在里面加一个判断。当输入“over” 的时候,程序退出。你的char[] cs=new char[2];改大点以便于可以装下你定义的结束符。
例如
char[] cs=new char[1024]; //建议更改
while((len=reader1.read(cs))!=-1){ //为什么会卡在这个循环跳不出去!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(new String(cs,0,len)=="over")//如果一次接收到的是“over”四个字符,则break退出循环。
break;
buf.append(new String(cs,0,len));
}
例如
char[] cs=new char[1024]; //建议更改
while((len=reader1.read(cs))!=-1){ //为什么会卡在这个循环跳不出去!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(new String(cs,0,len)=="over")//如果一次接收到的是“over”四个字符,则break退出循环。
break;
buf.append(new String(cs,0,len));
}
追问
我懂了,你解决了我的疑问.可是这个程序还是没有解决.按照你的方法,不大可能正好读取到最后剩下over呀?
即使是char[4],也可能o提起被读取,最后剩下的是ver.. 用\n做判断也是一样可能会剩下asd\n
除非char[1] 然后用\n判断.就像你说的一个一个传太没效率了,这也不好
展开全部
java中read方法返回的int类型:如果返回char, 那么无法表示流末尾. char的取值范围是从0到65535。这个范围内的所有字符, 都有可能在数据中出现。需要使用一个不可能在数据中出现的值来表示流末尾。那么Java中就是用-1来表示这个末尾的, 因为-1不会在数据中出现。而为了返回-1, 那么只能用int。当流中读取到一个字符时, read()方法内部就会当作int返回, 如果读到流末尾, 直接返回-1。
追问
并没有解决我的问题呀.read(char[] in)返回的int值是传递给字符数组字符的个数,如果到达末未流则返回-1.
对吧?
按照代码,那它应该到末尾跳出循环了呀
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |