Day25 - API.IO, Stream, OutputStream, InputStream, 이미지 복사

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, 파일(이미지) 복사에 대해서 알아 보았습니다.

 

고생하셨습니다