이번 예제에서는 ByteArrayInputStream 클래스에 대하여 알아 보겠습니다. ByteArrayInputStream 클래스는 스트림으로 부터 읽은 바이트를 내부 버퍼에 보관 유지합니다. 그리고 내부 카운터에 의해 read() 메소드로 읽혀지는 바이트를 추적합니다.
ByteArrayInputStream 클래스는 바이트 입력 스트림을 표현하는 모든 클래스의 슈퍼 클래스인 추상 클래스 InputStream 을 확장(extends) 합니다.
ByteArrayInputStream 클래스는 JDK 1.0 부터 존재 했습니다.
ByteArrayInputStream 클래스의 구조
생성자
- ByteArrayInputStream(byte[] buf)
- 인자로 넘어온 buf 바이트 배열을 사용하는 ByteArrayInputStream 인스턴스를 생성합니다.
- ByteArrayInputStream(byte[] buf, int offset, int length)
- 인자로 넘어온 buf 바이트 배열을 사용하는 ByteArrayInputStream 인스턴스를 생상하며 인스턴스 초기화시 내부 필드인 pos 는 인자값중 offset 을 할당하고 초기화시 내부 필드인 count 는 offset + length 와 인자값인 buf 의 크기중 최소값으로 설정 됩니다. 버퍼 배열은 복사되지 않습니다. 버퍼의 마크는 지정된 offset 으로 설정됩니다.
ByteArrayInputStream read() 예제
간단한 기본 사용법을 보여주는 예제를 보겠습니다.
package kr.co.leehana.example.bytearrayinputstream; import java.io.ByteArrayInputStream; import java.util.Random; public class ByteArrayInputStreamSimpleExample1 { public static void main(String[] args) { byte[] buffer = new byte[10]; Random rnd = new Random(); for (int i = 0; i < buffer.length; i++) { buffer[i] = (byte) rnd.nextInt(); } ByteArrayInputStream b = new ByteArrayInputStream(buffer); System.out.println("All the elements in the buffer:"); int num; while ((num = b.read()) != -1) { System.out.print(num + " "); } } }
위 예제에서 Random 클래스를 이용하여 임의의 숫자를 생성하고 이것을 이용하여 byte 배열을 생성하였습니다. ByteArrayInputStream 클래스에 앞에서 만든 byte 배열을 인자값으로 넘겨 인스턴스를 생성하였습니다. 그리고 난 후 모든 버퍼로부터 숫자들을 read() 메소드를 이용하여 출력하였습니다.
참고로 확인할 내용은 close() 메소드를 호출 하지 않았다는 것입니다. 이것은 close() 메소드를 호출해도 아무일도 일어나지 않기 때문입니다.
ByteArrayInputStream read(byte[]b, int off, int len) 예제
위의 예제에서는 read() 메소드를 이용하여 출력을 하였습니다. 그러나 같은 이름으로 된 인자값만 다른 read(byte[] b, int off, int len) 메소드가 존재합니다. 이 메소드는 off 로부터 len 만큼 바이트 배열로부터 읽습니다.
예제를 살펴 보겠습니다.
package kr.co.leehana.example.bytearrayinputstream; import java.io.ByteArrayInputStream; public class ByteArrayInputStreamSimpleExample2 { public static void main(String[] args) { byte[] buf = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ByteArrayInputStream b = new ByteArrayInputStream(buf); byte[] newBuffer = new byte[6]; int num = b.read(newBuffer, 2, 4); System.out.println("Bytes read: " + num); for (int i = 0; i < newBuffer.length; i++) { int nr = (int) newBuffer[i]; if (newBuffer[i] == 0) System.out.print("-null- "); else System.out.print(nr + " "); } } }
위 예제에서 b.read(newBuffer, 2, 4) 를 썻습니다. 이 메소드를 호출할때 넘긴 인자값들은 ByteArrayInputStream 의 인스턴스인 b 로부터 4개의 요소로를 읽어 새로운 바이트 배열인 newBuffer 에 2번째(off) 인덱스부터 4개의(len) 요소를 읽어 대입합니다. 이렇게 해서 newBuffer 바이트 배열의 첫번째와 두번째에 왜 null 값이 들어가는지를 알수 있습니다.
예제를 실행하면 아래와 같은 결과가 출력됩니다.
Bytes read: 4 -null- -null- 1 2 3 4
ByteArrayInputStream 사용자 입력 예제
아래의 예제는 사용자로 부터 입력을 받아 대문자로 출력하는 간단한 예제 입니다.
package kr.co.leehana.example.bytearrayinputstream; import java.io.ByteArrayInputStream; import java.util.Scanner; public class ByteArrayInputStreamCapitalizerExample { public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("Enter a string: "); String message = stdIn.nextLine(); StringBuilder sb = new StringBuilder(); ByteArrayInputStream str = new ByteArrayInputStream(message.getBytes()); int ch; while ((ch = str.read()) != -1) { sb.append(Character.toUpperCase((char) ch)); } System.out.println("Your capitalized message: " + sb.toString()); } }
위 예제는 입력받은 문자열로 부터 byte 배열을 가지고와서 ByteArrayInputStream 인스턴스를 이용해 모든 byte 를 출력합니다.
예제를 실행하면 아래와 같은 결과가 출력됩니다.
Enter a string: Hello World Java Code Geeks! Your capitalized message: HELLO WORLD JAVA CODE GEEKS!
예제 소스
출처
'공부 > java' 카테고리의 다른 글
Java BufferedInputStream 예제 (0) | 2014.09.23 |
---|---|
Java List remove object 예제 (0) | 2014.09.23 |
java.lang.System 예제 (0) | 2014.09.22 |
Java BufferedOutputStream 예제 (0) | 2014.09.22 |
Java BufferedWriter 예제 (0) | 2014.09.06 |