

JAVA I.O 는 Input 과 Output 이다
Java 에서는 시스템 외부로부터의 data 도 다룰 수 있다.
시스템 안밖으로 이동하는 data 의 흐름을 Stream 이라고 한다.
자바는 파일이나 콘솔의 입출력을 Stream 이라는 흐름을 통해 다룬다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다.
대략 데이터를 마시고 뱉는 빨대 역할로 이해할 수 있다.

Java.io package 는 크게 InputStream 과 OutputStream 으로 나뉜다
InputStream 은 외부에서 파일을 읽어올 때 사용하고
OutputStream 은 파일을 외부로 내보낼 때 사용한다.
자바에서 스트림 생성은 스트림 클래스 타입의 인스턴스를 생성한다는 의미다.
바이트 기반과 문자 기반으로 분류가 된다.

InputStream / OutputStream 아래 하위 클래스들은 각 특화된 분야들이 있다.
그래서 직접 최상위 클래스를 사용하는 경우는 드물다.
FileInputStream( ) 생성자와 FileOutputStream( ) 생성자의 매개변수 안에는 들어올 스트림의 경로와 내보낼 스트림의 경로를 지정해줘야 한다.
이때 문자열로 직접 지정도 가능하지만 File 객체가 담긴 변수를 저장하는 방법도 있다.
FileOutputStream( ) 는 보낼 경로에 파일을 생성해준다.
이때 FileOutputStream( 경로,true ) 를 통해 새로 파일을 추가하지 않고 기존 파일의 끝에 내용을 추가할지 지정해줄 수 있다.


read( ) 메서드를 이용하여 입력 스트림으로부터 다음 바이트를 읽는다.
read( ) 메서드는 해당 입력 스트림에서 더이상 읽어드릴 바이트가 없으면 -1을 반환한다.
이때 byte 는 0~255 까지의 정보라 -1 이 표현이 안되서 read( ) 메서드의 반환타입은 int 형이다.

한 바이트씩 받는 방식을 사용하면 안정적이나 속도가 느리다는 단점이 있다.
네트워크에서 파일을 전송 시에 사용한다. ( 안그러면 깨짐 )

byte[ ] 배열을 매개변수로 사용시 미리 공간을 지정해놓고 특정 바이트를 읽어들인 후 배열에 저장한다.
한번에 배열로 쭉 가져와서 Outstream 에 쭉 내보내기 때문에 속도가 빠르다는 장점이 있다.

write( ) 메서드를 이용하여 출력 스트림에 특정 바이트를 저장한다.
이 때 byte[ ] 를 사용하면 배열 길이만큼 해당 출력 스트림에 저장한다. 그래서 하나씩 출력 스트림에 저장하는 것보다 속도가 빠르다.

여기서 InputStreamReader 은 바이트 스트림을 문자로 변환해 주는 보조 스트림이다.


buffer 는 전송 받은 내용들을 모아서 한꺼번에 전송할 수 있도록 해주는 임시 저장소이다.
buffer 보조 스트림 생성시 8192 byte(i/o) 또는 8192(r/w) 자의 저장소가 생긴다.
앞서 byte[] 배열을 사용한 것도 Buffered 의 일종이다.
주스트림의 read() close()는 사용이 동일하다.


스트림은 기본 자료형 타입의 데이터를 전송할 수 없다. 그래서 나온 것이 Data 보조 스트림이다.
자료형 별 메서드가 존재한다.



파일 및 디렉터리( 폴더 ) 에 관한 작업을 할 수 있는 클래스이다.
( 스트림을 통해서는 파일의 제거 및 폴더에 관한 작업을 수행할 수 없다. )
File file = new File(저장할 경로); 를 이용하여 객체를 생성한다.

mkdir( ) : 지정된 경로에 폴더 하나를 생성하고 true/false 를 반환한다.
mkdirs( ) : 폴더를 여러개 생성시 사용한다. 상/하위 폴더까지 만들 때 쓰인다.

exists( ) : 지정한 경로에 해당 파일이 존재하는지 true/false
createNewFile( ) : 지정한 경로에 파일을 생성한다.


이러한 File[ ] 배열 안의 파일 정보들을 꺼내 사용하기 위해 HashMap 과 그 HashMap 을 담을 ArrayList 컬렉션을 사용한다.
향상된 for 문을 통해 File을 하나씩 꺼내고 메서드를 이용해 정보를 얻어 생성한 HashMap 객체에 그 정보들을 담고(put) 객체를 ArrayList 에 저장한다.
이때 HashMap 객체를 매번 생성하는 이유는 하나의 HashMap 객체를 사용하면 마지막 파일의 정보로만 덮어쓰여지기 때문이다.
isDirectory( ) : 지정된 경로에 폴더가 존재하는지 true/false
getName( ) : 지정한 경로의 파일 또는 디렉토리 이름
length( ) : 지정한 경로의 파일의 크기(byte)
isHidden( ) : 파일이 숨겨져있는지 true/false


참고 :
https://4sii.tistory.com/3
http://webprogramming.co.kr/admins_blog/1397
