In Mathematics there are properties/relations that holds in finite cases, but stops to work in infinite cases.
In common life one can buy a printer made in China and print 5-10 copies per day and the printer will wok to the end of his/her life, but if he/she wil try to print more than 100 copies every day the printer will broke soon.
Mathematics, ordinary life ...? Let's talk about Java!
Case 1. Reading files.
For a small number of files the above code will work like a charm, but for a very large fileList, after some time and in some circumstances (depending on CPU, RAM, version of Java etc) we will get IOException: Too many open files.
Case 2. Executing commands.
The result will be the same as in Case 1 with the same IOException: Too many open files.
Case 3. Requesting URLs
... coming soon...
Solutions.
The exceptions from Case 1 and Case 2 may be avoided with a simple finally block where we must dispose/close some of the used objects.
Here we have the solution for the Case 1
Mathematics, ordinary life ...? Let's talk about Java!
Case 1. Reading files.
for(File file : fileList) {
LineIterator it = FileUtils.lineIterator(file);
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
}
For a small number of files the above code will work like a charm, but for a very large fileList, after some time and in some circumstances (depending on CPU, RAM, version of Java etc) we will get IOException: Too many open files.
Case 2. Executing commands.
for(String command : commandList) {
Process p = Runtime.getRuntime().exec(command, null);
p.waitFor();
}
The result will be the same as in Case 1 with the same IOException: Too many open files.
Case 3. Requesting URLs
... coming soon...
Solutions.
The exceptions from Case 1 and Case 2 may be avoided with a simple finally block where we must dispose/close some of the used objects.
Here we have the solution for the Case 1
for(File file : fileList) {
LineIterator it = FileUtils.lineIterator(file, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
it.close();
}
}
And in Remember to Close Your Streams When Using Java's Runtime.getRuntime().exec() we have the solution for the Case 2.for(String command : commandList) {
Process p = null;
try {
p = Runtime.getRuntime().exec(command, null);
p.waitFor();
} finally {
if(p != null) {
IOUtils.closeQuietly(p.getOutputStream());
IOUtils.closeQuietly(p.getErrorStream());
IOUtils.closeQuietly(p.getInputStream());
}
}