공부/JSF2014. 10. 1. 06:25

JSF 어플리케이션에 의해 제공 되는 기능은 다른 Java 웹 어플리케이션과 유사합니다.

일반적인 JSF 어플리케이션은 다음을 포함합니다.

  • 웹페이지의 집합이 되는 컴포넌트들이 배치된다.
  • 태그 세트들은 웹페이지에 컴포넌트들을 추가한다.
  • 최소한의 요구조건과 경량 컨테이너에 의해 관리되는 객체들 (POJO 객체들) 을 나타내는 managed beans 의 집합. 이것은 리소스주입, 생명주기 콜백들과 인터셉터들과 같은 기본 서비스의 세트를 지원합니다.
  • 배포와 관련된 설명이 포함된 (deployment description) web.xml 파일
  • 선택적으로 페이지 네비게이션의 규칙 정의나 custom beans 의 정의, custom 객체, custom 컴포넌트 같은 구성과 하나 혹은 그 이상의 어플리케이션 구성을 위한 faces-config.xml 파일
  • 선택적으로 개발자가 직접 만든 custom 컴포넌트, validator, converter, listener 의 집합들

다음 그림은 기본적인 JSF 어플리케이션에서 클라이언트와 서버 사이의 상호 작용을 보여줍니다. 클라이언트의 요청에 응답하여, JSF 기술을 구현한 웹 컨테이너가 웹 페이지를 랜더링 하는 것을 보여줍니다.

클라이언트가 JSF 페이지를 요청하여 응답하는 그림

myfacelet.xhtml 페이지는 JSF 태그에 의해 생성이 됩니다. 컴포넌트 태그들은 view (그림에서는 myUI) 에 컴포넌트들을 추가하는데 이는 서버측(server-side)에서 표현되는 페이지 입니다. 컴포넌트에 추가로 웹 페이지는 다음과 같은 객체를 참조 할 수 있습니다.

  • 컴포넌트에 등록된 모든 이벤트 리스너, validators 그리고 converters
  • JavaBeans 컴포넌트는 데이터에 접근하며 어플리케이션의 특정 기능을 처리

클라이언트로 부터 요청(request) 을 받으면 응답(response) 을 할때 view 가 랜더링 됩니다. 랜더링은 웹 컨테이너(웹서버)가 서버측(server-side) 뷰를 기반으로 브라우저와 같은 클라이언트가 읽을 수 있는 HTML 혹은 XHTML 을 생성한다.

 


 

출처


'공부 > JSF' 카테고리의 다른 글

JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
JSF, JSP, Servlet 다른점  (0) 2014.09.22
JSF 에 대하여  (1) 2014.09.19
Posted by #HanaLee
공부/java2014. 9. 23. 21:38


이번 예제에서는 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
Posted by #HanaLee
공부/java2014. 9. 23. 18:49


이번 예제에서는 BufferedInputStream 클래스에 대해 알아보겠습니다. BufferedInputStream 클래스는 입력을 버퍼에 추가 하는 기능과 mark() 메소드와 reset() 메소드가 추가 되어있습니다.

BufferedInputStream 클래스는 InputStream 클래스의 모든 메소드를 오버라이드 하는 FilterInputStream 클래스를 확장합니다.

BufferedInputStream 클래스는 JDK 1.0 부터 존재 해왔습니다.

BufferedInputStream 클래스의 생성자 기본 구조

생성자

  • BufferedInputStream(InputStream in)

- 인자값으로 넘어온 입력 스트림을 나중에 사용하기 위해 저장하는 BufferedInputStream 인스턴스를 만듭니다.

  • BufferedInputStream(InputStream in, int size)

- 지정된 크기를 가지는 BufferedInputStream 인스턴스를 만들어 인자로 넘어온 입력 스트림을 나중에 사용하기 위해 저장합니다.

BufferedInputStream 간단 예제

BufferedInputStream 클래스의 기본 사용법을 보여줍니다.

