Ci sono molte domande simili a cui è stata data una risposta. Esempio qui . Tuttavia, hanno entrambi Reader e InputStream all'interno dello stesso ambito o corpo del metodo e pertanto suggeriscono di chiudere l'ultimo della catena ( Reader
) anziché il primo ( InputStream
).
Quindi, per il mio caso particolare, sto costruendo un'API e voglio che gli utenti possano scegliere quale fonte di input usare. Hanno bisogno di flessibilità. Per questo in genere seguo questo tipo di modello:
public class Handler {
public void handle(BufferedReader in) {
in.lines().forEach(System.out::println);
}
public void handle(InputStream in) {
handle(new BufferedReader(new InputStreamReader(in)));
}
public void handle(Class anchor,String resource) throws IOException {
try (InputStream in = anchor.getResourceAsStream(resource)) {
handle(in);
}
}
public void handle(String resource) throws IOException {
try (InputStream in = ClassLoader.getSystemResourceAsStream(resource)) {
handle(in);
}
}
public void handle(Path path) throws IOException {
try (InputStream in = Files.newInputStream(path)) {
handle(in);
}
}
public void handle(File file) throws IOException {
try (InputStream in = Files.newInputStream(file.toPath())) {
handle(in);
}
}
public static void main(String args[]) throws NoSuchMethodException, IOException {
Handler h = new Handler();
h.handle(Handler.class,"/readme.txt");
}
}
Penso che abbia i seguenti vantaggi:
- Solo il proprietario della risorsa può chiuderlo. Nel caso di lettore / input, il vantaggio non è così chiaro. Tuttavia, se fosse stato scrittore / prodotto, questo mi avrebbe permesso di far funzionare più funzioni consecutive una dopo l'altra sulla stessa risorsa. Penso che abbia senso come API.
- Semplice da capire: se passi / possiedi la risorsa, hai la responsabilità di chiuderla.
- Se passi un nome di risorsa (
String
), è chiaro che l'API dovrà occuparsi sia dell'apertura che della chiusura della risorsa.
Quindi c'è una differenza con gli altri post, sia in situazione, sia su come rispondere:
- Qui: se
Reader
oInputStream
viene passato come parametro a un metodo di un'API, quindi non.close()
su di esso all'interno del corpo del metodo API. - Altro: se all'interno dello stesso ambito,
InputStream
è concatenato conReader
, quindi chiude sempre l'ultimo della catena (Reader
).
Penso che abbia senso, ma è un modo corretto di gestirlo?