Java에서 입출력시 InputStream과 OutputStream을 사용한다. 이 들은 각각 추상 클래스기 때문에 별도의 구현체를 사용한다.
Byte Stream
데이터를 바이트 단위로 주고 받을 때 사용한다.
InputStream

BytesArrayInputStream: 바이트 배열을 읽기 위해서 내장된 버퍼를 사용한다.FileInputStream: 파일을 바이트 단위로 읽기위해서 사용한다.FilterInputStream:InputStream에 추가 기능을 사용하기 위해서 사용한다. 이는 다른InputStream을 포함하고 있어야되면 단독으로 사용은 불가능하다.BufferedInputStream: 입력 성능을 개선하기 위해 사용한다. 특정 크기(기본값 8bytes)만큼의 버퍼를 할당한 후 데이터를 미리 읽고 저장한다. 이후 주가적인 읽기 작업이 필요하면 버퍼의 크기를 늘려 읽기를 실행시킨다.DataInputStream: Java의 원시 타입으로 읽을 때 사용한다.LineNumberInputStream: 현재 줄 번호를 추적하는데 사용한다.PushBackInputStream: 바이트 단위로 읽기를 취소할 때 사용할 수 있다.
ObjectInputStream: 객체로 역직렬화 할 때 사용한다.PipedInputStream: 다른 스레드로부터 데이터를 읽을 때 사용한다.SequenceInputStream: 두 개의 스트림을 하나로 연결할 때 사용한다.StringBufferInputStream:@Deprecated
OutputStream

ByteArrayOutputStream: 바이트 배열을 쓰기위해 사용한다.FileOutputStream: 파일을 쓰기위해 사용한다.FilterOutputStream:OutputStream의 데이터를 변환하거나 추가 기능을 사용할 수 있다.FilterOutputStream단독으로 사용할 수는 없다.BufferedOutputStream: 출력 성능을 개선하기 위해 사용한다. 버퍼링된OutputStream이 구현되어 있다.DataOutputStream: Java의 원시 타입으로 쓸 때 사용한다.PrintStream:println()같은 출력을 좀 더 편하게 도와준다.
ObjectOutputStream: 객체를 직렬화할 때 사용한다.PipedOutputStream: 다른 스레드로 데이터를 보낼 때 사용한다.
Character Stream
데이터를 문자 단위로 주고 받을 때 사용한다.
Reader

BufferedReader:Reader의 읽기 요청을 버퍼링할 때 사용한다.LineNumberReader: 줄 번호를 추적하는데 사용한다.CharArrayReader: 문자 배열을 스트림으로 사용할 수 있도록 한다.FilterReader: 문자 데이터를 변환할 때 사용할 수 있다.PushbackReader: 문자 읽기를 취소할 때 사용한다.
InputStreamReader: 바이트 단위 스트림을 문자열 단위로 변환할 때 사용한다.FileReader: 문자 파일을 읽기위해 사용한다.
PipedReader: 다른 스레드로부터 문자를 받을 때 사용한다.StringReader:String으로부터 스트림을 만들 때 사용한다.

BufferedWriter:Writer의 쓰기 요청을 버퍼링 할 때 사용한다.CharArrayWriter: 문자 배열을 스트림으로 사용할 수 있도록 한다.FilterWriter: 문자 데이터를 변환할 때 사용할 수 있다.OutputStreamWriter: 바이트 단위 스트림을 문자열 단위로 변환할 때 사용한다.FileWriter: 문자 파일을 쓰기위해 사용한다.
PipedWriter: 다른 스레드에게 문자를 보낼 때 사용한다.PrintWriter:println()같은 출력을 좀 더 편하게 도와준다.StringWriter:String으로부터 스트림을 만들 때 사용한다.
참고 자료
https://javagyansite.com/2020/03/22/byte-stream-hierarchy-in-java/
https://javagyansite.com/2020/03/22/character-stream-hierarchy-in-java/
https://docs.oracle.com/javase/7/docs/api/java/io/package-tree.html