java循环在第一次迭代后不打印输入流数据

时间:2013-02-13 15:51:51

标签: java loops inputstream

我有一个连接到在线资源的java程序,读取数据,然后解析特定的信息(这是查看某个页面的活动reddit帐户的数量)。

我想自动化这个过程以给定的间隔重复它(我将间隔设置为5秒,只是为了查看它是否正常工作)。然后,程序会将此数字打印到一个文件中,每次都在不同的行上。我知道主循环是迭代的,因为我的output.txt文件有几行,但它只在第一次迭代时找到并打印数字。

package redditreader3;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RedditReader3 {
public static void main(String[] args) throws IOException, InterruptedException
{
int i = 1;
String host = args[0]; // www.reddit.com

String resource = args[1]; // /r/toronto/about.json     

final int HTTP_PORT = 80;
String command = "GET " + resource + " HTTP/1.1\n" + "Host:"  + host
   + "\n\n";

    /* This command requests reddit for the source code of the resource in args[1] at its host, args[0] to be printed through HTTP. */

Socket socket = new Socket(host, HTTP_PORT);

    InputStream instream = socket.getInputStream();

        Scanner in = new Scanner(instream);

    OutputStream outstream = socket.getOutputStream();

        PrintWriter out = new PrintWriter(outstream);

File file = new File("output.txt");

    FileOutputStream F_outstream = new FileOutputStream(file);

        PrintStream F_printstream = new PrintStream(F_outstream);

 /* Now that the connection has been established and all of the objects
    are connected to each other, the command may be sent and the data 
    transfer may begin. */

String ActiveAccountsData = ("\"accounts_active\": (\\d+)");

String ActiveAccountsDataFOUND;

Pattern ActiveAccountsPattern = Pattern.compile(ActiveAccountsData);

Matcher ActiveAccountsMatcher; 

String input;

while(i <= 4)
{

    out.print(command);
    out.flush();

    while(in.hasNextLine())
    {
        input = in.nextLine();
        ActiveAccountsMatcher = ActiveAccountsPattern.matcher(input);

        if(ActiveAccountsMatcher.find())
        {
            ActiveAccountsDataFOUND = ActiveAccountsMatcher.group(1);
            F_printstream.println(ActiveAccountsDataFOUND); 
            break;
        }
    }
    i++;
    F_printstream.println();
    Thread.sleep(5000);
}
}
}

我在想可能in.hasNextLine()值卡在某处并需要更新,但我找不到一种方法将其返回到网站输入的开头。

4 个答案:

答案 0 :(得分:0)

您需要围绕整个方法进行循环。对于每次迭代,您需要重新建立连接并解析流。

请注意,最好使用HttpURLConnection而不是使用直接套接字调用(这样您就不必自己处理http标头等)。

答案 1 :(得分:0)

您应该发出新的HTTP GET请求,以便每5秒钟获取更新的数据。即在循环内移动InputStream / Scanner代码。

此外,您可能希望使用HttpClient而不是操作原始套接字。

答案 2 :(得分:0)

从当前位置删除以下行

Socket socket = new Socket(host, HTTP_PORT);

InputStream instream = socket.getInputStream();

    Scanner in = new Scanner(instream);

OutputStream outstream = socket.getOutputStream();

    PrintWriter out = new PrintWriter(outstream);

将代码更改为以下但不要忘记关闭资源(输入流和输出流):

while(i <= 4)
{
  Socket socket = new Socket(host, HTTP_PORT);



InputStream instream = socket.getInputStream();

    Scanner in = new Scanner(instream);

OutputStream outstream = socket.getOutputStream();

    PrintWriter out = new PrintWriter(outstream); 

out.print(command);
out.flush();

while(in.hasNextLine())
{
    input = in.nextLine();
    ActiveAccountsMatcher = ActiveAccountsPattern.matcher(input);

    if(ActiveAccountsMatcher.find())
    {
        ActiveAccountsDataFOUND = ActiveAccountsMatcher.group(1);
        F_printstream.println(ActiveAccountsDataFOUND); 
        break;
    }
}
i++;
F_printstream.println();
//close resources
Thread.sleep(5000);

}

答案 3 :(得分:-1)

您的扫描仪正在按预期运行。它正在通过流并打印内容。 你想要做的是回放流。您可以使用Inputstream上的reset执行此操作(有关详细信息,请参阅javadoc)。您可能需要创建一个新的扫描仪