'Stream'에 해당되는 글 5

  1. 2011.09.01 바이트배열을 파일로 저장하기
  2. 2011.03.30 바이트 스트림과 문자 스트림
  3. 2011.03.30 표준 출력을 사용하는 어플리케이션을 테스트하는 방법
  4. 2010.10.14 파일 스트림을 이용해서 복사하기
  5. 2010.05.26 오랜만에 스트림을 다뤘더니 헤맨다. ㅎㅎ

바이트배열을 파일로 저장하기


이것도 보고.

추가적인 부분은 알아서들 하시길...

바이트 스트림과 문자 스트림

- 문자 스트림이 필요해서 바이트 스트림을 문자 스트림으로 변환할 때 InputStreamReader, OutputStreamWriter 을 사용한다.

- 반대로 바이트 스트림이 필요한 경우에는?

- 다른 스트림이 필요할 때

표준 출력을 사용하는 어플리케이션을 테스트하는 방법

간혹 UI 를 표준 입/출력을 사용하는 어플리케이션이 있다.
표준 출력으로 메뉴를 보여주고 해당하는 문자를 누르면 다른 기능이 화면에 뿌려진다.
(예전의 PC 통신처럼)

또는 어떤 기능의 실행 성공여부가 표준 출력을 확인해야 하는 경우도 있다.
에러는 나지 않았는데 표준 출력으로 ERROR 이런 문자열만 출력되고 마는 경우가 종종 있는데, 이런 어플리케이션의 테스트를 자동화하는게 힘들다.

고민을 하다보니 표준 출력을 잡아서 비교하면 될거 같다.

System.setOut(PrintStream) 을 사용하면 됨.
바이트 기반 스트림이 필요한데 찾지를 못해서 조금 헤맸다.(감이 떨어지는구나...)
필요하면 File 스트림을 이용해서 파일로 남겨서 처리해도 됨.

파일 스트림을 이용해서 복사하기

서버가 여러 대인 시스템 구성에서 FCKeditor를 이용하면서 파일을 업로드하는 기능을 구현
업로드한 파일이 여러 대의 서버에 저장되거나 단일 파일 서버에 저장되어야 함.
웹에디터의 특성으로 인해 파일(업로드된 이미지)이 웹어플리케이션내에 존재해야 함.
각 서버에 업로드된 이미지 파일이 있어야 하므로 업로드하면서 파일을 각 서버에 복사하기로 함.

- 윈도우즈 환경이라서 네트워크 드라이브를 바로 가기로 만들어서 했는데 안된다고 함.(뭔 말이고???)

- 어떻게 파일 업로드하는 부분을 찾아서 왔다.
net.fckeditor.connector.impl.AbstractLocalFileSystemConnector 를 수정했다고 한다.
그러나 적합한 디렉토리가 아니라는 둥, 에러가 난다.

- 여차저차 디렉토리를 생성하도록 하고 나니 이번에는 파일은 생성되는데 크기가 0이라고 한다.
메서드의 인자중 하나가 inputStream(FileInputStream)으로 넘어온다.
이 스트림을 가지고 org.apache.commons.io.IOUtils.copyLarge(InputStream input, OutputStream output) 을 이용해서 복사한다.

스트림을 이용해서 파일을 복사하고 나면 스트림 끝에 도달했으므로 두번째 복사부터는 파일을 쓸수가 없다.(WRITE)
스트림을 어딘가에 저장해 두었다가 파일 복사할때 스트림을 처음으로 되돌려서 사용하는게 좋겠다.
적당한 녀석이 ByteArrayInputStream 이다.
(RamdomAccessFile 도 될수 있을라나?)

파일 스트림을 읽어서 바이트 배열로 만들어야 하는데 System.arraycopy() 를 쓰면 되겠다 싶었다.

- 물어보기만 하던 녀석이 ByteArrayOutputStream 을 쓸거라고 한다.
오...호

읽어들인 스트림을 처음으로 돌리려면 reset()을 호출한다.

- 덧붙이면, IOUtils.copyLarge()의 리턴값도 체크할 것. 방어적인 코딩이 정신건강에 좋지 않나.

오랜만에 스트림을 다뤘더니 헤맨다. ㅎㅎ

int java.io.InputStream.read() throws IOException
스트림으로부터 데이터를 읽는다.
리턴값은 읽어들인 바이트이고 0 ~ 255 사이의 값을 가진다.
스트림 끝에 도달해서 더이상 읽을 것이 없을때에는 -1을 리턴한다.

int java.io.InputStream.read(byte[] b) throws IOException
스트림으로부터 데이터를 읽어서 바이트 배열에 저장한다.
리턴값은 읽어들인 데이터의 길이이고, 스트림 끝에 도달해서 더이상 읽을 것이 없을때에는 -1을 리턴한다.
인자인 바이트 배열의 길이가 0인 경우 0을 리턴한다.(바이트 배열의 길이가 0보다 큰 경우에는 0을 리턴하지 않는다. 스트림 끝에 도달하면 -1을 리턴한다.)
java.io.FileOutputStream.FileOutputStream(File file) throws FileNotFoundException
출력할 파일이 없으면 예외가 발생한다.
이어쓰기를 하지 않는다.