Las dos clases no son mutuamente excluyentes - puedes usar ambos si tus necesidades son adecuadas.
Cuando recogió, BufferedInputStream trata sobre la lectura en bloques de datos en lugar de un solo byte a la vez. También proporciona el método práctico de readLine(). Sin embargo, también se usa para buscar datos en la secuencia y luego regresar a una parte anterior de la transmisión si es necesario (consulte los métodos de marcar() y restablecer()).
DataInputStream/DataOutputStream proporciona métodos de conveniencia para leer/escribir ciertos tipos de datos. Por ejemplo, tiene un método para escribir/leer una cadena UTF. Si tuviera que hacer esto usted mismo, tendría que decidir cómo determinar el final de la Cadena (es decir, con un byte terminador o especificando la longitud de la cadena).
Esto es diferente de readLine() de BufferedInputStream que, como suena el método, solo devuelve una sola línea. writeUTF()/readUTF() tratan con cadenas: esa cadena puede tener tantas líneas como quiera.
BufferedInputStream es adecuado para la mayoría de los procesos de texto. Si está haciendo algo especial, como tratar de serializar los campos de una clase en un archivo, querrá utilizar DataInput/OutputStream, ya que ofrece un mayor control de los datos a nivel binario.
Espero que ayude.
¿Qué te hace pensar que son intercambiables? – Raedwald