String 타입의 날짜를 Date 타입으로 변환하기

2008/07/22 01:59

서비 JAVA , , , ,

우리는 java.util.Date 혹은 java.sql.Date 타입의 객체에서 특정한 형식의 문자열로 날짜를 가져오기 위해서
java.text.SimpleDateFormat 클래스를 이용할 수 있다는 것을 알고 있다.

package javacodesnipet;
/**
 * @author 신윤섭
 */
public class SimpleDateFormatTest {
 
 public static void main(String[] args){
  
  // 현재 일시 정보를 갖는 Date 객체를 생성한다.
  java.util.Date currentDate = new java.util.Date();  
  //Date객체로부터 특정한 형식의 문자열로 일시를 만들어내기 위한 포매터를 생성한다.
  java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy년MM월dd일 HH시mm분ss초");
  //포매터를 이용하여 Date객체로부터 문자열을 만들어낸다.
  String dateString = format.format(currentDate);
  //변환된 문자열을 확인한다.  결과 : 2007년07월22일 02시21분42초
  System.out.println(dateString);  
  
 }
}

위의 코드는 흔히 사용하는 코드일 것이다.

그런데 이 SimpleDateFormat 클래스의 parse() 메소드를 이용하면 역으로 문자열 형식의 날짜로부터
Date객체를 생성 해낼 수도 있다.
package javacodesnipet;
/**
 * @author 신윤섭
 */
public class SimpleDateFormatTest {
 
