secondo me crei una classe.
ha una variabile intera interna che indica dove scrivere (su file o su terminale o quant'altro)
poi una funzione pubblica scrivi, che in base al valore della variabile sopracitata esegue il giusto codice.
non potrai fare
codice:
out = System.out;
out = new PrintWriter(new File("xxx.txt"));
ma
codice:
out = new NomeClasse(System.out);
out = new NomeClasse( new PrintWriter(new File("xxx.txt")) );
//addirittura
out = new NomeClasse( new File("xxx.txt") );
ovvio che sta a te scrivere il codice dei costruttori e utilizzo dei flussi