'Programming/Java'에 해당하는 글 56건

Stream 변환

Programming/Java 2013. 2. 18. 00:05

스트림 데이터를 한 바이트나 한 문자 단위로 처리하지 않기 위해 다른 스트림들로 변환할 수 있습니다.

 

특수한 경우를 제외하고는 다음의 변환 규칙을 적용합니다.
입력 스트림 <-> 입력 스트림 계열
출력 스트림 <-> 출력 스트림 계열
바이트 스트림 <-> 바이트 스트림 계열
문자 스트림 <-> 문자 스트림 계열

 

특수한 경우란 아래와 같습니다.
입력 스트림 <-> 출력 스트림
바이트 스트림 <-> 문자 스트림
이 때는 InputStreamReader / OutputStreamWriter 를 사용하여 변환할 수 있습니다.
바이트 스트림 내에 바이트가 아닌 문자 데이터가 있어서 문자 단위로 핸들하고자 할 때 사용하면 되겠습니다.

 

import java.io.*;
public class TransStreamMain {
	public static void main(String[] args) throws IOException {
		int i;
		System.out.println("종료를 원하면 끝 써봐!");
		while( (i=System.in.read()) != '끝' ) {
			System.out.print((char)i);
		}
	}
}

 

위 예는 InputStream인 System.in에서 1byte씩 읽어오는데, 2byte짜리 '끝'이란 문자를 읽을 수 없기 때문에 while 문을 빠져나올 수 없습니다. 이 때 System.in 을 문자 단위 스트림으로 변환하면 '끝'이란 문자를 사용하여 입력을 종료할 수 있습니다.

 

InputStreamReader isr = new InputStreamReader(System.in);  
while( (i=isr.read()) != '끝' ) {
	System.out.print( (char)i );
}

 

버퍼를 이용하여 속도를 향상시키는 변환 역시 위 방법과 유사합니다.
BufferedReader, BufferedWriter(Buffered 문자 스트림)
BufferedInputStream, BufferedOutputStream(Buffered 바이트 스트림)
BufferedReader는 readLine()을 제공하여 행 단위로 빠르게 읽습니다.

 

String temp;
if( (temp=br.readline()) != null ) {
	System.out.println(temp);
}

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Memory Stream

Programming/Java 2013. 2. 17. 23:37

Memory 스트림은 메모리를 스트림처럼 사용할 수 있게 하며, 목표지점이 메모리입니다.
프로그램에서 사용하는 메모리는 배열과 문자열 등이 있습니다.
메모리의 출력 스트림은 메모리를 그 대상으로 하기 때문에 목표지점을 생략해도 되며,
동적으로 메모리 크기를 늘려주기 때문에 크기를 알 수 없는 배열의 출력에 사용하면 좋습니다.

 

바이트 배열을 이용하는 입력 스트림 : ByteArrayInputStream
바이트 배열을 이용하는 출력 스트림 : ByteArrayOutputStream
문자 배열을 이용하는 입력 스트림 : CharArrayReader
문자 배열을 이용하는 출력 스트림 : CharArrayWriter
문자열을 이용하는 입력 스트림 : StringReader
문자열을 이용하는 출력 스트림 : StringWriter

 

아래의 예는 바이트 배열로 메모리를 사용하지만, 문자/문자열도 사용방법은 유사합니다.

import java.io.*;
public class ByteArrayStreamMain {
	public static void main(String[] args) throws IOException {
		int i;
		byte[] arr = {'o','o','p','s','4','u'};

		// ByteArray Stream
		ByteArrayInputStream bai = new ByteArrayInputStream(arr);
		ByteArrayOutputStream bao = new ByteArrayOutputStream();

		// arr 배열을 ByteArrayOutputStream 에 기록
		while( (i=bai.read()) != -1 ) {
			bao.write(i);
		}

		System.out.println( arr );	// [@811c88
		System.out.println( bai );	// java.io.ByteArrayInputStream@785d65
		System.out.println( bao );	// oops4u

		// Byte 배열 얻기
		byte[] res = bao.toByteArray();
		for( i=0; i<res.length; i++ ) {
			System.out.print( (char)res[i] );	//oops4u
		}

		bai.close();
		bao.close();
	}
}

 

위에서 bao 만 출력해도 기록된 모든 바이트 배열이 출력되는데,
굳이 toByteArray() 로 다시 배열을 만들고 for 문으로 돌려서 출력하는 이유는?;;

 

문자열을 이용한 출력 스트림인 StringWriter 에 기록된 데이터는
toString() / getBuffer() 등의 메소드를 이용하여 얻어낼 수도 있습니다.

sw.toString();
sw.getBuffer();

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

RandomAccessFile

Programming/Java 2013. 2. 15. 01:02

이 클래스는 순차적으로 데이터를 읽는 File Stream이 할 수 없는, 지정한 위치에서 파일을 쓰거나 읽는 것을 가능하게 합니다.

 

import java.io.*; public class RandomAccessFileMain { public static void main(String[] args) throws IOException { String a = "nice oops4u"; String b = "finger ghost"; // 목적파일과 모드, w의 경우 파일이 없다면 생성 RandomAccessFile rf = new RandomAccessFile("test3.txt", "rw"); // 삽입 rf.writeBytes(a); // nice oops4u // offset 이동 rf.seek(5); // 삽입 rf.writeBytes(b); // nice finger ghost rf.seek(5); System.out.println( rf.readLine() ); // 현재 위치에서 라인 끝까지 출력 finger ghost } }



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

File copy

Programming/Java 2013. 2. 15. 00:33

파일을 복사할 때는 버퍼링 기능을 사용하면 빠르므로, Buffered Stream으로 변환해서 사용합니다.

 

  • BufferedInputStream
  • BufferedOutputStream

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

File Stream

Programming/Java 2013. 2. 15. 00:09

바이트 단위의 입력 파일 스트림 : FileInputStream
바이트 단위의 출력 파일 스트림 : FileOutputStream
문자 단위의 입력 파일 스트림 : FileReader
문자 단위의 출력 파일 스트림 : FileWriter

 

문자를 핸들하고 싶으면 바이트보다는 문자 단위의 스트림을 사용하는 것이 효율적일 것입니다.
바이트 단위든, 문자 단위든 사용법은 거의 흡사합니다.

 

바이트 단위의 입출력 파일 스트림 예)
(문자 단위의 입출력 파일 스트림은 바이트 단위의 코드와 거의 같습니다.)

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,