Из недавнего обзора кода коллега предложил использовать «Попробуйте с оператором ресурсов». Поэтому я погуглил и изменил свой код.
Я тестирую CSV на 600 строк, используя ожидаемые результаты от API в Java 11. Итак, для каждой строки CSV я делаю запрос на получение. После внесения изменений я обнаружил, что мои тесты занимают на ± 30% (в зависимости от ответа API) больше времени. Я обнаружил проблему, но не понимаю, почему это происходит.
Это код перед MR:
public static String getApiResponseBody(HttpURLConnection con) throws IOException {
String inputLine = null;
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
try {
inputLine = in.readLine();
in.close();
con.disconnect();
} catch (IOException e) {
error.error("Can't get API response! " + e);
}
return inputLine;
}
До изменений
Код с «попробуйте с ресурсами»:
public static String getApiResponseBody(HttpURLConnection con) {
String inputLine = null;
try (BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()))) {
inputLine = in.readLine();
con.disconnect();
} catch (IOException e) {
error.error("Can't get API response! " + e);
}
return inputLine;
}
попробуйте с ресурсами
Вот как я исправил проблемы с производительностью:
public static String getApiResponseBody(HttpURLConnection con) {
String inputLine = null;
try (BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()))) {
inputLine = in.readLine();
*in.close();*
con.disconnect();
} catch (IOException e) {
error.error("Can't get API response! " + e);
}
return inputLine;
}
закрытие BufferedReader при попытке с ресурсами
Итак, читая все, BufferedReader реализует Closable, поэтому нет необходимости закрывать его, если используется «попытка с ресурсами». Кроме того, когда я использовал блок «окончательный захват лотка», Intellij предложил заменить его на «попробовать с ресурсами» и автоматически удалил in.close (); . Очень хотелось бы понять, что здесь происходит. Эта проблема производительности не так важна для 600 строк, но мне нужно расширить мои тесты до 500 тыс. Строк, поэтому разница составляет ± 30%. Спасибо!