关于BufferedReader的问题,只能在屏幕上打印一部分内容,为什么?如果使用注释掉的方法输入却可以全部输入,请问要如何修改?谢谢。
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class MyTelnet
{
Socket socket = null;
PrintWriter out = null;
//BufferedInputStream in = null;
BufferedReader in = null;
String reString = null;

public MyTelnet()
{}

public String getOpenConnection(String host,int port,String command)
{
try
{
socket = new Socket(host,port);
out = new PrintWriter(socket.getOutputStream());
Thread.sleep(1000);
out.write(command);
out.flush();
//in = new BufferedInputStream(socket.getInputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch(UnknownHostException e)
{
String title = "连接服务器时产生错误";
String message = "连接服务器时产生错误" + e.getMessage();
new ErrorMessage(message,title);
}catch(Exception ie)
{
String title = "输入输出流产生错误";
String message = "输入输出流产生错误" + ie.getMessage();
new ErrorMessage(message,title);
}

try
{   
/*byte[] buff = new byte[1024];
String str = null;
while(true)
{
int n = in.read(buff);
if(n > 0)
{
str += new String(buff,0,n);
reString = str;
System.out.println(reString);
}
}*/
while(in.ready())
{
if(in.readLine().indexOf("Password:") >0)
{

}
System.out.println(in.readLine());
}
out.close();
in.close();
socket.close();
}catch(Exception ie)
{
System.out.println("Error");
}

return reString;
}
}

解决方案 »

  1.   

    while(in.ready())
    {
    if(in.readLine().indexOf("Password:") >0)
    {

    }
    System.out.println(in.readLine());
    }
    -------------------------------
    in.ready()是什么?如果是in.read()的话,有一部分字符会被这个函数读掉。
    可以修正为
    String s = null;
    while((s=in.readLine)!=null)
    {
    if(s.indexOf("Password:") >0)
    {

    }
    System.out.println(s);
    }
      

  2.   

    in.ready()是判断BufferedReader里是否有值,
    我用改用了while((s=in.readLine)!=null)方法,只是多输入了三行,后面还是有一部分没有输入。
    网上有人说要用flush(),但BufferedReader方法并没有这个方法。
      

  3.   

    还有一段没有输出来的话,跟你这段程序没有关系,你的socket应该还有另外一个服务器端/客户端吧,你查找一下你另外一段程序有没有flush.
      

  4.   

    另外一端是交换机,如果使用这段代码就可以正常输出:
    byte[] buff = new byte[1024];
    String str = null;
    while(true)
    {
    int n = in.read(buff);
    if(n > 0)
    {
    str += new String(buff,0,n);
    reString = str;
    System.out.println(reString);
    }
    }

     也就是服务器端应该是没有问题的。
      

  5.   

    .readLine();
    每次读一行,很好用啊~
      

  6.   

    清空缓存区,bufferReader()后面会跟个int参数规定一次读多少sequence进缓冲,readLine可能写一次但是缓冲里面还有字段,清空一下就全写出来了
      

  7.   

    那可能是你的输入字串里后面没有/r/n,使用readline的话要用这个标字判断的。所以你最后的字符用readline读不出来。
      

  8.   

    方便的话把你测试用的输入数据,输出log贴出来,会比较有利于分析。
      

  9.   

    输入的字符串是交换机的命令String command = "disp cu\n"
    返回交换机的配置信息:
    vlan 1 ....................
    vlan 2 ....................
     .
     .
     .
    vlan 10 ...................
    但现在只输出到vlan 5..............后面的就不再输出了。
      

  10.   

    建议你查看你所输出的字符串的数量,因为BufferedReader的缓冲区是有限的,如果填满了缓冲区,就会自动增加一位的缓冲区,可以根据你的数据量的大小,自己指定缓冲区大小。