Мое приложение каким-то образом выдает «java.io.FileNotFoundException: / file / path (Too many open files)», и я понятия не имею, какая часть вызывает это исключение, потому что try-with-resources должен закрыть файлпосле написания, но это как-то не так.У меня нет других ресурсов, которые пишут в файлы, поэтому это не может быть вызвано внешним приложением.
Я также попытался заменить потоки и изменить метод writeToFile (String filename, Double data) нанестатический, поэтому класс B теперь создает новый экземпляр для DataFileWriter в каждом цикле.Я надеялся, что это как-то заставит FileOutputStream закрыться, но это не помогло.
public class A {
public static void main(String[] args) {
List<Data> dataList = dao.getAll();
B classB = new B();
dataList.stream().forEach(data -> {
classB.someMethod(data);
});
}
}
public class B {
public void someMethod(Data data) {
// Some transformation happens here which results in transformedData
writeToFile(filename, transformedData);
}
private void writeToFile(String filename, Double[][] data) {
Arrays.stream(data).forEach(d -> {
DataFileWriter dataFileWriter = new DataFileWriter();
dataFileWriter.writeToFile(filename, d);
});
}
}
public class DataFileWriter {
public void writeToFile(String filename, Double data) {
File file = new File(filename);
if (!file.getParentFile().isDirectory()) file.getParentFile().mkdirs();
try (FileOutputStream fOut = new FileOutputStream(filename, true) {
byte b[] = data.getBytes();
fOut.write(b);
} catch (IOException e) {
// Exception handling
}
}
}
Было бы неплохо, если бы вы могли помочь мне решить эту проблему.Изменение максимального количества разрешенных открытых файлов невозможно, поскольку предполагается, что приложение должно обрабатывать гораздо больше данных, чем в его текущем состоянии.
ОБНОВЛЕНИЕ
Я изменилНесколько вещей, чтобы уменьшить использование памяти, но все же я получаю ту же ошибку после того, как программа записала ровно 5016 файлов.Я прошел весь код, но ничего не смог понять.Единственное место, где я могу представить, что исключение каким-то образом вызвано, - это вызов API, когда соединение установлено, но здесь я тоже не вижу никаких ошибок.
protected static CoreEntity[] sendGET(CoreEntity[] resultList, String path) throws IOException, JSONException {
return handleResponse(resultList, getConnection(path, GET_REQUEST));
}
private static HttpURLConnection getConnection(String path, String requestMethod) throws IOException {
URL url = new URL(REQUEST_URL + path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("accept", "application/json");
connection.setConnectTimeout(50000);
connection.setReadTimeout(50000);
connection.setRequestMethod(requestMethod);
initializeGSON();
return connection;
}
private static CoreEntity[] handleResponse(CoreEntity[] resultList, HttpURLConnection connection) throws IOException {
final int status = connection.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) { // Success
try (InputStreamReader reader = new InputStreamReader(connection.getInputStream()); BufferedReader in = new BufferedReader(reader)) {
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) { response.append(inputLine); }
reader.close();
in.close();
JSONArray jsonArray = getJSONAsArray(response.toString());
resultList = (CoreEntity[]) Array.newInstance(resultList.getClass().getComponentType(), jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++)
resultList[i] = (CoreEntity) GSON.fromJson(jsonArray.get(i).toString(), resultList.getClass().getComponentType());
} catch (IOException | JSONException e) { e.printStackTrace(); }
} else { // Error
System.out.println("Request failed with error code: " + status);
}
connection.disconnect();
return resultList;
}