为什么不从指定的文件读取?

时间:2015-04-08 19:43:13

标签: java p2p

我正在研究一个简单的模型对等网络系统。引导服务器应该提供一个文本文件,其中包含连接到节点的IP列表,以帮助每个节点发现更多对等体。但是,它不会像应该的那样编写文件,我不明白为什么。这是我到目前为止所做的:

package network;
import java.net.*;
import java.io.IOException;
import java.io.*;
import javax.swing.JOptionPane;

public class PeerBootstrapServer 
{ 
public static void main(String[] args) throws IOException
{
    String peerFilePath = JOptionPane.showInputDialog("Please provide a peer list path:");

    File file = new File(peerFilePath);

    BufferedWriter writer = new BufferedWriter(new FileWriter(file));
    BufferedReader reader = new BufferedReader(new FileReader(file));

    ServerSocket listener = new ServerSocket(8088);
    try
    {
        while(true)
        {
            Socket socket = listener.accept();                              
            try
            {
                String peer = socket.getInetAddress().getHostAddress();

                boolean isRecognized = false;

                for(String line; (line = reader.readLine()) != null; )
                {
                    if(line == peer)
                    {
                        isRecognized = true;
                    }
                }

                if(isRecognized == false)
                {
                    writer.newLine();
                    writer.write(peer);
                }

                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                for(String line; (line = reader.readLine()) != null; )
                {
                    out.println(line);
                }                   
            }
            finally
            {
                socket.close();
            }
        }
    }

    finally
    {
        listener.close();
        reader.close();
        writer.close();
    }
  }
}

非常感谢任何帮助和/或提示!

1 个答案:

答案 0 :(得分:0)

原因是在读取输入流的第一个循环之后,您到达它的末尾,然后当您执行第二个循环时,reader.readLine()只返回null

你必须在第二次循环之前调用reset()。 e.g。

reader.reset();
for(String line; (line = reader.readLine()) != null; )
{
    out.println(line);
}                   

EDIT
在您的情况下,为每个连接打开读者和作者可能更好,而不是一劳永逸。如果您需要首先阅读查找然后发送内容,同样的想法。