Oi Daniel, tudo bem?
A principal diferença é que o PrintWriter oferece alguns métodos adicionais para formatação, como o println e o printf (enquanto o FileWriter possui apenas um conjunto básico de métodos). O FileWriter lança uma IOException em caso de falha de IO. Por outro lado, nenhum dos métodos do PrintWriter lança IOException; em vez disso, retorna um booleano que pode ser obtido usando checkError().
PrintStream imprime em um OutputStream e PrintWriter imprime em um Writer. Ou seja, o PrintWriter é utilizado para saída de texto, PrintStream é utilizado para saída binária. A principal diferença que um OutputStream é um fluxo de bytes, enquanto um Writer é um fluxo de caracteres.
O PrintStream é anterior ao JDK 1.1 quando os fluxos de caracteres do Reader / Writer foram introduzidos. O PrintStream é usado quando você envia arquivos pela rede ou os grava no disco e opera em fluxos / bytes que não são codificados em texto.Quando é um arquivo baseado em texto / caracteres e você escreve vários caracteres ou cadeias, geralmente usamos o PrintWriter.