2021. 3. 22. 16:52ㆍ카테고리 없음
한 주가 시작되는 월요일 이네요 ~
점점 날씨가 따뜻해지면서, 옷차림은 얇아 지고 놀러가고 싶어 집니다 ㅎㅎ
하지만, 아직 일교차가 심하기 때문에 외투를 챙기는 게 좋겠어요 ~
오늘은 대면 수업인 날이기 때문에 학원에 출석을 했습니다.
zoom 회의를 통해서 QR코드로 출석이 가능하기 때문인지... 다른 학생 분들이 서서히 1~2명 씩 안나오기 시작했습니다.
특히나 오늘은 월요일이라서 그런지 많이 안 나오셨습니다
오늘은 입출력에 대해서 알아 봅시다
스트림 Stream
먼저 스트림에 대해서 조금은 알고 있어야 하는데요
스트림은 데이터가 지나다니는 통로 라고 생각을 하시면 됩니다.
키보드로 입력을 받으면, 입력받은 데이터들이 입력스트림 을 통해 프로그램으로 들어오게 되고, 출력 스트림을 통해서 모니터에 출력을 하게 됩니다.
그 중에 크게 2가지로 분류가 되는데요
바이트(Byte) 기반 스트림
문자 기반(Char) 기반 스트림
먼저 바이트 기반 스트림 을 사용한 파일 출력을 알아 봅시다
OutputStream
OutputStream는 바이트(1byte) 기반 스트림 입니다. 상위 (추상)클래스
FileOutputStream은 파일을 쓸 때 사용하는 클래스 입니다.
어떻게 사용하는지 한번 보죠
먼저 만들고 싶은 파일명을 받아 줍시다.
한글은 2Byte 이기 때문에, 영어로 입력 해주시는게 좋아요
파일명에 공백이 생기면 문제가 생길 수 있기 때문에, scan.next()를 사용해 줍시다
이렇게 사용을 해주면 되는데요 "" 안에는 만들어줄 곳(경로)을 넣어주면 되겠습니다.
뒤에 만들어줄 파일의 확장자 명까지 잘 챙겨주세요
그리고, 빨간줄(문법상 오류)이 떠있는데, 그 이유는 FileOutputStream() 생성자가 thorws(예외 던지기) 처리가 되어 있어서 그렇습니다.
그래서 try catch 를 써주셔야 해요 ~
그 다음 Scanner를 이용해서 txt파일 내에 써줄 내용도 입력해 줍니다.
위에서 scan.next() 를 사용했기 때문에, 버퍼에 있는 값을 한 번 비워 줍니다.
scan.nextLine();
그 후 txt파일에 써줄 문장을 입력받은 후...
write() 를 써주면 되는데, byte 단위로 처리하기 때문에, byte 또는 byte[] 를 매개변수로 넘겨 주어야 합니다.
String 문자열을 byte로 변형시켜주는 getBytes() 를 써주고, wirte() 안에 매개변수로 넣어 줍니다.
FileOutputStream 은 다 쓰고 난 후에 close()로 닫아 주어야 합니다
close() 도 throws 처리가 되어 있기 때문에, try catch 를 사용해주어야 합니다.
이 처리를 하기 위해서 pos를 try밖에서 만든 겁니다
이제 실행을 해보게 되면 !?
이렇게 잘 만들어 진 것을 확인 할 수 있습니다.
파일을 출력하는게 있으니까, 당연히 입력받는 것도 있겠죠? ( 파일을 읽기 )
InputStream
InputStream 도 OutputStream 이랑 비슷합니다.
InputStream는 바이트(1byte) 기반 스트림 입니다. 상위 (추상)클래스
이미 있는 파일을 불러올 것이기 때문에, 따로 불러올 파일명을 받거나 하진 않았습니다.
파일을 읽는건 read() 를 사용해서 읽어주면 되는데요
읽은 파일의 데이터를 int 형으로 가져 옵니다.
딱 1byte 를 읽어오기 때문에, 한 글자만 가져옵니다 이걸 char 형으로 변환하면 t 입니다
그리고, 읽어올 데이터가 없으면 -1 을 반환합니다
그래서 반복문에 넣어서 출력을 해주셔야 해요 ~
그리고 byte[] 를 사용하는 방법이 있습니다.
result 에는 읽어들인 바이트의 크기(길이) 가 저장이 됩니다.
확인 해보죠
읽어 들인 데이터는 0이 아닌 다른 값을 가지게 되고, 세어보면 총 19개 읽어 들인 걸 확인 할 수 있습니다.
출력은 이렇게 해주시면 되는데,
byte , byte[] 를 사용하는 것의 차이점은 ... byte는 while 안에 read가 있어서 여러번 읽고, byte[]는 while 밖에 read가 있어서 1번 읽는 다는 차이 점이 있습니다.
즉. byte[] 를 사용하는게 속도가 좀 더 빠릅니다.
다 사용했으면 close() 를 해줍니다
이렇게 Byte 기반의 File 입출력에 대해서 알아 보았습니다.
Byte 기반의 File은 문자를 저장하고 읽기 보다는, 이미지, 동영상을 읽는데 사용 합니다.
이미지 , 동영상 도 다 데이터 잔아요? 그리고 Byte 로 저장이 되어 있습니다.
크기가 클 뿐....
이번에는 이미지를 읽고, 다른 경로에 복사하는 걸 해봅시다
이미지 복사
먼저 이미지를 1개 png 파일로 다운로드 해주세요 저는 고양이로 하겠습니다.
다운로드 한 이미지의 이름은 영어로 해주세요. 그 후 이클립스 프로젝트에 드래그 해줍니다.
그리고 Cat.png 에 우클릭을 해서 맨 아래 있는 Properties 를 클릭해줍시다
여기서 경로를 확인하고 복사 해주면 됩니다 ctrl + c
읽어 들일 InputStream을 선언, OutputStream을 선언
읽어 들일 경로를 써줍니다.
그리고, 복사할 경로를 써줍니다. 파일 이름까지 ! ( 파일 이름은 달라도 됩니다 )
그리고 byte[] 를 크기 100으로 만들어 줍니다. -> 최대로 100바이트 단위까지 읽을 수 있습니다.
이제 while 을 돌면서, file을 읽고, 쓰고 해주면 되는데, 더이상 읽을 데이터가 없으면 -1을 반환하기 때문에 중간에 break를 이용해서 while문을 탈출 해줍니다.
쓸때는 write(배열이름, 시작위치, 크기) 를 써주면 됩니다.
위의 코드를 아래와 같이 쓸 수도 있습니다. 같은 뜻이에요 ~
코드가 끝까지 잘 실행되었는지 이클립스 내에서 알기 위해서 try구문 마지막에 출력문을 하나 넣어줍니다
마지막으로 잊지말고, 사용했던 fos , fis 를 close() 해줍시다.
그리고 실행을 후, 복사해주려고 했던 경로를 확인해보면....
이렇게 복사가 완료된 걸 확인 할 수 있습니다.
이번에는 이렇게 Stream, OutputStream, InputStream, 파일(이미지) 복사에 대해서 알아 보았습니다.
고생하셨습니다