Java URL Connection пустой поток ввода - PullRequest
0 голосов
/ 16 апреля 2009

Приложение, над которым я работаю, имеет очень медленную загрузку веб-страницы. Если я запускаю следующий код, он работает нормально, но только из-за вызова sleep. Если я не сплю, то InputStream - это просто набор пробелов, вероятно, из-за приложения, из которого он вызывает. Есть ли какой-нибудь нехакерский способ обойти это?

public class PublishTool extends Thread {

  private URL publishUrl;

  private String filerLocation;

  public PublishTool() {
  }

  public PublishTool(String publishUrl, String filerLocation) throws NibException {

    try {
      this.publishUrl = new URL(publishUrl);
    } catch (MalformedURLException e) {
      throw new NibException("Publish Url :" + publishUrl + " is not valid. ");
    }

    this.filerLocation = filerLocation;

  }

  public void run() {

    File filerFile = new File(filerLocation);
    BufferedWriter writer = null;


    try {
      URLConnection conn = publishUrl.openConnection();
      BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(conn.getInputStream())));

      writer = new BufferedWriter(new FileWriter(filerLocation));

      Thread.sleep(1000l);

      while (reader.ready()) {
        writer.write(reader.readLine() + "\n");
      }

    } catch (MalformedURLException e) {
      throw new IllegalStateException("Malformed URL for : " + publishUrl + " " + filerLocation, e);
    } catch (IOException e) {
      throw new IllegalStateException("IO Exception for  : " + publishUrl + " " + filerLocation, e);
    } catch (InterruptedException e) {
      throw new IllegalStateException("Thread was interrupted early... publishing might have failed.");
    } catch (NibException e) {
      throw new IllegalStateException("Publishing File Copy failed : " + filerLocation + ".bak" + " to " + filerLocation);
    } finally {
      try {
        writer.flush();
        writer.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

Ответы [ 2 ]

4 голосов
/ 16 апреля 2009

Не используйте reader.ready (). Просто вызовите readLine () и пусть readLine () блокируется, пока данные не будут готовы. В конце данных обычно указывается нулевая строка.

Если это полезно, пара примеров кода на моем веб-сайте: чтение с URL .

1 голос
/ 16 апреля 2009

Во-первых, было бы полезно, если бы вы опубликовали свой фактический код.

Полагаю, проблема в том, чтобы позвонить Reader.ready. Аналогично InputStream.available, возвращает true, если вход уже буферизован. Если ему нужно ждать, скажем, сокета, он вернет false. Как правило, вам не нужно ready. Используйте readLine и выходите из цикла, если он возвращает null (для конца потока).

...