package kr.co.leehana.example.bufferedinputstream;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedInputStreamSimpleExample {

	public static void main(String[] args) {
		BufferedInputStream input = null;
		try {
			input = new BufferedInputStream(new FileInputStream("test.txt"));
			StringBuilder sb = new StringBuilder();
			while (input.available() > 0) {
				sb.append((char) input.read());
			}

			System.out.println("read this :");
			System.out.println(sb.toString());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (input != null) {
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

이 예제에서는 텍스트 파일을 읽어 파일안에 있는 텍스트를 콘솔에 출력 합니다. 파일의 내용을 읽기 위해 입력 스트림으로 FileInputStream 클래스를 이용하여 BufferedInputStream 인스턴스를 생성하였습니다. 그리고 StringBuilder 클래스에 char 형의 데이터 타입으로 추가 해주고 마지막에 스트링타입으로 출력 하였습니다.

마지막에는 잊지말고 BufferedInputStream 인스턴스를 close() 메소드를 호출하여 닫아 주어야 합니다.

BufferedInputStream 추가 예제

이번 예제는 web 서비스로부터 응답된 내용을 출력하는 것을 보여드립니다. 이 예제를 위해 간단한 HttpClient 클래스를 먼저 만들겠습니다.

package kr.co.leehana.example.bufferedinputstream;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class SimpleHttpClient {

	private URL baseurl;

	public SimpleHttpClient(String baseurl) throws MalformedURLException {
		this.baseurl = new URL(baseurl);
	}

	public SimpleHttpClient(URL url) {
		this.baseurl = url;
	}

	public String get(String route) throws IOException {
		StringBuilder sb = new StringBuilder();
		String base = this.baseurl.getHost();
		URL u = new URL("http://" + base + route);
		URLConnection conn = u.openConnection();
		BufferedInputStream in = new BufferedInputStream(conn.getInputStream());

		while (in.available() > 0) {
			sb.append((char) in.read());
		}

		return sb.toString();
	}
}

위 클래스는 간단한 HTTP 클라이언트 입니다. get() 메소드를 호출 하여 웹서비스로 부터 결과를 스트링 타입으로 반환합니다.

아래는 HTTP 클라이언트 클래스를 이용하는 예제 입니다.

package kr.co.leehana.example.bufferedinputstream;

import java.io.IOException;

public class BufferedInputStreamWebExample {

	public static void main(String[] args) {
		try {
			SimpleHttpClient client = new SimpleHttpClient("http://httpbin.org");
			String myIp = client.get("/ip");
			System.out.println(myIp);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

예제에서는 간단한 웹서비스인 http://httpbin.org/ 사이트를 이용하였습니다. HTTP client 의 get() 메소드를 호출하게되면 현재 내 컴퓨터의 IP 주소를 JSON 타입으로 반환을 받게 됩니다. 이렇게 반환된 문자열은 JSON 을 다룰 수 있는 어떤 라이브러리든 이용하여 활용 할 수 있을것입니다.

{
  "origin": "223.62.190.39"
}

BufferedInputStream 추가 정보

BufferedInputStream 클래스는 인스턴스가 만들어질때 내부에 버퍼링 배열을 만듭니다. 스트림의 바이트가 입력되면 스트림으로부터 필요에 따라 한번에 다수의 바이트가 내부 버퍼에 추가 됩니다. 그리고 mark() 메소드는 입력 스트림의 특정 위치를 기억합니다. reset() 메소드는 입력 스트림의 마지막 mark 된 위치로 재설정 됩니다.




예제

출처


'공부 > java' 카테고리의 다른 글

Java ByteArrayInputStream 예제  (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
Posted by #HanaLee
공부/java2014. 9. 23. 16:59


이번 예제에서는 java.util.List 인터페이스에 있는 두가지 메소드인 E remove(int index)boolean remove(Object o) 에 대해 알아 보겠습니다. 

  • E remove(int index)

- list 내의 지정된 인덱스 위치에 있는 object 를 제거합니다.

  • boolean remove(Object o)

- 지정된 object 가 list 내에 존재하면 존재하는 첫번째 항목을 제거합니다.

- 이 메소드는 list 내에 존재하는 object 들과 equals() 메소드로 비교하여 제거 합니다.

두가지 메소드에 대한 예제를 살펴보겠습니다.

먼저 두 예제에서 공통으로 사용할 User 클래스 입니다.

User 클래스

package kr.co.leehana.example.listremove;

public class User {
	private String firstname;
	private String lastname;

	public User(String firstname, String lastname) {
		this.firstname = firstname;
		this.lastname = lastname;
	}

	@Override
	public String toString() {
		return "User [firstname=" + firstname + ", lastname=" + lastname + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((firstname == null) ? 0 : firstname.hashCode());
		result = prime * result
				+ ((lastname == null) ? 0 : lastname.hashCode());
		return result;
	}

	// firstname 과 lastname 이 같을때에만 동일하다고 판단.
	// 이클립스에서 자동으로 생성해주는 방법을 사용.
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (firstname == null) {
			if (other.firstname != null)
				return false;
		} else if (!firstname.equals(other.firstname))
			return false;
		if (lastname == null) {
			if (other.lastname != null)
				return false;
		} else if (!lastname.equals(other.lastname))
			return false;
		return true;
	}
}

E remove(int index)

package kr.co.leehana.example.listremove;

import java.util.ArrayList;
import java.util.List;

public class ListRemoveIndexExample {

	public static void main(String[] args) {
		List strList = new ArrayList();
		strList.add("one");
		strList.add("two");
		strList.add("three");

		for (String str : strList)
			System.out.println(str);

		strList.remove(1); // two 제거
		System.out.println("## String 리스트에서 1번째 인덱스의 object 를 제거 한 뒤 ###");

		for (String str : strList)
			System.out.println(str);
		
		System.out.println();

		List userList = new ArrayList();
		userList.add(new User("Tom", "Hawk"));
		userList.add(new User("홍", "길동"));
		userList.add(new User("Michael", "Jordan"));

		for (User user : userList)
			System.out.println(user);

		userList.remove(0);

		System.out.println("### User 리스트로부터 0번째 인덱스의 object 를 제거 한 뒤 ###");
		for (User user : userList)
			System.out.println(user);
	}
}

boolean remove(Object o)

package kr.co.leehana.example.listremove;

import java.util.ArrayList;
import java.util.List;

public class ListRemoveObjectExample {

	public static void main(String[] args) {
		List strList = new ArrayList();
		strList.add("one");
		strList.add("two");
		strList.add("three");

		for (String str : strList)
			System.out.println(str);

		strList.remove("two"); // two 제거
		System.out.println("## String 리스트에서 two object 를 제거 한 뒤 ###");

		for (String str : strList)
			System.out.println(str);

		System.out.println();

		List userList = new ArrayList();
		userList.add(new User("Tom", "Hawk"));
		userList.add(new User("홍", "길동"));
		userList.add(new User("Michael", "Jordan"));

		for (User user : userList)
			System.out.println(user);

		userList.remove(new User("홍", "길동"));

		System.out.println("### User 리스트로부터 홍길동 object 를 제거 한 뒤 ###");
		for (User user : userList)
			System.out.println(user);

	}
}

위 예제에서는 User object 를 ArrayList 에 넘겨 해당하는 object 를 삭제 하였습니다. 이 예제에서 주목해야 할 중요한 점은 List 의 remove(Object o) 메소드가 제대로 동작하게 만들기 위해 User 클래스에서 equals() 메소드를 오버라이드 했다는 점입니다.





예제

출처


'공부 > java' 카테고리의 다른 글

Java ByteArrayInputStream 예제  (0) 2014.09.23
Java BufferedInputStream 예제  (0) 2014.09.23
java.lang.System 예제  (0) 2014.09.22
Java BufferedOutputStream 예제  (0) 2014.09.22
Java BufferedWriter 예제  (0) 2014.09.06
Posted by #HanaLee
공부/java2014. 9. 22. 20:14


자바에있는 System 클래스에 대한 간단한 예제를 몇가지 살펴 보겠습니다. 이 System 클래스는 유용한 필드들을 포함하고 있는데, 표준입력, 표준출력, 표준에러 스트림입니다. System 클래스는 final 로 선언되어 있어서 클래스를 인스턴스화 할 수 없습니다.

또한 System 클래스는 많은 수의 메소드들을 포함하고 있으며 그것들을 이용하여 외부에서 정의된 프로퍼티들이나 환경변수, 파일들과 라이브러리들을 읽거나 할 수 있습니다. 또한 System 클래스는 다른 배열로 배열의 일부를 복사하는 간단한 메소드가 포함되어 있습니다.

System 클래스는 JDK 1.0 부터 포함되어 있었습니다.

System 필드들

        - 표준 입력 스트림

        - 표준 출력 스트림

        - 표준 오류 스트림

  • 참조 : 위의 세가지 스트림들은 이미 열려 있으며 데이터에 접근할 준비가 되어있습니다.

Read line example

package kr.co.leehana.example.system;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadLineExample {

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		
		// 표준 입력 스트림으로부터 라인을 읽습니다.
		String inputLine = reader.readLine();
		
		StringBuilder builder = new StringBuilder(inputLine);
		builder.reverse(); // 입력된 라인을 역으로 정렬
		
		System.out.println("Input string : " + inputLine);
		System.out.println("Reversed string : " + builder.toString());
		System.err.println("Reversed string : " + builder.toString());
		
		reader.close(); // 열려 있는 스트림 닫기
	}
}

위의 예제에서 우리는 표준 입력 스트림으로 부터 완료된 라인을 읽을것 입니다. 그리고 읽어 들인 라인을 역으로 정렬(reversed)하여 표준 출력과 표준 오류 스트림을 이용하여 쓰는 것을 보여줍니다. 예제가 실행 되고 나면 아래와 같은 결과가 출력 됩니다.

Input string : Hello from Java Code Geeks!
Reversed string : !skeeG edoC avaJ morf olloH
Reversed string : !skeeG edoC avaJ morf olloH

Array copy

System 클래스는 현재 배열의 일부를 다른 배열로 복사 할 수 있는 메소드를 제공합니다. 그 메소드의 정의는 다음과 같습니다.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

각각의 인자들

  • src : 원본 배열
  • srcPos : 원본 배열에서 복사가 시작 될 위치
  • dest : 복사의 대상이 될 배열
  • destPos : 복사의 대상이 될 배열에 복사를 할 위치
  • length : 복사가 될 요소의 갯수

예제를 보겠습니다.

package kr.co.leehana.example.system;

public class ArrayCopyExample {
	
	private final static int TOTAL_ELEMENTS = 10;

	public static void main(String[] args) {
		int[] src = new int[TOTAL_ELEMENTS];
		
		for (int i = 0; i < TOTAL_ELEMENTS; i++)
			src[i] = i + 1;
		
		System.out.print("Source array : ");
		for (int i = 0; i < TOTAL_ELEMENTS; i++)
			System.out.print(src[i] + " ");
		System.out.println();
		
		int destSize = src.length / 2;
		int[] dest = new int[destSize];
		System.arraycopy(src, 0, dest, 0, destSize);
		
		System.out.print("Destination array : ");
		for (int i = 0; i < destSize; i++)
			System.out.print(dest[i] + " ");
		System.out.println();
	}
}

위 예제에서 우리는 원본 배열의 절반을 대상 배열에 복사를 하였습니다. 예제를 실행하면 아래와 같은 결과 출력 됩니다.

Source array : 1 2 3 4 5 6 7 8 9 10
Destination array : 1 2 3 4 5

System Properties

System 클래스는 private 인스턴스로 Properties 클래스를 포함하고 있으며, 현재 동작중인 환경에 대한 구성을 제공합니다.

  • 참조 : 중요한 시스템 프로퍼티들은 여기에서 확인 해볼수 있습니다.

아래의 예제를 통해 몇가지 시스템 프로퍼티들을 콘솔에 출력 해보겠습니다.

package kr.co.leehana.example.system;

public class SystemPropertiesExample {

	public static void main(String[] args) {
		// 현재 시스템의 자바 버전을 출력합니다.
		System.out.println("Java version: "
				+ System.getProperty("java.version"));

		// 현재 시스템의 OS 버전을 확인 합니다.
		System.out.println("OS version: " + System.getProperty("os.version"));

		// 현재 유저의 홈디렉토리를 출력 합니다.
		System.out
				.println("Home directory: " + System.getProperty("user.home"));
	}
}

예제를 실행하면 아래와 같은 출력을 볼 수 있으며, 이 출력된 내용은 플랫폼에 따라 달라질 수 있습니다.

Java version: 1.6.0_65
OS version: 10.9.5
Home directory: /Users/voyaging

Environmental variables (환경 변수들)

또한 System 클래스는 환경변수를 읽을 수 있는 getenv() 메소드를 제공하며, 모든 환경 변수를 Map 클래스로 반환합니다.

예제를 통해 확인 해보겠습니다.

package kr.co.leehana.example.system;

import java.util.Map;

public class EnvironmentalVariablesExample {
	public static void main(String[] args) {
		Map<String, String> vars = System.getenv();

		// 모든 환경 변수를 출력합니다.
		for (String key : vars.keySet())
			System.out.println("Key: " + key + ", Value: " + vars.get(key));
	}
}

예제를 실행하면 아래와 같은 출력을 볼 수 있으며, 이 출력된 내용은 플랫폼에 따라 달라질 수 있습니다.

Key: APP_ICON_20159, Value: ../Resources/sts.icns
Key: SHELL, Value: /bin/bash
Key: TMPDIR, Value: /var/folders/6p/cx6thx5n3wj7p_698lk7jy_w0000gn/T/
Key: com.apple.java.jvmMode, Value: client
(중략)
Key: JAVA_MAIN_CLASS_22572, Value: kr.co.leehana.example.system.EnvironmentalVariablesExample

Current Time (현재시간)

System 클래스는 간단한 currentTimeMillis() 메소드를 제공하고 있으며, 현재의 시간을 밀리세컨드로 반환합니다. 이 메소드에 의해 반환되는 값은 현재 시간에서 1970년 1월 1일 자정 UTC 의 시간을 뺀 값입니다.

예제는 아래와 같습니다.

package kr.co.leehana.example.system;

public class CurrentTimeMillisExample {

	public static void main(String[] args) {
		System.out.println("The current time in milliseconds : "
				+ System.currentTimeMillis());
	}
}



예제

출처


'공부 > java' 카테고리의 다른 글

Java BufferedInputStream 예제  (0) 2014.09.23
Java List remove object 예제  (0) 2014.09.23
Java BufferedOutputStream 예제  (0) 2014.09.22
Java BufferedWriter 예제  (0) 2014.09.06
Java List 를 배열로 변환 하는 예제  (0) 2014.09.05
Posted by #HanaLee
공부/java2014. 9. 22. 14:31

이번 예제는 BufferedOutputStream 클래스에 대한 예제 입니다. 이 클래스는 버퍼링된 출력 스트림을 구현합니다. 이렇게 출력 스트림을 설정하게 되면 어플리케이션에서는 각각의 바이트를 쓰기 위해 시스템을 호출 하지 않고 여러개의 바이트를 기본이 되는 출력 스트림에 작성 할 수 있습니다.

BufferedOutputStream 클래스는 FilterOutputStream 클래스를 확장하였으며 FilterOutputStream 은 출력 스트림을 필터 처리 하는 모든 클래스의 상위 클래스입니다. 이러한 스트림은 기본적인 데이터의 sink 로 사용하기 위한 기존에 이미 존재하는 출력 스트림 (기본이 되는 출력 스트림)의 최상위에 있습니다. 다만, 데이터를 도중에 변경하는것이나 추가 기능을 제공하는 경우도 있습니다.

BufferedOutputStream 클래스는 JDK 1.0 부터 도입 되었습니다.

BufferedOutputStream 클래스의 기본 구조.

생성자

            - 기본이 되는 출력 스트림에 데이터를 작성 하기 위한 버퍼링 된 출력 스트림을 생성합니다. 

            - 기본이 되는 출력 스트림에 데이터를 작성 하기 위한 버퍼링 된 출력 스트림을 지정된 버퍼 사이즈로 생성합니다.

BufferedOutputStream 예제-1

다음 소스를 통해 어떻게 BufferedOutputStream 클래스를 이용하여 파일을 작성하는지 살펴 보겠습니다.

package kr.co.leehana.example.bufferedoutputstream;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamBasicExample {

	public static void main(String[] args) {
		BufferedOutputStream stream = null;
		try {
			stream = new BufferedOutputStream(new FileOutputStream("out.txt"));
			stream.write("Hello, World!".getBytes());
			stream.write(System.getProperty("line.separator").getBytes());
			stream.write("I am writting into a file using BufferedOutputStream"
					.getBytes());
			stream.write(System.getProperty("line.separator").getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (stream != null) {
				try {
					stream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

BufferedOutputStream 클래스에는 두개의 write() 메소드가 존재 합니다.

위 예제에서는 write(byte[] b) 를 사용하였는데 이것은 상위 클래스인 FilterOutputStream 클래스의 메소드 입니다. 또한 위 예제에서 사용한 write() 메소드는 바이트배열을 인자로 받기 때문에 getByte() 메소드를 강제로 호출 하였습니다.

항상 기억해야 하는것은 BufferedOutputStream 인스턴스의 사용이 끝났을 때 혹은 더이상 작성할 내용이 없을 때에는 close() 메소드를 호출해야 한다는것입니다.

BufferedOutputStream 예제-2

이번에는 BufferedOutputStream 클래스를 이용하여 파일에 로깅을 기록하는 예제를 살펴 보겠습니다.

먼저 Logger 클래스를 작성합니다.

package kr.co.leehana.example.bufferedoutputstream;

import java.io.FileNotFoundException;
import java.io.IOException;

public class BufferedOutputStreamLoggingExample {

	public static void main(String[] args) {
		Logger logger = null;
		try {
			logger = new Logger("out.log");
			logger.log("Log message 1");
			logger.log("Log message 2");
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (logger != null) {
				try {
					logger.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

다음은 위 Logger 클래스를 테스트 하기 위해 main 메소드가 포함된 테스트 클래스를 살펴 보겠습니다.

package kr.co.leehana.example.bufferedoutputstream;

import java.io.FileNotFoundException;
import java.io.IOException;

public class BufferedOutputStreamLoggingExample {

	public static void main(String[] args) {
		Logger logger = null;
		try {
			logger = new Logger("out.log");
			logger.log("Log message 1");
			logger.log("Log message 2");
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (logger != null) {
				try {
					logger.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

출력된 파일을 열어보면 두줄로 쓰여진 로깅 내용을 확인 할 수 있을 것입니다.

BufferedOutputStream 에 대한 추가 내용

BufferedOutputStream 클래스는 직접적으로 출력 스트림에 쓰지 않습니다. 당연하겠지만 이 클래스는 더 나은 성능으로 스트림에 쓰기 위해 버퍼에 먼저 쓰게 됩니다. 한가지 기억할 것은 버퍼의 크기를 생성자에 넘겨 줄 수 있다는것입니다. 만약 아무값도 넘기지 않으면 기본값(8192)으로 설정됩니다. close() 메소드를 호출하면 버퍼의 내용을 스트림에 쓰게 됩니다. 이것을 확인 하기 위해close() 메소드를 호출 하지 않으면 파일에는 아무것도 쓰지 않게 됩니다.

만약 스트림을 닫지 않고 버퍼의 내용을 파일에 쓰고 싶을때에는 flush() 메소드를 호출 하면 됩니다. 만약 close() 메소드를 호출 한뒤 write() 나 flush() 메소드를 호출하게 되면 IOException 이 발생합니다.

마지막으로 BufferedOutputStream 클래스의 모든 메소드는 IOException 이 발생 할 수 있기 때문에 BufferedOutputStream 클래스의 메소드들을 이용할때에는 try-catch 를 사용해야 합니다.




소스코드

참조


'공부 > java' 카테고리의 다른 글

Java List remove object 예제  (0) 2014.09.23
java.lang.System 예제  (0) 2014.09.22
Java BufferedWriter 예제  (0) 2014.09.06
Java List 를 배열로 변환 하는 예제  (0) 2014.09.05
Java FileWriter 예제  (0) 2014.09.05
Posted by #HanaLee
공부/JSF2014. 9. 22. 06:00

stackoverflow 에서 JSF 에 대해 알아보다 흥미로운 주제의 글이 JSF 태그에서 가장 인기 있는 글로 올라와 있어 공유 해드립니다.

그리고 여담이지만 stackoverflow 가 특별히 기준이 될수는 없겠지만, 질문된 글의 갯수를 보면... JSF 는 역시나 큰 인기는 없는것 같습니다. 하지만 새로운 기술 하나를 알아가는건 중요하다고 생각합니다.

What is the difference between JSF, Servlet and JSP?

이 질문에 대한 답변으로 BalusC 라는 사람이 답변을 달아준게 있습니다. 참고로 JSF 에 대해 구글링을 하거나 stackoverflow 에서 검색을 하다보면 자주 보게 될 이름중 하나이기도 합니다.

JSP (JavaServer Pages)

JSP 는 템플릿 텍스트(HTML, CSS, javascript 등)를 쓸 수 있는 어플리케이션 서버에서 실행되는 Java view technology 입니다. JSP 는 동적으로 페이지의 흐름 또는 출력을 제어 할 수 있는 자바 코드를 작성 할 수 있고 taglibs 를 지원합니다. 잘 알려진 taglibs 로는 JSTL 이 있습니다. JSP 는 주로 태그 라이브러리(taglibs) 와 조합하여 (page, request, session, application scope 가 허용하는 속성을 통해) 백엔드 데이터에 접근할 수 있는 표현식 (Expression Language) 을 지원합니다. 

JSP 는 처음으로 요청되거나 웹어플리케이션이 시작될 때 서블릿 컨테이너에 의해 HttpServlet 클래스를 확장하는 서브클래스로 컴파일하고 웹어플리케이션이 종료 될 때까지 사용됩니다. 이렇게 컴파일된 코드는 웹 어플리케이션 서버의 작업 디렉토리에서 찾아 볼 수 있습니다. 예를 들어 tomcat 의 경우 /work 디렉토리에서 찾을 수 있습니다. JSP 에 요청이 들어오면 서블릿 컨테이너는 컴파일된 JSP 를 실행하며 생성된 출력 (대체로 HTML/CSS/JS) 을 웹서버를 통해 클라이언트에 있는 웹브라우저에 나타나게 됩니다.

Servlet (서블릿)

서블릿은 서버에서 실행되는 Java API(Application programming interface) 이며 이것은 클라이언트에서 보내진 요청(request) 를 가로채고 응답(response) 를 생성하거나 전달한다. 잘 알려진 예로는 HTTP 메소드들중 GET 과 POST 등을 HttpSevlet 클래스로 hook 하는 방법을 제공한다. web.xml 을 통해 URL 패턴을 설정하여 HttpServlet 이 응답(listen) 하게 할 수 있으며 JavaEE6 이후부터는 @WebServlet 어노테이션으로 동일한 설정을 할 수 있다.

서블릿은 처음으로 요청(request) 되거나 웹어플리케이션이 시작될 때 서블릿 컨테이너가 서블릿 인스턴스를 생성하고 웹 어플리케이션이 종료 될 때까지 메모리에 보관되어 사용됩니다. 동일한 URL 패턴에 대해서는 같은 인스턴스를 재사용하게 됩니다. HttpServletRequst 를 통해 요청 데이터에 접근 할 수 있고 HttpServletResponse 를 통해 응답을 처리 할 수 있습니다. 두 객체는 HttpServlet 클래스로 부터 오버라이드 할 수 있는 doGet() 메소드와 doPost() 메소드등의 파라메터값으로부터 사용 할 수 있습니다. 

JSF (JavaServer Faces)

JSF 는 서블릿 API 위에서 동작하며 JSP 및 Facelets 와 같은 다른 자바 기반 뷰 기술에서 사용할 수 있고 웹컴포넌트들의 태그 라이브러리(taglibs)를 지원하는 컴포넌트 기반의 MVC 프레임워크 입니다. JSP 보다는 Facelets 가 JSF 에 더 적합한 뷰 기술 입니다. Facelets 는 Composite Components을 이용한 좋은 템플릿을 제공하는데 하나의 컴포넌트와 반복되어진 컴포넌트를 교체 하고자 할때 JSP 는 템플릿을 위해 오로지 jsp:include 태그를 지원하며 이는 raw 자바 코드를 이용한 커스텀 컴포넌트를 만드는것을 강제 합니다. 만약 가능하다면 JSP 는 사용하지 말고 Facelets 을 이용하여 JSF 를 개발 할 것을 권장합니다.

JSF 는 MVC 프레임워크로써 요청(request) - 응답(response) 를 위한 하나의 컨트롤러로 FacesServlet 을 제공합니다. FacesServlet 은 표준적인 HTTP 요청/응답에 대한 작업을 사용자가 직접 작업할 수 있으며 유저 입력값에 대한 검증(validating)/변환(converting), 그리고 값을 model 객체에 집어 넣고, action 을 실행하고 응답을 랜더링합니다. 뷰(view) 를 위해서는 기본적인 JSP 혹은 Facelets(XHTML) 을 이용하고 모델(model) 로는 JavaBean 을 이용하게 됩니다. JSF 컴포넌트는 뷰와 모델을 바인딩 하는데 사용이 되고(ASP.NET 의 웹컨트롤과 비슷) FacesServlet 은 JSF 컴포넌트 트리를 이용하여 모든 작업을 수행하게 됩니다.

ps. stackoverflow 의 글을 발번역 하고 나니 많이 어색하네요... 추후 기회를 봐서 재수정을 하던지 해야겠습니다. :-)




참조


'공부 > JSF' 카테고리의 다른 글

JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
JSF 어플리케이션이란 무엇일까요?  (0) 2014.10.01
JSF 에 대하여  (1) 2014.09.19
Posted by #HanaLee
공부/JSF2014. 9. 19. 18:15

이전에 다니던 회사에서 개발한 솔루션에 사용한 UI 프레임워크인 JSF 를 처음 접하고 개발 및 유지보수를 하면서 국내에서 자료를 찾아보기 힘들었고 JSF 의 개념을 이해하는데 어려움을 느껴 혹시나 저처럼 JSF 에 대한 어려움을 느끼실 분들을 위해 제가 아는 선에서 정보들을 공유하고자 합니다.

이글을 시작으로 앞으로 공유하게될 정보들이 JSF 에 대해 많은 사람들이 한번 쯤은 경험해 보는 계기가 되었으면 좋겠습니다.


JSF (JavaServer Faces) 란?

JSF 는 JEE 의 일부로 JEE 표준이며 웹 어플리케이션을 위한 컴포넌트 기반의 UI 프레임워크 입니다.
JSF 의 초기 컨셉은 MS Visual 류의 UI 디자인에 대항하기 위한것과 마치 데스크탑 어플리케이션을 만드는것 처럼 웹 어플리케이션을 만들자는 생각에 만들어지게 되었습니다. Java Swing 으로 데스크탑용 프로그래밍을 할 때 버튼을 배치 하고 그 버튼의 이벤트 리스너를 통해 버튼의 동작을 제어 하는 방법처럼 말이죠. 하지만 몇몇 문제들로 인해 초기 컨셉을 유지하기는 조금 어려워 졌으며 초창기에 존재하던 디자인툴들은 대부분 간단한 UI 를 제외하면 사용하지 않게 된것 같습니다. 아직은 Oracle 의 jDeveloper 나 netbeans 에 디자인 툴이 포함이 되어있긴 하지만 실제 프로젝트를 진행하면서 복잡한 UI 를 구성할때 사용하기에는 큰 어려움이 있는 것은 사실입니다. 요즘은 MS 의 Visual 류도 디자인툴보다는 코드를 통해 UI 디자인 하는것으로 추세가 기울었다는 말을 어디선가 본것 같네요.
디자인과 관련된 초기 컨셉은 지금은 많이 부각되지 않고 있지만, 마치 데스크탑 어플리케이션 처럼 UI 를 만들고 핸들러를 연결하여 이벤트 처리를 하는 부분은 (Java Swing 을 생각하면 되겠네요) 여전히 JSF 의 주요 기술 중에 하나 입니다.

( JDeveloper UI 디자인 )

다만 웹이라는 특성상 데스크탑과는 다르게 각 컴포넌트들의 라이프 사이클이 복잡해지게 되고 초창기에는 AJAX 의 부재로 시대에 뒤떨어지는 프레임워크가 되었죠. 물론 Richfaces 와 Primefaces 를 개발한 분들이 그러한 문제점, 불편함을 보완하여 어느정도는 사용을 할 수 있게 된건 참 다행이긴 하지만요.
이부분은 JSF 2.0 부터 보완이 되었고 2.0 버전 이후부터는 많은 부분이 크게 개선 되어 나왔습니다. 하지만 여전히 조금씩의 문제가 있었기 때문에 많은 개선에도 불구하고 JSF 를 쓰는걸 꺼리는 사람이 많았습니다. 첫 시작을 잘못한 덕분에 JSF 는 별로 인기가 없는 프레임워크 이죠.

그나마 주변에서 쉽게 볼 수 있는것 으로는 WebLogic 의 Web 관리 콘솔과 Glassfish 의 Web 관리 콘솔입니다. 두가지 모두 JSF 를 이용하여 UI 를 구성하였습니다.

현재 JSF 는 Stable 버전이 2.2 이며 2.3 개발이 진행 중입니다.
JEE 에는 스펙(API) 만 포함되어 있으고 jdbc 드라이버 같이 서드파티 구현체가 여럿 존재하며 각각의 구현체들은 조금씩 다른 방법으로 사용이 됩니다.
JSF 의 구현체로는 가장 기본이 되는 Oracle 의 Mojarra 와 Apache 의 Myfaces, jboss 의 Richfaces, Primefaces 들이 있습니다.

<Primefaces UI>

<Richfaces UI>

<Myfaces UI>

모두 오픈소스로 공개 되어 있으며 개발이 활발하게 진행되고 있습니다.
각 구현체의 가장 큰 특징은 UI 의 모양이 각각 다르고 컴포넌트들을 컨트롤 하는 방법이 대동소이 하긴 하지만 조금씩 다른 부분이 존재합니다.
대부분 Java 의 어노테이션을 지원하며, xml 설정도 지원하고 Spring Framework 와 통합도 자연스럽습니다. JSP 와의 통합 및 tag 라이브러리를 그대로 사용할 수 있는것도 장점이라면 장점이지요.
그리고 미리 정의된 컴포넌트들을 JSF tag 를 이용하여 쉽게 작성 할 수도 있고 JSF 의 처음 디자인 컨셉인 MS Visual 류의 직관적인 UI 디자인을 할 수도 있다는것이 장점이 될 수 있습니다.

다만 JSF 의 컴포넌트 기반 특성과 미리 만들어진 컴포넌트를 사용해야 하고 컴포넌트에서 지원하지 않는 경우에는 커스텀 컴포넌트를 만들어 사용해야 하거나 기존 컴포넌트들을 확장하여 사용해야 하는데 이부분이 조금 번거롭거나 JSF 를 제대로 이해하지 못하면 사용하기 어렵고 국내에는 번역된 책이나 문서가 거의 전무하기에 국내 개발자가 접근하기는 많이 어려운 것이 현실입니다.

하지만 한번 익히게되면 나름 편하고 장점도 있는것 같습니다. 프레젠테이션과 컨트롤, 모델 부분의 경계가 확실하고 서버사이드 랜더링을 지원하기 때문에 클라이언트에 부담이 적다는것, 여러 편의기능을 제공하고 이벤트 처리가 직관적이라서 편리하다는것과 JSP 와 Spring Framework 와의 통합이 자연스러운점과 익숙해지면 빠르게 프로토타입을 만들어 볼 수 있다는것 미리 디자인된 UI 컴포넌트들 덕분에 디자인에 너무 신경쓰지 않아도 된다는게 개인적으로 좋은거 같습니다.

국내에서는 사용이 거의 전무 하지만 그래도 필요로 하는 분들이 계실꺼 같아 앞으로 계속 JSF 에 대해 제가 아는 선에서 공유를 하고자 합니다. 조금이나마 도움이 되는 분들이 계시기를...




'공부 > JSF' 카테고리의 다른 글

JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
JSF 어플리케이션이란 무엇일까요?  (0) 2014.10.01
JSF, JSP, Servlet 다른점  (0) 2014.09.22
Posted by #HanaLee
공부/java2014. 9. 6. 20:31

BufferedWriter 클래스에 대하여 간단한 예제를 통해 알아보려고 합니다.
BufferedWriter 클래스는 문자들을 버퍼링하여 문장, 배열, 단일 문자를 효율적으로 문자 출력 스트림(character output stream) 에 기록합니다. BufferedWriter 클래스는 문자 스트림에 기록하기 위해 추상 클래스인 Writer 를 상속하였습니다. 서브 클래스들은 반드시 write(char[] cbuf, int off, int len), flush(), close() 메소드를 구현해야 합니다. 대부분의 서브 클래스들은 더 높은 효율성, 기능의 추가, 혹은 양쪽 모두를 제공하기 위해 일부 메소드들을 오버라이드 (override) 하기도 합니다.

BufferedWriter 클래스는 JDK 1.1 부터 존재했습니다.

BufferedWriter 의 생성자 구조

기본 크기를 가지는 출력 버퍼로 버퍼링 된 문자형 출력 스트림 (character output stream) 객체를 만듭니다.

매개변수로 주어진 크기를 가지는 출력 버퍼로 버퍼링된 문자형 출력 스트림 객체를 만듭니다.

BufferedWriter 의 기본 예제

BufferedWriter 클래스가 어떻게 파일에 문자를 기록하는지 살펴 보겠습니다.

package kr.co.leehana.example.bufferedwriter;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class SimpleBufferedWriterExample1 {

	public static void main(String[] args) {
		String greetings = "Hello!!!";
		String description = "I am written into a file";

		BufferedWriter writer = null;

		try {
			writer = new BufferedWriter(new FileWriter(new File("output.txt")));
			writer.write(greetings);
			writer.newLine();
			writer.write(description);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

BufferedWriter 는 매개변수로 Writer 클래스를 가지고 오고 예제에서는 Writer 추상 클래스를 상속한 OutputStreamWriter 의 서브클래스인 FileWriter 클래스를 사용하였습니다. 중간에 writer.newLine() 메소드를 사용하였는데 이는 플랫폼 (Mac, Linux, Windows) 의 시스템 환경변수에 등록된 line.separator 를 사용하여 호환성을 높였습니다. 여기에서 중요한 것은 마지막에 호출된 close() 메소드 입니다. 항상 기억해야 할것은 파일에 쓰기가 완료되면 close() 메소드를 반드시 호출 해줘야 한다는 것입니다.
생성된 파일을 열어보면 위에서 입력한 두줄의 텍스트가 있는것을 확인 할 수 있을 것입니다.

BufferedWriter 의 또 다른 예제

BufferedWriterflush() 메소드를 사용하는 Logger 클래스를 만들어서 log 파일을 생성하는 예제 입니다.

package kr.co.leehana.example.bufferedwriter;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class Logger {
	private BufferedWriter writer;

	public Logger(String filename) throws IOException {
		this.writer = new BufferedWriter(new FileWriter(new File(filename)));
	}

	public Logger(File logFile) throws IOException {
		this.writer = new BufferedWriter(new FileWriter(logFile));
	}

	public void log(String s) throws IOException {
		String date = new Date().toString();
		this.writer.write(date + " : " + s);
		this.writer.newLine();
		this.writer.flush();
	}

	public void close() throws IOException {
		this.writer.close();
	}
}


위 Logger 클래스를 테스트 하는 예제 코드 입니다.

package kr.co.leehana.example.bufferedwriter;

import java.io.IOException;

public class SimpleBufferedWriterExample2 {

	public static void main(String[] args) {
		Logger logger = null;
		try {
			logger = new Logger("log.txt");
			logger.log("Test 1");
			logger.log("Test 2");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (logger != null) {
				try {
					logger.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

출력된 log 파일을 열어보면 하나의 로그 파일에 두줄의 로그가 기록된것을 확인 할 수 있을 것입니다.

BufferedWriter 클래스에 대한 추가 정보

BufferedWriter 클래스를 다음과 같이 생성함으로써 출력 스트림에 쓸 수도 있습니다.
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

BufferedWriter 클래스는 직접 출력 스트림 (output stream) 에 쓰지 않습니다. 사실 BufferedWriter 클래스는 더 나은 성능을 위해 스트림에 기록되는 버퍼 입니다. 기억해야 할만한것으로는 생성자의 매개변수로 버퍼의 크기를 지정할 수 있다는것과 지정하지 않으면 기본 크기를 가지는 버퍼를 사용한다는 것입니다. close() 메소드가 호출되면 버퍼가 기록되는것이 아니고 스트림에 기록됩니다. 이를 확인 하기 위해서 close() 메소드를 주석처리해서 실행 해보면 파일에 아무것도 기록되지 않은것을 확인 할 수 있습니다.

만약 스트림을 닫지 않고 버퍼를 파일에 계속 쓰고 싶으면 flush() 메소드를 사용하면 됩니다. close() 메소드가 호출된 후 write() 메소드나 flush() 메소드를 호출 하게 되면 IOException 이 발생합니다.

마지막으로 모든 메소드는 IOException 이 발생 할 수 있으니 try catch 문을 이용해야 합니다.




소스코드

출처


'공부 > java' 카테고리의 다른 글

java.lang.System 예제  (0) 2014.09.22
Java BufferedOutputStream 예제  (0) 2014.09.22
Java List 를 배열로 변환 하는 예제  (0) 2014.09.05
Java FileWriter 예제  (0) 2014.09.05
RejectedExecutionException 해결 방법 알아보기  (0) 2014.09.03
Posted by #HanaLee
공부/java2014. 9. 5. 12:46

java 에서 많이 사용하는 java.util.List 객체를 일반 배열로 변환 하는 방법에 대한 예제 입니다.
java.util.List 에는 이를 위해 두가지의 메소드가 존재 합니다.

이 두가지 메소드들은 적절한 순서로 java.util.List 에 담겨 있는 모든 요소를 포함하는 배열을 반환합니다.
두 메소드의 시그네쳐에서 확인 할 수 있듯이 두 메소드의 차이는 첫번째는 런타임에 지정된 (T[]) 배열을 반환하고, 두번째는 Object[] 유형의 배열을 반환 한다는 것입니다.
두가지 모두의 예를 한번 살펴 보겠습니다.

먼저 두개의 예제에서 공통으로 사용할 User 클래스를 만들겠습니다.

User 클래스

package kr.co.leehana.example.listtoarray;

public class User {
	private String name;
	private int age;

	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return this.name;
	}

	public int getAge() {
		return this.age;
	}
}

T[] toArray(T[] a) 예제

package kr.co.leehana.example.listtoarray;

import java.util.ArrayList;
import java.util.List;

public class ListToArrayExampleWithArgument {

	public static void main(String[] args) {
		runExample();
		runExample2();
	}

	private static void runExample() {
		List<String> strList = new ArrayList<String>();
		strList.add("One");
		strList.add("Two");
		strList.add("Three");

		String[] strArray = strList.toArray(new String[strList.size()]);

		for (int i = 0; i < strArray.length; i++) {
			System.out.println("output : " + strArray[i]);
		}
	}

	private static void runExample2() {
		List<User> userList = new ArrayList<User>();
		userList.add(new User("Hana Lee", 37));
		userList.add(new User("Gildong Hong", 41));

		User[] userArray = userList.toArray(new User[userList.size()]);

		for (int i = 0; i < userArray.length; i++) {
			System.out.println("User name : " + userArray[i].getName());
			System.out.println("User age : " + userArray[i].getAge());
		}
	}
}

위의 예제에서는 cast 를 하지 않았다는것을 확인 하세요. 반환되는 형식이 바로 매개변수로 넘긴 형식이 됩니다. 이 방법은 cast 를 줄이고 런타임에 반환되는 배열의 형태를 결정 할 때 사용될 수 있습니다.

Object[] toArray() 예제

package kr.co.leehana.example.listtoarray;

import java.util.ArrayList;
import java.util.List;

public class ListToArrayExampleWithNoneArgument {

	public static void main(String[] args) {
		runExample();
		runExample2();
	}

	private static void runExample() {
		List<String> strList = new ArrayList<String>();
		strList.add("One");
		strList.add("Two");
		strList.add("Three");

		Object[] objArray = strList.toArray();

		for (int i = 0; i < objArray.length; i++) {
			System.out.println("output : " + objArray[i].toString());
		}
	}

	private static void runExample2() {
		List<User> userList = new ArrayList<User>();
		userList.add(new User("Hana Lee", 37));
		userList.add(new User("Gildong Hong", 41));

		Object[] objArray = userList.toArray();

		for (int i = 0; i < objArray.length; i++) {
			User user = (User) objArray[i];
			System.out.println("User name : " + user.getName());
			System.out.println("User age : " + user.getAge());
		}
	}
}

위의 예제는 반환된 Object[] 배열을 String[] 으로 바로 변환 할 수 없기 때문에 Object[] 배열로 부터 요소를 꺼낸뒤 toString 메소드를 호출 해줍니다. 물론 그냥 String 이기 때문에 직접 호출 한다고 해도 큰 문제는 없습니다.

그리고 두번째 User 객체를 이용하여 출력 하는 메소드에서는 출력을 위해 User 객체로 cast 를 해야 한다는것을 확인하세요.




소스 코드

출처


'공부 > java' 카테고리의 다른 글

Java BufferedOutputStream 예제  (0) 2014.09.22
Java BufferedWriter 예제  (0) 2014.09.06
Java FileWriter 예제  (0) 2014.09.05
RejectedExecutionException 해결 방법 알아보기  (0) 2014.09.03
예외  (0) 2014.06.20
Posted by #HanaLee