HttpConnection - javax.microedition, возвращающий -1 для метода getLength ()

Я пытаюсь запрограммировать очень простое мобильное приложение (J2ME) на java. Идея состоит в том, чтобы получить доступ к веб-сайту через ввод URL-адреса и прочитать содержимое веб-сайта в буфер.

Вот в чем проблема. Это отлично работает для некоторых URL-адресов, но не для других? Пример ниже (википедия) работает нормально. Но возьмите "http://java.com/en/about/" в качестве примера, а "HttpConnection hc" возвращает -1 для getLenght (), поэтому нет содержимого для чтения в буфер?

Вот мой код:

        String url = "http://en.wikipedia.org/wiki/RSS";

        //Sets up HttpConnection and InputStream using the URL variable
        HttpConnection hc = null;
        InputStream is = null;

        try {
            hc = (HttpConnection) Connector.open(url);
            is = hc.openInputStream();
        } catch (IOException ie) {
            System.out.println(ie.getMessage());
        }

        //Reader object created to read input from InputStream
        Reader rdr = new InputStreamReader(is);

        //Variable "content" will store HTML code
        String content = "";

        //Get the lenght of the data to set the buffer sizes
        int len = (int) hc.getLength();

Любые идеи? дайте мне знать, если я что-то пропустил!

Просто для информации я использую Netbeans 6.9.1

Библиотека для HttpConnection: javax.microedition.io.HttpConnection; + "импорт javax.microedition.io.Connector;"


person FloweN    schedule 23.02.2011    source источник
comment
Почему бы вам просто не использовать динамически растущий буфер, такой как ByteArrayOutputStream (который также должен быть доступен в J2ME).   -  person Joachim Sauer    schedule 23.02.2011
comment
Но это не решает проблему, когда hc.getLength имеет значение -1?   -  person FloweN    schedule 23.02.2011


Ответы (1)


HTTP-ответ от java.com:

HTTP/1.1 200 OK
Server: Sun-Java-System-Web-Server/7.0
Date: Wed, 23 Feb 2011 11:07:44 GMT
Content-Type: text/html;charset=UTF-8
Set-Cookie: JSESSIONID=B62F3DFB233BB2806018EC721F6C3FD7; Path=/
Content-Encoding: gzip
Vary: accept-encoding
Transfer-Encoding: chunked

HTTP-ответ из Википедии:

HTTP/1.0 200 OK
Date: Wed, 23 Feb 2011 10:18:56 GMT
Server: Apache
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Content-Language: en
Vary: Accept-Encoding,Cookie
Last-Modified: Fri, 18 Feb 2011 00:23:59 GMT
Content-Encoding: gzip
Content-Length: 24905
Content-Type: text/html; charset=UTF-8
Age: 2984
X-Cache: HIT from sq61.wikimedia.org, MISS from sq38.wikimedia.org
X-Cache-Lookup: HIT from sq61.wikimedia.org:3128, MISS from sq38.wikimedia.org:80
Connection: keep-alive

Как видите, HTTP-ответ http://java.com/en/about/ не содержит t содержат заголовок Content-Length, содержимое разбивается на фрагменты.

Итак, getLength () возвращает -1.

person kliu    schedule 23.02.2011
comment
Спасибо за ответ. Полагаю, это моя проблема? Передача-кодирование: фрагментировано, мне нужно, возможно, создать оператор if, чтобы определить, разбит ли содержимое на фрагменты (так что getLenght () равно -1), и если он разбит на фрагменты, разработайте способ, чтобы эти фрагментированные данные были помещены в буфер ? - person FloweN; 23.02.2011
comment
@FloweN, на самом деле, вам не нужно проверять длину контента. Вам просто нужно проверить конец потока при чтении контента. - person kliu; 23.02.2011
comment
Например, final StringBuffer buf = new StringBuffer (); final BufferedReader br = новый BufferedReader (новый InputStreamReader (есть)); Строка строки; while ((line = br.readLine ())! = null) {если (line.trim (). length () ›0) {buf.append (line) .append (\ r \ n); }} br.close (); final String content = buf.toString (); - person kliu; 23.02.2011
comment
В этом есть смысл! Но я не могу использовать BufferedReader в J2ME? - person FloweN; 23.02.2011
comment
@FloweN, InputStreamReader тоже в порядке. Метод чтения Reader вернет -1, если достигнут конец потока. последний StringBuffer buf = новый StringBuffer (); final Reader reader = новый InputStreamReader (есть); последний символ [] c = новый символ [1024]; int n = 0; в то время как (-1! = (n = reader.read (c))) {buf.append (c, 0, n); } reader.close (); final String content = buf.toString (); - person kliu; 24.02.2011
comment
Большое спасибо за помощь kliu, теперь я понимаю как это работает :) - person FloweN; 24.02.2011