Как скачать файл по HTTP и сохранить его содержимое в виде строки в Java - PullRequest
1 голос
/ 15 сентября 2009

Я пытаюсь загрузить файл по HTTP и сохранить его содержимое в виде строки, как указано в заголовке. Мой подход таков:

URL u = new URL("http://url/file.txt");

ByteArrayBuffer baf = new ByteArrayBuffer(32);
InputStream in = (InputStream) u.getContent(); 
BufferedInputStream bis = new BufferedInputStream(in);

int buffer;
while((buffer = bis.read()) != -1){
    baf.append((byte)buffer);
}

bis.close();
in.close();

Код не выполняется, когда он пытается прочитать из потока, сообщая, что поток закрыт.

Теперь, если вы попытаетесь получить доступ к файлу через браузер, он не будет использоваться как текст, а скорее как файл, который нужно загрузить.

Я нигде не занимался поиском в Интернете по этому поводу, поэтому очень хотелось бы получить немного понимания!

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 сентября 2009

Вот фрагмент кода, который сделает это за вас. В дополнение к тому, что вы пытаетесь сделать, он также может обрабатывать сжатие GZip (если вы установите его в заголовках с помощью Accept-Encoding: gzip, deflate) и автоматически определяет кодировку для вас (требуется для обработки строк).

private InputStream prepareInputStream(String urlToRetrieve) throws IOException
{
    URL url = new URL(urlToRetrieve);
    URLConnection uc = url.openConnection();
    if (timeOut > 0)
    {
        uc.setConnectTimeout(timeOut);
        uc.setReadTimeout(timeOut);
    }
    InputStream is = uc.getInputStream();
    // deflate, if necesarily
    if ("gzip".equals(uc.getContentEncoding()))
        is = new GZIPInputStream(is);

    this.lastURLConnection = uc;
    return is;
}
// detects encoding associated to the current URL connection, taking into account the default encoding
public String detectEncoding()
{
    if (forceDefaultEncoding)
        return defaultEncoding;
    String detectedEncoding = detectEncodingFromContentTypeHTTPHeader(lastURLConnection.getContentType());
    if (detectedEncoding == null)
        return defaultEncoding;

    return detectedEncoding;
}


public static String detectEncodingFromContentTypeHTTPHeader(String contentType)
{
    if (contentType != null)
    {
        int chsIndex = contentType.indexOf("charset=");
        if (chsIndex != -1)
        {
            String enc = StringTools.substringAfter(contentType , "charset=");
            if(enc.indexOf(';') != -1)
                enc = StringTools.substringBefore(enc , ";");
            return enc.trim();
        }
    }
    return null;
}


// retrieves into an String object
public String retrieve(String urlToRetrieve)
throws MalformedURLException , IOException
{
    InputStream is = prepareInputStream(urlToRetrieve);
    String encoding = detectEncoding();
    BufferedReader in = new BufferedReader(new InputStreamReader(is , encoding));
    StringBuilder output = new StringBuilder(BUFFER_LEN_STRING);
    String str;
    boolean first = true;
    while ((str = in.readLine()) != null)
    {
        if (!first)
            output.append("\n");
        first = false;
        output.append(str);
    }
    in.close();
    return output.toString();
}

Код от info.olteanu.utils.retrieve.RetrievePage, Проект Phramer .

3 голосов
/ 15 сентября 2009

Попробуйте этот код, он может не скомпилироваться, так как я не тестировал его, но он должен работать, кроме того, что все возможные исключения не перехвачены, но вы можете легко добавить это. Обратите внимание на тайм-ауты, НИКОГДА не используйте бесконечные тайм-ауты, так как ваша программа будет зависать когда-нибудь в будущем, если ресурс недоступен. Если вы делаете больше, чем просто извлечение текстовых файлов, вы можете взглянуть на HTTPClient Apache Commons.

    URL url = new URL("http://mydomain.com/file.txt");
    URLConnection urlConnection = url.openConnection();
    urlConnection.setConnectTimeout(1000);
    urlConnection.setReadTimeout(1000);
    BufferedReader breader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

    StringBuilder stringBuilder = new StringBuilder();

    String line;
    while((line = breader.readLine()) != null) {
        stringBuilder.append(line);
    }

    System.out.println(stringBuilder.toString());
2 голосов
/ 15 сентября 2009

Извлечение HttpClient от Apache Commons, в частности метод getResponseBodyAsString () .

...