日期:2014-05-20  浏览次数:20870 次

当StringBuffer碰到Socket,我出错了,菜鸟求教
本帖最后由 weidu23 于 2013-12-05 22:55:34 编辑
我先写一个正确的程序,是由一个BufferedReader br对象来接收文本内容,然后在把br.readLine()放入StringBuffer中,用append(br.readLine());

public class Test{
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("H:/Server.java")));
String line = null ;
StringBuffer buf = new StringBuffer() ;
while( null != (line = br.readLine()) ){
buf.append(line+"\n");
}
System.out.println(buf.toString());
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

程序可以正确运行。
---------------------------
可是,当我同样的程序用Socket来传递,让StringBuffer buf来append(line);时,却报错了!

如下,我先写了一个SendFile(Client端,把文件用BufferWriter bw的bw.write(String line)来一条条传递数据;
接着再在GainFile(Server端)用上面类似的方法接收文本,却报错了,如下:

SendFile关键代码:
if( writeSocket.isConnected() ){
try {
outStream   = writeSocket.getOutputStream() ;
send        = new BufferedWriter(new OutputStreamWriter(outStream));
readFile    = new BufferedReader(new InputStreamReader(new FileInputStream(file))) ;
String line = null ;
while( null != (line = readFile.readLine()) ){
send.write(line+System.getProperty("line.separator"));
send.newLine();
send.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally{
;  /**备用通道,以保证Exception不会停止掉程序运行*/
}
}// end if

接着接收:
我把完整的接收代码发出来:
public class GainFile {
public static void main(String[] args) {
GainFile g = new GainFile();
g.receiveFile();//接收文件,接收时,在控制台显示文件内容
}
///////////////////////////////////////////////////
private ServerSocket server            ;
private Socket       receiveFileSocket ;
private StringBuffer buf               ;
public GainFile() {
try {
server = new ServerSocket(9000) ;
} catch (IOException e) {
e.printStackTrace();
}
}
public void receiveFile(){
System.out.println("------等待客户端连接-------");
InputStream readIn = null ;
BufferedReader  br = null ;
try {
receiveFileSocket = server.accept() ;
System.out.println("---------连接成功!-------");
Thread.sleep(1000);
System.out.println("---------开始接收 数据-----");
readIn = receiveFileSocket.getInputStream() ;
br     = new BufferedReader(new InputStreamReader(readIn));
String line = null ;
while( null != (line = br.readLine()) ){
System.out.println(line);
buf.append(line) ;
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
finally{
try{
br.close();
readIn.close();
}
catch(IOException ioErr){ioErr.printStackTrace(); }
}
}
}


然后运行:

结果:
------等待客户端连接-------
---------连接成功!-------
---------开始接收 数据-----
import java.io.IOException; /*他接收到了Client读取文本后传来的这句话,然后报错*/
Exception in thread "main" java.lang.NullPointerException
at GainFile.receiveFile(GainFile.java:44)
at GainFile.main(GainFile.java:16)

我传递一个叫Server.java的文件给他,他接收了我一条数据,import java.io.IOException;然后报错。

错误指向

while( null != (line = br.readLine()) ){
System.out.println(line);
buf.append(line) ;
}

可是,我在没有用Socket时这条代码都是对的,为什么用了Socket这条代码就错了?

------解决方案--------------------
buf=new StringBuffer();
------解决方案--------------------