#java #url
#java #url
Вопрос:
Я использую этот код для чтения содержимого с заданного URL. Есть ли более быстрый и лучший способ сделать это?
private static String readUrl(String urlString) throws Exception {
BufferedReader reader = null;
try {
URL url = new URL(urlString);
reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer buffer = new StringBuffer();
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1)
buffer.append(chars, 0, read);
return buffer.toString();
} finally {
if (reader != null)
reader.close();
}
}
Комментарии:
1. Что такое «лучше»? (быстрее? менее подробный? лучшие практики?)
2. лучшая производительность, меньшее время выполнения
3. Опубликованный вами код не имеет ничего общего с JSON и не выполняет синтаксический анализ: на самом деле вы спрашиваете о быстром способе загрузки строки с заданного URL, верно?
4. ваш код в порядке. Я предполагаю, что если есть проблемы с производительностью, то они либо при генерации JSON на сервере, либо при его обработке на клиенте, но не при его фактическом чтении
5. да, мне нужно прочитать строку из URL-адреса, чтобы проанализировать ее, но является ли это хорошим способом загрузки строки с URL-адреса?
Ответ №1:
Используйте StringBuilder
вместо StringBuffer
Комментарии:
1. это поможет много или мало?
2. Это будет немного быстрее. Из
StringBuilder
javadoc: этот класс предоставляет API, совместимый со StringBuffer, но без гарантии синхронизации. Этот класс предназначен для использования в качестве замены StringBuffer в тех местах, где строковый буфер использовался одним потоком (как это обычно бывает). Там, где это возможно, рекомендуется использовать этот класс предпочтительнее StringBuffer, поскольку он будет быстрее в большинстве реализаций .3. Спасибо mochael667, но я ищу лучше, чем немного быстрее ;), есть идеи?
4. Единственное, что вы можете улучшить в той части кода, которую вы опубликовали, — это лучшее сетевое соединение 😉
Ответ №2:
Это HTTP-URL? Если да, то вы
- необходимо посмотреть на
Content-Type
заголовок и убедиться, что вы применяете правильную кодировку к потоку. Как бы то ни было, вы применяете кодировку по умолчанию для вашей конкретной установки JVM, которая может не соответствовать тому, что отправляет сервер - следует посмотреть на
Content-Length
заголовок, чтобы предварительно изменить размер вашего буфера.
Кроме этих двух изменений, не так много возможностей ускорить байты по сети.
Редактировать: вы также можете использовать Jakarta Commmons IOUtils.toString() для чтения потока. Это уменьшит объем кода, который вам нужно написать (и может считаться полностью отлаженным). Однако по пути придется изменять размер буферов.
Ответ №3:
Ну, в Интернете есть библиотеки / исходники, которые сделают это за вас:
Комментарии:
1. Ну, нет, я имею в виду, что код, который у вас есть, подходит для чтения с URL-адреса, но он не имеет ничего общего с JSON. Вы просто получите большую строку, содержащую JSON. Извините, я, возможно, неправильно понял ваш вопрос.
Ответ №4:
Вы также можете использовать «BufferedReader.readLine()»