Как загрузить файл через HTTP и сохранить его содержимое в строке в Java

StackOverflow https://stackoverflow.com/questions/1427508

Вопрос

Я пытаюсь загрузить файл через 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();

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

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

Я ничего не нашел в Интернете по этому поводу, поэтому буду очень признателен за небольшое понимание!

Спасибо.

Это было полезно?

Решение

Проверить HttpClient от Apache Commons, в частности getResponseBodyAsString() метод.

Другие советы

Вот фрагмент кода, который сделает это за вас.В дополнение к тому, что вы пытаетесь сделать, он также может обрабатывать сжатие 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, Фрамерный проект.

Попробуйте этот код, он может не скомпилироваться, так как я его не тестировал, но он должен работать, поскольку все возможные исключения не перехватываются, но вы можете легко добавить это.Обратите внимание на таймауты. НИКОГДА не используйте бесконечные таймауты, поскольку ваша программа когда-нибудь в будущем зависнет, если ресурс будет недоступен.Если вы делаете больше, чем простое извлечение текстового файла, вы можете изучить HTTPклиент из 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());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top