Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java循环在第一次迭代后不打印inputstream数据_Java_Loops_Inputstream - Fatal编程技术网

java循环在第一次迭代后不打印inputstream数据

java循环在第一次迭代后不打印inputstream数据,java,loops,inputstream,Java,Loops,Inputstream,我有一个java程序,可以连接到在线资源,读取数据,然后解析特定的信息(这是查看特定页面的活动reddit帐户的数量) 我想自动化这个过程,以给定的间隔重复它(我将间隔设置为5秒,只是为了看看它是否工作)。然后程序将这个数字打印到文件中,每次打印在不同的行上。我知道主循环正在迭代,因为我的output.txt文件有几行,但它只在第一次迭代时找到并打印数字 package redditreader3; import java.io.*; import java.net.Socket; impor

我有一个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);
}
}
}
package-redditreader3;
导入java.io.*;
导入java.net.Socket;
导入java.util.Scanner;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类RedditReader3{
公共静态void main(字符串[]args)引发IOException、InterruptedException
{
int i=1;
字符串host=args[0];//www.reddit.com
String resource=args[1];///r/toronto/about.json
最终int HTTP_端口=80;
String command=“GET”+resource+”HTTP/1.1\n“+”主机:“+Host”
+“\n\n”;
/*此命令请求reddit通过HTTP打印其主机args[0]上args[1]中资源的源代码*/
套接字=新的套接字(主机,HTTP_端口);
InputStream instream=socket.getInputStream();
扫描仪输入=新扫描仪(流内);
OutputStream outstream=socket.getOutputStream();
PrintWriter out=新的PrintWriter(分流);
File File=新文件(“output.txt”);
FileOutputStream F_outstream=新的FileOutputStream(文件);
PrintStream F_PrintStream=新的PrintStream(F_超出流);
/*现在连接已经建立,所有的对象
如果彼此连接,则可以发送命令和数据
可以开始转移*/
字符串ActiveAccountsData=(“\”帐户\活动\“:(\\d+);
字符串ActiveAccountsDataFOUND;
Pattern-ActiveAccountsPattern=Pattern.compile(ActiveAccountsData);
Matcher-ActiveAccountsMatcher;
字符串输入;

当(i你的扫描器按预期运行时,它正在通过流并打印内容。
您要做的是倒带流。您可以使用Inputstream上的reset(重置)来完成(有关详细信息,请参阅javadoc)。您可能需要创建一个新的扫描程序。您需要围绕整个方法进行循环。对于每个迭代,您需要重新建立连接并解析流


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

您应该发出一个新的http GET请求,以在每5秒钟内获取更新的数据。例如,将InputStream/Scanner代码移动到循环中


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

从当前位置删除下面的行并

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);
将代码更改为以下内容,但不要忘记关闭资源(inputstreams和output streams):


while(i)如果我倒带流,它还会将最新请求的数据输入到网站吗?另外,我可以在循环中声明一个新的扫描仪吗?我认为这不会起作用,因为第二个声明将与第一个声明同名。你必须调试程序,以便更好地定位问题的来源。公开是不好的第二,一旦你调试了你的代码,问题就显而易见了。谢谢你的快速回复。你是否有教程的链接或使用HttpURLConnection的东西?我不熟悉它。@1saac-我打赌谷歌有大量使用HttpURLConnection的教程链接。
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);