 public static void main(String[] args){
  try {
   // "2007-07-22" 이란 문자열로 2007년 7월 22일의 정보를 갖는 Date객체를 만들어보자
   String textDate = "2007-07-22";

   // 입력할 날짜의 문자열이 yyyy-MM-dd 형식이므로 해당 형식으로 포매터를 생성한다.    java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");

   //SimpleDateFormat.parse()메소드를 통해 Date객체를 생성한다.    //SimpleDateFormat.parse()메소드는 입력한 문자열 형식의 날짜가    //포맷과 다를경우 java.text.ParseException을 발생한다.    java.util.Date date = format.parse(textDate);

   //위에서 만든 date객체가 정말 7월22일인지 확인 해보자.    java.text.SimpleDateFormat format1 = new java.text.SimpleDateFormat("yyyy년MM월dd일 HH시mm분ss초");    String dateString = format1.format(date);    //Date객체의 날자를 확인한다..  결과 : 2007년07월22일 00시00분00초    System.out.println(dateString);   } catch (java.text.ParseException ex) {    ex.printStackTrace();   }    } }

2008/07/22 01:59 2008/07/22 01:59
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 유용한 자료 감사합니다.
    블로그에는 본문을 제외한 링크만을 옮겨둡니다.

  2. Blog Icon
    컴공

    이것때메 고민하던차에 잘보고 갑니다^^

  3. Blog Icon
    멍청돋네 ㅡㅡ

    저렇게 하면 최종 결과물은 String 입니다만?

    뭐가 Date타입입니까?

    SimpleDateFormat을 이용해서 parse하면 Date타입이지만
    다시 format하면 무조건 스트링타입이 됩니다.

    따라서 String -> Date 변환이 아니라
    String -> String(패턴지정) 이 됩니다.

    Date타입에는 따로 패턴을 줄수 없는것으로 알고 있습니다.

  4. Blog Icon
    정창용

    java.util.Date date = format.parse(textDate); <-- 여기까지가 포매터를 이용해서 String -> Date 변환이 이뤄진거고 그 아래 내용은 정말 제대로 변환되었는지 확인을 위한 테스트 코드로 보여집니다.

    다른 사람의 블로그에서 도움을 얻어갔으면 고맙다는 글을 못달지언정 본인의 난독증을 굳이 광고할 필요가 있을까 싶군요. 닉네임부터 똑바로 다는 예절부터 배우십시오.

  5. Blog Icon
    이정대

    공감합니다.

  6. 지나가던 사람이지만.. 댓글적은분 정말 멍청하네요.ㅎㅎ

  7. Blog Icon
    지현
  8. Blog Icon
    보나

    좋은 글 잘보고갑니다. 이것때문에 헤맸었는데 덕분에 해결되었어요 감사합니다♡

  9. 알짜베기로 잘 알려주셨네요~! 잘 보고 갑니다 :)

  10. Blog Icon
    ahm

    도움이 많이 되었습니다.

자바 파일복사 코드와 성능 1. :: Java File Copy Code & Perfomance Issue. part 1

2008/07/13 00:05

서비 JAVA , , , , , ,

자바로 파일을 복사할 수 있는 방법은 크게 3가지 정도가 있다.
InputStream, OutputStream을 이용한 방법, Buffer를 이용한 방법, Channel을 이용한 방법이 그것이다.
물론 Buffer를 이용하면서도 단순히 Stream에 Buffer 필터를 적용할 수도, MappedByteBuffer를 쓸 수도 있고
Channel을 이용하면서도 inputChannel과 outputChannel을 이용하거나 transterTo()를 이용하는 등
다양한 방법을 구사할 수 있다.
여기서는 자바로 구현 할 수 있는 대표적인 파일 복사 코드를 살펴보고 각 코드간의 성능에 대한 이야기도 나눠
보도록 하겠다.

Java입문서등을 통하여 io (Input/Output)부분을 언급하며 나오는 개념이 Stream일 것이다. 스트림의 개념을
설명하고 처음 접하는 코드는 아래와 유사할 것이다. 파일을 인풋스트림으로 읽어들인 후 그 길이만큼 아웃풋
스트림에다 흘려보내는 방식으로 파일을 복사할 수 있다.

FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream = new FileOutputStream(saveFullPath);

int bytesRead = 0;
byte[] buffer = new byte[1024];

while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
}

outputStream.close();
inputStream.close();

* InputStream과 OutputStream을 이용한 기본적인 파일 복사 코드.
위 코드는 기본적인 Stream의 사용법을 잘 보여주고 있지만 성능상에 심각한 문제를 안고 있다.
파일크기(정확하게는 스트림의 길이)만큼 while문을 돌면서 끊임없이 읽고쓰기를 반복하고 있는데
이는 CPU, DISK모두에게 부담을 주는 결과를 초래한다.

이어지는 코드가 아마 가장 널리쓰이고 흔하게 볼수 있는 코드 일 것이다. 위에서 살펴본 Stream간의 데이터
전송이 썩 좋은 성능을 내지 못하기 때문에, 스트림을 버퍼를 장착(wrapping, chainning)하여 입출력 횟수를 줄여
성능 향상을 꾀하고 있다.

FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream = new FileOutputStream(saveFullPath);

BufferedInputStream bin = new BufferedInputStream(inputStream);
BufferedOutputStream bout = new BufferedOutputStream(outputStream);

int bytesRead = 0;
byte[] buffer = new byte[1024];
while ((bytesRead = bin.read(buffer, 0, 1024)) != -1) {
    bout.write(buffer, 0, bytesRead);
}

bout.close();
bin.close();

outputStream.close();
inputStream.close();

* Stream에 Buffer Filter를 연결하여 성능을 향상.
위와같은 방법으로 충분히 만족할만 한가? 그렇다고 할수도있고 아니라고 할수도 있다. 위 두 방식은 스트림으로
데이터를 전송하는데 항상 cpu의 연산을 필요로 한다. 즉 스트림을 처리하는동안 cpu가 계속해서 명령을 처리
해줘야 한다는것이다.(비록 cpu사용율은 얼마 안될지 모르지만.. )

컴퓨터의 입장에서 본다면 IO는 상당히 느린 작업중의 하나이다. 이런 작업을 조금이라도 빨리 처리하기위해
하드웨어 혹은 운영체제 수준에서 많은 기법들을 제공하고 있다.
자바는 버전 1.4에 이르러서 기존 io와는 차별화된 nio(new io) 패키지가 추가되었는데 이 nio를 통하여
운영체제가 제공해 주는 향상된 io기능을 활용할 수 있게 되었다. 그 대표적인 것이 Channel과 Selector일 것이다.
아래와 같은 코드는 JDK 1.4이상부터 사용 가능하며 transferTo() 메소드를 호출하면 내부적으로 OS의 네이티브IO
기능을 활용하여 더욱 효율적인 스트림 전송이 가능하다.
 

FileInputStream inputStream = new FileInputStream(file);         
FileOutputStream outputStream = new FileOutputStream(saveFullPath);

FileChannel fcin =  inputStream.getChannel();
FileChannel fcout = outputStream.getChannel();

long size = fcin.size();
fcin.transferTo(0, size, fcout);

fcout.close();
fcin.close();

outputStream.close();
inputStream.close();

* Channel을 이용한 네이티브OS 기능 사용하기.

이상으로 3가지 대표적인 자바 파일복사 코드를 살펴보았다. 다음 포스트에서는 각 방식의 성능 차이에 대해
알아보도록 하겠다.

자바 파일복사 코드와 성능 2(새 창으로 열기)

2008/07/13 00:05 2008/07/13 00:05
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 안녕하세요 ^^
    글이 내용이 유용해서 좋아서 제가 퍼갔습니다. ^^
    문제가 있으시다면, 언제든지 알려 주세요 ^^

    링크는 다음과 같습니다. ^^
    http://cafe.naver.com/javacircle/31058

  2. Blog Icon

    유익한 내용.. 출처 남기고 퍼가겠습니다 ^^

  3. Blog Icon
    SSH

    잘 썼습니다! 파일채널은 첨 써보는데 잘되네요!!

  4. 좋은 내용 감사합니다.

  5. Blog Icon
    우주인

    좋은 글 감사 합니다. 출처 남기고 퍼가겠습니다^^

  6. Blog Icon
    dennis

    좋은 정보 감사합니다.