黑马程序员技术交流社区
标题:
关于readLine()的问题
[打印本页]
作者:
谢威
时间:
2013-7-24 16:50
标题:
关于readLine()的问题
本帖最后由 杨兴庭 于 2013-7-25 22:56 编辑
下面代码中readLine()已经写到最后一行后,再继续readLine()读的值应该是null,为什么line的值不是null呢,而且还要定义结束标记?
import java.io.*;
import java.net.*;
class TextClient2
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("127.0.0.1",10086);
BufferedReader bufr = new BufferedReader(new FileReader("xx.java"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
//这里line已经写到最后一行了,最后一行不已经是null了吗,也就是line=null,为什么还要定义一个结束标记呢?
out.println("over");
BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = bufin.readLine();
System.out.println(str);
//bufin.close();为什么这里不关闭bufin缓冲区呢?
bufr.close();
s.close();
}
}
class TextServer2
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10086);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connection");
BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true);
String line = null;
while ((line=bufin.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line);
}
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("上传完成");
//bufin.close();这里为什么不关闭bufin缓冲区呢?
out.close();
s.close();
ss.close();
}
}
复制代码
作者:
yinjiek
时间:
2013-7-24 17:10
PrintWriter out =new PrintWriter(s.getOutputStream(),ture);out.println("over") 这里的out是告诉服务端我输入over结束了;
readline()是读取缓冲区文件流==null就是读完数据了;这两者的意思完全是不一样的!
s.accpet(); 接收服务端都关了,缓冲区自然就关了;
作者:
yinjiek
时间:
2013-7-24 17:10
PrintWriter out =new PrintWriter(s.getOutputStream(),ture);out.println("over") 这里的out是告诉服务端我输入over结束了;
readline()是读取缓冲区文件流==null就是读完数据了;这两者的意思完全是不一样的!
s.accpet(); 接收服务端都关了,缓冲区自然就关了;
作者:
yinjiek
时间:
2013-7-24 17:11
PrintWriter out =new PrintWriter(s.getOutputStream(),ture);out.println("over") 这里的out是告诉服务端我输入over结束了;
readline()是读取缓冲区文件流==null就是读完数据了;这两者的意思完全是不一样的!
s.accpet(); 接收服务端都关了,缓冲区自然就关了;
作者:
熊纪达
时间:
2013-7-24 17:26
(1)客户端是已经读完了,并且发送完了,而且在String str = bufin.readLine();时阻塞暂停,等服务端发信息。此时服务端line=bufin.readLine()并不知道对方已经发送完了,也就阻塞暂停了。所以双方都在暂停。
(2)bufin关联的是s,所以s关闭了,流也就没有数据了。
作者:
月亮人生
时间:
2013-7-24 17:32
// out.println("over"); 要是程序可以执行到这句代码,说明while循环不满足条件也就是line=null了。也就是说读取的.java 文件已经读完了。定义这行代码来做结束标记是没意义的。
//s.close(); 因为bufin中的字节流根据s.getInputStream()来获取。s资源关闭后,bufin相应的也关闭了。
作者:
吴清源
时间:
2013-7-24 21:54
line=null只是退出了客户端的while循环,而out.println("over")是向服务端写入一个over结束符,服务端靠识别该结束符退出while循环,两个结束标记不同
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2