2010/07/07 17:37 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

Timer와 TimerTask 클래스를 이용하여 주기적으로 실행되는 프로그램을 개발할 수 있다.
주기적으로 프로세스를 체크하는 프로그램을 만들 경우에 사용된다.
사용법은 무지 간단하다.

아래 소스는 2초에 한번씩 TimeRun을 실행하는 소스이다.

TimerTest.java

import java.util.Calendar;
import java.util.Timer;
public class TimerTest {
 public static void main(String[] args){
  Timer timer = new Timer();
  Calendar date = Calendar.getInstance();
  timer.schedule(new TimeRun(), date.getTime(), 2 * 1000);
 } 
}



주기적으로 실행하려는 작업을 TimeRun에 코딩하면된다.(TimerTask를 상속)

TimeRun.java

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;

public class TimeRun extends TimerTask {
 public void run(){
  Calendar cal = Calendar.getInstance();
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");       
  String timestamp = formatter.format(cal.getTime());

  System.out.println("["+timestamp+"] TimeRun Test");
 }
}



결과값을 보면은 2초에 한번씩 실행됨을 알 수 있다.
[2010-07-07 17:29:55,593] TimeRun Test
[2010-07-07 17:29:57,593] TimeRun Test
[2010-07-07 17:29:59,593] TimeRun Test
[2010-07-07 17:30:01,593] TimeRun Test
[2010-07-07 17:30:03,593] TimeRun Test
[2010-07-07 17:30:05,593] TimeRun Test
[2010-07-07 17:30:07,593] TimeRun Test
[2010-07-07 17:30:09,593] TimeRun Test
[2010-07-07 17:30:11,593] TimeRun Test
[2010-07-07 17:30:13,593] TimeRun Test
[2010-07-07 17:30:15,593] TimeRun Test




저작자 표시

'CodeIN > Java' 카테고리의 다른 글

[java] Timer  (0) 2010/07/07
[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
posted by 조금까칠한남자
2010/03/16 11:23 Gossip/Day by Day
크리에이티브 커먼즈 라이선스
Creative Commons License

"난 정말 JAVA를 공부한 적이 없다구요" - 저자 윤성우
http://book.naver.com/bookdb/book_detail.nhn?bid=6056781



프로젝트도 끝나고 다음 프로젝트까지 어느 정도 여유로운 시간이 생겨서 프로젝트 기간에 부족했던 부분들을 다시 공부하려고
"난 정말 JAVA를 공부한 적이 없다구요" 라는 JAVA서적을 읽게되었습니다.
총 페이지 857PAGE정도의 분량인데 거진 다 읽어 가고 있습니다.

이 책을 읽어 가는 동안에 느낀 점은

"난 정말 JAVA를 공부한 적이 없다구요" 라는 제목 보다는 "난 정말 JAVA를 제대로 공부한 적이 없다구요" 이 더 맞지 않을까 라는 생각이 들더군요.

이 책을 읽으면서... 난 정말 JAVA를 제대로 공부한 적이 없었구나... 라는 생각이 들었습니다.


JAVA를 제대로 공부하고 싶다면 초급 개발자 뿐만 아니라 중급 개발자 분들도 꼭 읽어봤으면 좋을 것 같습니다.
책의 전반적인 내용은 JAVA에 대한 기본적인 내용을 다룬 기본서입니다.
하지만 문법만 다룬 것이 아닙니다. 이 책에는 Why?How? 도 다룹니다.(밑줄 쫙~)

제가 JAVA 기본서를 다시 보려고 했던 이유는 이번 프로젝트를 진행하면서 뭔가가 턱턱 막히는 기분이 들었습니다.
부끄러운 이야기 이지만 기본적인 부분에서 많이 막혔습니다. (문법 이런건 아닙니다 ^___________^)
경험이 부족해서 그렇다고는 생각하지 않습니다. 경험이 많고 적음을 떠나서 기본이 부족하다는 생각을 하게 되었습니다.
그 부족한 부분을 채워주었던 것이 Why와 How였습니다.

즉, 이 책에서는 JAVA에 대한 기본적인 내용도 다루지만 JAVA에 대한 전체적인 "이해"를 도와줍니다.

고급 개발자가 되기 위해서는 기본이 탄탄해야한다고 이야기를 많이 들었을 것입니다.
초급 개발자가 중급 개발자가 개발한 소스를 참고하여 개발을 하는데 "Why"에 대한 이해 없이는 중급 개발자가 될 수 없습니다.
그 "Why"에 대한 이해는 기본에서 부터 시작된다고 생각합니다.
저도 그 "Why"를 이해하려고 노력하고 있습니다.

- "난 정말 JAVA를 공부한 적이 없다구요"


책의 초반부는 JAVA의 기본적인 내용은
변수, 자료형, 형변환, 연산자, 실행 흐름 컨트롤등등 을 다루고 있습니다.
JAVA 를 처음 접하시는 분들은 반드시 읽어야 할 부분입니다.
어려운 내용은 아니지만 모르면 아무것도 할 수 없는 내용들이죠.



책 초반부는 거의 속독으로 읽어내려갔습니다.
책의 중반부 부터는 제가 개인적으로 중요하다고 생각하는 내용들은 정독하였습니다.
중 요하기도 하지만 다시 제대로 학습 하고 싶었습니다.

Chapter 08. 클래스 패스와 패키지
Chapter 09. 접근제어 지시자와 정보은닉 그리고 캡슐화
Chapter 14, 15, 16 클래스의 상속
Chapter 23. Thread와 동기화
Chapter 24. 파일과 I/O 스트림

다른 Chapter들이 중요하지 않다라는 것은 아닙니다.
위에서 열거한 것들을 제대로 이해하기 위해서 반드시 나머지 부분들도 읽어봐야합니다.

Chapter 08.  클래스 패스와 패키지

- Chapter 제목과 같이 클래스 패스와 패키지에 대한 설명입니다.
java classpath를 환경 변수에 설정하는 이유는 다들 아실 것입니다.
누군가 Why? 해야하나요?? 라고 물으신다면 다들 대답하실 수 있으실 것이라고 생각합니다.
하 지만 java.exe가 어떻게(How) class들을 찾는지 물어본다면 대답하실 수 있으신가요?
그에 대한 해답은 이 책에 있습니다. :")
그것이 바로 제가 말한 HOW입니다.

지금 이 순간 "이게 중요한건가?? 난 이런거 모르고도 다 개발했는데.." 라고 생각하셨다면
제가 더 이상 아무 말씀 안드리겠습니다. :") 이야기하고 싶지 않다... 라고 하는게 아닙니다.
나중에 다시 이 책을 뒤져봐야할 일이 분명히 생기기 때문입니다. :")
그럼 그 때 보셔도 됩니다.

이 번에는 패키지에 대하여 이야기 하겠습니다.
저는 이책을 읽기 전까지 패키지가 단순히 클래스의 중복을 피하기 위해서라든가 기능별로 디렉토리를 나누는 개념으로만 생각을 하였습니다.
물론 틀린 말은 아닙니다만 더 중요한 사실이 있더군요.
클래스 패스와 패키지의 관계를 아시면 "아~ 이래서 패키지가 필요한거구나~" 라고 깨달으실 수 있습니다. :")

궁금하시 죠?? ㅎㅎ
이 책이 이런식으로 구성이 되어 있습니다.

 

 

하나의 주제에 대한 설명을 하기 위해서 어떤 상황 설정을 합니다.
그리고 그 상황에서 문제가 발생되도록 합니다. 그리고 이 문제를 해결하는 방법을 알려줍니다.
이 문제를 해결하면서 자연스럽게 클래스 패스와 패키지를 이해 시킵니다.
책을 읽는 사람의 흥미를 유발시키면서 지루하지 않게 그리고 쉽게 설명을 해주십니다.
다음 상황을 궁금하게 만들면서 집중력 또한 높아지게 만들죠.


 

Chapter 09. 접근제어 지시자와 정보은닉 그리고 캡슐화

책을 읽어보신 분들은 아시겠지만, 생활에서 경험해봤던 일들을 예제로 이야기하시면서 이해하기 쉽게 설명해주십니다.
과일장수와 구매자를 이용해서 정보은닉의 필요성에 대하여 설명을 해주십니다.
정보은닉이란 무엇이다!! 라고 이야기하기 보다는 정보은닉의 필요성(이해)을 먼저 설명해주는거죠.

캡슐화를 설명해주실 때도 마찬가지 입니다. 다들 아시는 "콘택600"을 예로 들면서 캡슐화에 대한 설명을 하십니다.
개인적인 생각으로는 캡슐화를 가장 정확하고 쉽게 설명해 주셨다고 생각합니다.
그 리고 예제 또한 가장 적절한 예제가 아닐까 생각합니다.


콘택 600의 기능(클래스의 기능)은 "재채기, 콧물, 코막힘"의 완화이다.

그런데 이런 콘택600이 재채기용(클래스), 콧물용(클래스), 코막힘용(클래스) 캡슐로 나뉘어져 있다면???
우리는 재채기용, 콧물용, 코막힘용 캡슐을 따로 먹어야 겠죠.... (이하 생략)


예 제 소스를 보시면 감탄사가 나올 정도 입니다. :")
제가 이전에 알고 있던 캡슐화의 개념을 흔들어 놓더군요.....

제대로 java공부를 하지 않았던 것이죠... ㅠㅠ
이 제라도 이해를 하게 되어서 다행입니다.


Chapter 14, 15, 16 클래스의 상속

다른 Chapter들도 마찬가지이지만 클래스의 상속 또한 어떤 상황을 이야기하고 풀어나가는 과정에서 클래스의 상속에 대한 이해를 시킵니다.
그러면서 궁금해 볼만한 질문을 합니다.


"static 변수도 상속이 되나요?"
"생성자도 상속이 되나요?"

개인적으로 재미난 질문이라고 생각합니다.
혹시 이글을 읽고 계신 분들 중에 위 질문에 막힘 없이 대답하실 분이 몇분 계시는지 궁금합니다. :")
저는 당연히 많으실 것이라 생각하지만, 저는 아마 이 책을 읽기 전까지는 순간 고민 좀 했을 것 같습니다. 하하;;



Chapter 23. Thread와 동기화

Thread 에 대한 사용법과 동작 원리 그리고 동기화에 대하여 설명합니다.
이런 기본적인 설명은 다른 책들에도 많이 있지만, 이 책에서는 개발자들에게 떡밥을 던져줍니다.
이 떡밥은 개발자들이 매우 좋아하는 떡밥이지요(?) ㅎㅎ

 

 

떡밥이라는 표현이 이상하지만, 그래도 누구나 한번쯤 생각해볼만한 질문이 아닌가 싶습니다.
그냥 책에서 스레드를 생성하려면 start메소드를 이용하면 된다.... 라고 하였기 때문에 우리는 그냥 start()를 사용합니다. 남들이 다 그렇게 사용하니까.. 나도 그냥..


그런데 누가 Why? 라고 물어 본다면.... ☞ ☜


 

원래 다 그래!! Alleh~


 

하실건가요??

 

다 뒤집으세요~



휴~ "난 정말 JAVA를 공부한 적이 없다구요"를 드디어 다 읽었습니다.
위에서 Chapter별로 몇개 정리를 했습니다.
모든 내용을 이 포스트에 담을 수 없지만, 책을 읽으면서 재미났던 부분, 감탄했던 부분내용 몇개만 설명을 드렸는데요,
오랜만에 처음부터 끝까지 읽은책이 생겼습니다.
그 만큼 지루하지 않았습니다. 그리고 많이 배웠습니다.

제 목과 다르게 이것은 JAVA를 완전 모르는 사람들만 읽어야 하는 책이라고 생각하지 않습니다.
JAVA를 "제대로" 공부한 적이 없었다면, JAVA를 아직도 "제대로" 이해하지 못한 사람이라면 읽어 보면 꼭 도움이 될 것이라고 생각합니다.
아마 "난 정말 JAVA를 공부한 적이 없다구요"의 Second 개정판은 "난 정말 JAVA를 제대로 공부한 적이 없다구요"가 되지 않을까 싶습니다.

JAVA를 "제대로" 공부하셨으면 합니다. 지대루~



posted by 조금까칠한남자
2010/03/15 10:19 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

OCX는 뭐다냐~ ㅎㅎ

 

Terms :

OCX[오씨엑스]란 하나의 객체 연결 및 포함(OLE) 맞춤형 컨트롤로, 마이크로소프트 윈도우에서 수행되는 응용프로 그램에서 사용되기 위해 만들어질 수 있는 특수목적 프로그램이다. OCX는 윈도우 크기 조정이나 스크롤바의 움직임 등을 처리하는 기능을 제공한다. 보통 윈도우95 이상의 운영체계를 사용하는 경우, Windows 디렉토리에 OCX라는 확장자를 가진 파일들이 많이 있다.

OLE는 문자, 그림, 소리, 동영상 등 여러가지 종류의 정보 양식을 가지고 있는 복합 문서를 지원하기 위해 설계되었다. 윈도우 데스크탑, 즉 바탕화면은 복합 문서의 대표적인 예이며, 마이크로소프트는 이를 구축하기 위해 OLE를 사용하였다. OLE와 COM(OLE를 계승하는 더욱 일반적인 개념)은 임의의 언어로 작성되어 시스템 내의 어떠한 애플리케이션에서라도 동적으로 사용될 수 있는 플러그 앤 플레이 프로그램 개발을 지원한다. 이러한 프로그램이 컴 포넌트이고, 이들이 수행되는 애플리케이션을 컨테이너라 한다. 이런 컴포넌트 기반의 애플리케이션 개발을 통해 개발 기간 단축과 프로그램 성능과 품질을 향상시킬 수 있다. 파워빌더, MS Access 같은 윈도우95와 NT 애플리케이션 개발 프로그램은 OCX의 장점을 취하고 있다.

마이크로소프트는 이제 OCX를 ActiveX control이라 부른다. OCX나 ActiveX control은 실제로 DLL 형태로 구현된다 (DLL은 수많은 애플리케이션에서 사용될 서브 프로그램으로 생각할 수 있다. 각각의 애플리케이션 프로그램은 DLL 또는 OCX/ActiveX control 객체에 대해 컨테이너가 된다). 비주얼베이직과 C++은 OCX와 ActiveX control을 만들기 위해 많이 사용된다.

내용 출처 : http://www.terms.co.kr/OCX.htm


OCX란 컴포넌트 라이브러리 입니다. ActiveX Control의 형태이지요. 이것이 발달한 형태가 COM이라는 것이 있습니다. 이것은 DLL또는 EXE형태로 생성이 됩니다. VB나 VC++에서 컴포넌트추가하기 작업을 보면 이런한 형태들의 라이 브러리들이 등록된 것을 볼수있습니다. 그러나 일반 DLL들은 여기에서 볼수가 없지요. 큰차이점은 여기에 있다고 봅니다. OCX나 COM은 레이스트리에 등록되어 이것을 필요로 하는 프로젝트에서 그냥 추가해서 사용할수가 있습니다. Local뿐만아니라 원격으로 사용도 가능하지요. (이것이 OCX도 되는지모름..)
그러나 일반 DLL은 자신에 시스템에 존재해야만 하고 필요할때는 프로그램내에서 위치지정도 해줘야 합니다. 그리고 Function구조로 되어 있어서 특별난 구현 없이는 DLL에서 선언된 함수만을 단순히 로딩해서 사용하는 형태이지요. OCX는 DLL처럼 단순 함수구조도 될수 있지만 강력한 컨트롤을 생성만들어 낼수도 있습니다. 이렇게 만들어낸 컴포넌트는 일반 프로그램뿐만아니라 웹에서도 같은 방식으로 불러다 사용할수 있는 장점이 있습니다. 이 밖에도 많은 호환성을 자랑합니다. OCX를 좀더 발전시킨 COM은 현재 윈도우의 지지 기반이기도 합니다.
익스플러러의 실행화일을 확인해 보시면 그용량이 상당히 작다는 것을 아실수 있을겁니다. 이유는 내부의 모듈 컴포넌트들이 COM형태로 구현되어 있고 이것을 불러다 사용하는 구조이기 때문에 익스플러러 자체는 껍데기에 불과하다고 봅니다.

내용출처 :  http://kr.ks.yahoo.com/service/ques_reply/ques_view.html?dnum=JAIAB&qnum=126822&start=150



http://danadler.com/jacob/

검색을 하다보니 jacob에 대한 언급이 많이 있더군요.

 

What is JACOB?

JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls into the COM and Win32 libraries. The JACOB project started in 1999 and is being actively used by thousands of developers worldwide. As an open-source project, it has benefitted from the combined experience of these users, many of whom have made modifications to the code and submitted them back for inclusion in the project.

The JACOB project has moved to Sourceforge.net. Verion 1.14.3 is now available at Sourceforge.

 

 

private static ActiveXComponent myComponent;
private static Dispatch myObject;

MyComponent = new ActiveXComponent("clsid:XXXXXXXX");
MyObject = MyComponent.getObject();

//For setting and requesting properties
Dispatch.put( myObject, "Property", new Variant( new Integer (1024)));
//Now I want to check the set parameter
Variant vResultmine = Dispatch.call( myObject, "Property");
System.out.println("Property "+vResultmine.toString());

//This line makes "IOvar" to be a read-write String variable (the OCX will be able to put data on it)
Variant IOvar = new Variant(new String(""), true); //false will is used by default, in this case variables can not be written

//Next we invoke the method. In this case the method needs 2 String parameters and puts the result on a third variable (IOvariable)
Variant vResult = Dispatch.call(myObject, "Method",
new Variant((String)"first_parameter"),
new Variant(("second_parameter")),
IOvar);

//Now I print the obtained value
TheIOvar=IOvar.toString();
System.out.println("TheIOvar "+TheIOvar);



참고사이트 :

http://forums.sun.com/thread.jspa?threadID=5331361

http://www.nevaobject.com/_docs/_coroutine/coroutine.htm



또 다른 소스..


System.runFinalizersOnExit(true);

ActiveXComponent xl = new ActiveXComponent("Excel.Application");
System.out.println("version="+xl.getProperty("Version"));
Object xlo = xl.getObject();
System.out.println("version="+Dispatch.get(xlo, "Version"));

Dispatch.put(xlo, "Visible", new Variant(true));

Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.call(workbooks, "Open", "test.xls").toDispatch();
Dispatch sheet = Dispatch.get(workbook,"ActiveSheet").toDispatch();

Dispatch cell = Dispatch.invoke(sheet,"Range",Dispatch.Get,new Object[] {"A1:D1000"},
new int[1]).toDispatch();
SafeArray sa = Dispatch.get(cell,"Value").toSafeArray();
System.out.println("sa: dim="+sa.getNumDim());
System.out.println("sa: start row="+sa.getLBound(1));
System.out.println("sa: start col="+sa.getLBound(2));
System.out.println("sa: end row="+sa.getUBound(1));
System.out.println("sa: end col="+sa.getUBound(2));
for(int i=1; i < 1000; i++)
{
    for (int j = 1 ; j < 4 ; j++ ) {
        System.out.println(i+" "+j+" " +sa.getString(i,j));
    }
}
Dispatch a1 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
        new Object[] {"A1"},
        new int[1]).toDispatch();
Dispatch.put(a1, "Value", "123.456");
Dispatch a2 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
        new Object[] {"A2"},
        new int[1]).toDispatch();
Dispatch.put(a2, "Formula", "=A1*2");
Dispatch.call(workbook, "Close");
xl.invoke("Quit", new Variant[] {});
xl.release();


내용출처 : http://blog.naver.com/iamteri?Redirect=Log&logNo=140018821191


 

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class Word{
    String strDir = "c:jacob_1.9";
    String strInputDoc = strDir + "file_in.doc";
    String strOutputDoc = strDir + "file_out.doc";
    String strOldText ="[label:import:1]";
    String strNewText ="I am some horribly long sentence, so long that [insert anything]";
   
    boolean isVisible = true;
    boolean isSaveOnExit = true;
   
    public Word(){
        ActiveXComponent oWord = new ActiveXComponent("Word.Application");
        oWord.setProperty("Visible", new Variant(isVisible));
        Dispatch oDocuments = oWord.getProperty("Documnets").toDispatch();
        Dispatch oDocument = Dispatch.call(oDocuments, "Open", strInputDoc).toDispatch();
        Dispatch oSelection = oWord.getProperty("Selection").toDispatch();
       
        Dispatch oFind = oWord.call(oSelection, "Find").toDispatch();
        Dispatch.put(oFind, "Text", strOldText);
        Dispatch.call(oFind, "Execute");
        Dispatch.put(oSelection, "Text", strNewText);
        Dispatch.call(oSelection, "MoveDown");
        Dispatch.put(oSelection, "Text", "nSo we got the next line including BR.n");
       
        Dispatch oFont = Dispatch.get(oSelection, "Font").toDispatch();
        Dispatch.put(oFont, "Bold", "1");
        Dispatch.put(oFont,"Italic", "1");
        Dispatch.put(oFont, "Underline", "0");
       
        Dispatch oAlign = Dispatch.get(oSelection, "ParagraphFormat").toDispatch();
        Dispatch.put(oAlign, "Alignment", "3");
       
        Dispatch oWordBasic = (Dispatch) Dispatch.call(oWord, "WordBasic").getDispatch();
        Dispatch.call(oWordBasic, "FileSaveAs", strOutputDoc);
        Dispatch.call(oDocument, "Close", new Variant(isSaveOnExit));
        oWord.invoke("Quit", new Variant[0]);
    }
   
    public static void main(String[] args){
        Word word = new Word();
    }
}


내용 출처 : http://blog.naver.com/seigi_h?Redirect=Log&logNo=140035596122


이 정도면 응용해서 할 수 있을듯합니다. :")

그래도 일단 해봐야죠??

 

 

기타 소스 :  이건 뭔지 잘..


import com.jniwrapper.win32.com.types.CLSID;
import com.jniwrapper.win32.automation.OleContainer;
import com.jniwrapper.win32.automation.Automation;
import com.jniwrapper.win32.automation.types.Variant;
import com.jniwrapper.win32.ole.types.OleVerbs;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
 
public class Test extends JFrame
{
    private static final long serialVersionUID = 1L;
 
    public static final CLSID CLASS_ID = CLSID.create("{135CB56E-FDB4-43B6-A386-CD0C15295C07}");
    Container contentPane = getContentPane();
    final OleContainer oleContainer = new OleContainer();
 
    public Test()
    {
        super("OcxPanel");
    }
 
    public void init() throws InvocationTargetException, InterruptedException
    {
 
        JPanel activeXPanel = new JPanel();
        oleContainer.createObject(CLASS_ID);
        oleContainer.setSize(600, 400);
        // Vadim.Ridosh Here I wrapped doOpen call to invoke it in the same OleMessageLoop with oleContainer
        oleContainer.getOleMessageLoop().doInvokeAndWait(new Runnable()
        {
            public void run()
            {
                doOpen();
            }
        });
        activeXPanel.add(oleContainer);
        contentPane.add(activeXPanel);
 
        addWindowListener(new WindowAdapter()
        {
            // @Override
            public void windowOpened(WindowEvent e)
            {
                oleContainer.doVerb(OleVerbs.INPLACEACTIVATE);
            }
        });
    }
 
    private void doOpen()
    {
        String m_strAppID = "KJ01";
        String m_strSiteNO = "999999";
        String m_strOperID = "3333";
        String m_strDateTime = "20090612";
        String m_strIP = "22.5.232.93";
        String m_strPort = "8026";
        String Pri = "7777";
        String ScanAttri = "0";
        String DocID = "1158447027777KJ01999999090713691";
 
        Variant[] variants = new Variant[]{
                new Variant(m_strAppID),
                new Variant(m_strSiteNO),
                new Variant(m_strOperID),
                new Variant(m_strDateTime),
                new Variant(m_strIP),
                new Variant(m_strPort),
                new Variant(Pri),
                new Variant(ScanAttri),
                new Variant(DocID)
        };
        try
        {
            // Vadim.Ridosh: coInitialize is not required here. Now doOpen executed in OleMessageLoop,
            // OleMessageLoop initialize OLE automatically
            // ComFunctions.coInitialize();
 
            // Vadim.Ridosh: Object you want to call was already created in oleContainer.createObject(CLASS_ID)
            // So, we don't need to create it second time. Let's use already created object instead:
            // IUnknownImpl dispatchable = new IUnknownImpl(CLASS_ID, ClsCtx.INPROC_SERVER);   //get an error
            Automation automation = new Automation(oleContainer.getOleObject());
            automation.invoke("InitScanWnd", variants);
 
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) throws InvocationTargetException, InterruptedException
    {
        Test sample = new Test();
        sample.init();
        sample.setVisible(true);
    }
}
 



 

'CodeIN > Java' 카테고리의 다른 글

[java] Timer  (0) 2010/07/07
[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
posted by 조금까칠한남자
TAG jacob, Java, JNI, ocx
2010/02/01 23:53 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License
이번에는 업무에 필요한 간단한 유틸을 만들어봤습니다.
유틸의 기능은 제가 음성 파일로 만들고 싶은 내용을 입력하면 음성 파일로 만들어 주는 것 입니다.
간단히 설명하면 "안녕하세요. 김태정입니다."라고 text를 입력하고 버튼을 누르면 어떤 wav파일이 생성되는데, 이 wav 파일을 play하면은 "안녕하세요. 김태정입니다."라는 소리가 나옵니다.
(참고, 반드시 TTS 서버(Text to Speech 텍스트 음성 변환) 가 있어야 합니다.)


아래 이미지는 실행시 모습입니다.
Version 1기능 - "안녕하세요. 김태정입니다." 를 입력하고 Create.
Version 2기능 - "Open Excel File" 버튼을 누르고 Excel파일을 선택. 그리고 Create 버튼 클릭.


오늘 release된 버전은 second버전 입니다. release라고 하니 또 거창하네요 ㅎㅎ
저한테만 release된 것입니다. ㅎㅎ

version 1의 기능은 음성파일로 만들어 주고 싶은 text를 입력하면 이것을 wav 파일로 만들어 주는 것입니다. "Create" 버튼을 누르면 TTS서버에게 요청하면 wav 파일이 생성되는 것입니다.
결론 적으로 TTS 서버가 꼭 있어야 한다는 ^__________^

version 2의 기능은 version 1의 기능을 보완하였습니다.
수 십 또는 수 백개의 text들을 일일이 치면서 만들기 번거로우므로 Excel 파일에 wav 파일명과 text를 아래 이미지와 같이 써 넣으면 이 Excel 파일을 읽어서 wav파일들을 생성해주는 기능을 추가하였습니다.



프로그램을 실행하면 c0001.wav 파일이 생성되고
이 c0001.wav파일을 play하면은 "안녕하세요. 이것은 테스트 입니다. 123" 하고 소리가 나오게 되는거져. 이런식으로 c0018.wav까지 생성합니다.

아래는 실행시 실제적으로 생성된 파일들입니다.



그러기 위해서는 Java에서 Excel 파일을 읽는 기능을 사용해야합니다.
(XLS파일을 읽는 법과 XLSX파일을 읽는 법이 다릅니다. )
또 공부를 ㅎㅎ

참고 사이트 : 검색 사이트에서 "POI 를 이용한 Excel 문서 처리 맛보기 Quick Guide" 로 검색

아래 링크를 클릭해서 최신 버전의 Apache POI를 다운 받으세요. 현재 lastest stable release version은 3.6입니다. 
http://poi.apache.org/download.html

필요한 jar파일
- poi-3.6-20091214.jar
- ooxml-lib 하위 디렉토리에 있는 jar파일들

아래는 소스는 확장자가 .xls 인 파일을 읽는 소스입니다.
MS.2007이상 버전의 Excel파일(.xlsx)은 읽지 못합니다.
private void readExcelXLS(String filePath){
        FileInputStream fis = null;
        POIFSFileSystem fs = null;
        HSSFWorkbook wb = null;       
        int sheets = 0;
        try {
            // Excel 파일 읽어 오기
            fis = new FileInputStream(filePath);
            fs = new POIFSFileSystem(fis);
            wb = new HSSFWorkbook(fs);
            // 워크북 오브젝트의 취득
            sheets = wb.getNumberOfSheets();
           
            for(int sheetIndex=0;sheetIndex < sheets;sheetIndex++){
                //워크북에서 sheetIndex번째 sheet를 가지고 옵니다.
                HSSFSheet sheet = wb.getSheetAt(sheetIendx);
                int firstRow = sheet.getFirstRowNum();
                int lastRow = sheet.getLastRowNum();
               
                // 행 별로 데이터를 취득
                for(int rowIndex=firstRow ; rowIndex <= lastRow ; rowIndex++){
                    //sheet로부터 row를 하나씩 얻어옴
                    Row row = sheet.getRow(rowIndex);

                    //행에 데이터가 없는 경우
                    if(row==null){
                        continue;
                    }
                   
                    //저는 각 row에서 첫번째(0)와 두번째(1) cell 값만 필요해서 아래와 같이
                    //사용하였습니다. 각자 맞게 응용하여 사용하세요.
                    Cell waveFile = row.getCell(0);
                    Cell contents = row.getCell(1);
                    
                    //각 cell로부터 string 값을 가지고 온다.
                    String wave = waveFile.getRichStringCellValue().getString();;
                    String data = contents.getRichStringCellValue().getString();

                    int ret = 0;
                    ret = tt.request(data, null, wave, null);
                    //저는 Swing을 이용해서 결과 값을 jTextAreaResult에 append.
                    if(ret != 1){
                        jTextAreaResult.append("[TTS메세지] "+tt.getResultMsg()+"\n");
                    }else{
                       //jTextAreaResult.append("[파일경로] "+tt.getWavePath()+"\n");
                       jTextAreaResult.append("["+wave +"]["+data+"]\n");
                    }
                    Thread.sleep(1000);
                }
            }           
         } catch (InterruptedException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                fis.close();
            } catch (IOException ex) {
                Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
            return;
    }


이번에는 MS.2007이상 버전의 Excel파일(.xlsx)파일을 읽는 소스입니다.
아래 소스는 설명하지 않겠습니다. xls를 읽는 소스와 비슷합니다.
private void readExcelXLSX(String filePath){
        File file = new File(filePath);      
        FileInputStream fis = null;       
        XSSFWorkbook xb = null;
        XSSFExcelExtractor extractor = null;       
        int sheets = 0;
        try {
           
            // Excel 파일 읽어 오기
            fis = new FileInputStream(file);           
            xb = new XSSFWorkbook(filePath);           
           
            extractor = new XSSFExcelExtractor(xb);
            extractor.setFormulasNotResults(true);
            extractor.setIncludeSheetNames(false);

            //System.out.println(" - : " + extractor.getText());

            // Getting cell contents
                for( int i=0 ; i<xb.getNumberOfSheets(); i++) {
                    XSSFSheet x = xb.getSheetAt(i);
                    int firstRow = x.getFirstRowNum();
                    int lastRow = x.getLastRowNum();
                    for(int r=firstRow ; r <= lastRow; r++){
                        Row row = x.getRow(r);
                        Cell waveFile = row.getCell(0);
                        Cell contents = row.getCell(1);
                        String wave = waveFile.getRichStringCellValue().getString();
                        String data = contents.getRichStringCellValue().getString();
                        int ret = 0;
                        ret = tt.request(data, null, wave, null);
                        if(ret != 1){
                            jTextAreaResult.append("[TTS메세지] "+tt.getResultMsg()+"\n");
                        }else{
                           //jTextAreaResult.append("[파일경로] "+tt.getWavePath()+"\n");
                           jTextAreaResult.append("["+wave +"]["+data+"]\n");
                        }
                        Thread.sleep(1000);    
                    }
                }
             } catch (InterruptedException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
                Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    fis.close();                   
                } catch (IOException ex) {
                    Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            return;
        }



개발하면서 아쉬웠던 점은 시간이 없어서 필요한 기능만 구현했다는 점, 그리하여 딱 위 형태의 엑셀만 읽어서 wav파일을 생성할 수 있다는 것입니다.
나중에는 column값 2개를 받아서 설정된 column만 읽어서 wav파일을 생성하게끔 하고 싶군요 :")



'CodeIN > Java' 카테고리의 다른 글

[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
posted by 조금까칠한남자
TAG Excel, Java, xls, xlsx
2010/01/19 19:15 Voice Portal/Network
크리에이티브 커먼즈 라이선스
Creative Commons License

 

Exception 발생

java.net.SocketException: Software caused connection abort: socket write error

 

이런 Exception이 발생하는 이유는 몇가지가 있는것 같습니다.

아직 문제의 원인은 밝혀지지 않았지만(지금 짐작가는 부분이 있는데 내일 모레 테스트 해보고 올리겠습니다.), 아래 원인이 가장 유력합니다.

다른 쪽에서 소켓을 끊어버린 경우라고 보시면 될듯 합니다.

This error message generally means that the end that reported the error tried to write data, but the other end has already closed the connection.

 

 그 외에 Software caused connection abort 관련 Exception이 발생하는 경우라고 합니다.

http://forums.sun.com/thread.jspa?threadID=748677

 

WSAECONNABORTED (10053) Software caused connection abort

 

A connection abort was caused internal to your host machine. The software caused a connection abort because there is no space on the socket's queue and the socket cannot receive further connections.

 

WinSock description: The error can occur when the local network system aborts a connection. This would occur if WinSock aborts an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).

 

TCP/IP scenario: A connection will timeout if the local system doesn't receive an (ACK)nowledgement for data sent. It would also timeout if a (FIN)ish TCP packet is not ACK'd (and even if the FIN is ACK'd, it will eventually timeout if a FIN is not returned).

It seems to happen more with WindowsXP and it seems also to be possibly related to Windows firewall settings. In any case the salient point is that the abort has originated inside the local machine.

It's a stupidly worded message.

 

 

Error Message:
Software caused connection abort.

 

Explanation:

This error can occur when the local network system aborts a connection, such as when Winsock closes an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).

 

User Action:

Check the following:

1. Ping the remote host you were connected to. If it doesn't respond, it might be offline or there might be a network problem along the way. If it does respond, this problem might have been a transient one (so you can reconnect now), or the server application you were connected to might have terminated (so you might not be able to connect again).

2. Ping a local host to verify that your local network is still functioning (if on a serial connection, see next step).

3. Ping your local router address. If you are on a serial connection, your local router is the IP address of the host you initially logged on to using SLIP or PPP. 4. Ping a host on the same subnet as the host you were connected to (if you know of one). This will verify that the destination network is functioning.

5. Type tracert at the command prompt to determine the path to the host you were connected to. This won't reveal too much unless you know the router addresses at the remote end, but it might help to identify if the problem is somewhere along the way.

 

 어떤 사람들은 socket timeout시간을 늘렸더니 해결되었다는 사람들도 있습니다.

흠 저도 늘려서 해봤는데 이 문제는 아닌거 같더군요.

Software caused connection abort
Error:
An established connection was aborted by the software in your host machine. Software caused connection abort.


This error can occur when the local network system aborts a connection, such as when WinSock closes an established connection after data retransmission fails (receiver never acknowledges data sent on a data stream socket), possibly due to a data transmission timeout or protocol error.

 

You may try to set the Connection Timeout higher (Default: 60s). If the problem persists change the Data Connection Mode from "Port Mode (PORT)" to "Passive Mode (PASV)" or vice versa. For further information on how to switch between Active and Passive mode please see the following Knowledge


 

 

 

10.11 "Network error: Software caused connection abort"

 

In modern versions of PuTTY, you should not see this error.

 

Windows's documentation about this error condition is not very good, but as far as we can tell, this error occurs when PuTTY is listening on a port, another program makes a connection to that port, but closes the connection so fast that PuTTY has no time to answer it.

 

 

Network error: Software caused connection abort

 

If you are getting the error in the middle of session, it means that Windows network code killed an established connection for some reason. For example, it might happen if you pull the network cable out of the back of an Ethernet-connected computer, a DHCP IP address renewal fails or changes the computer’s IP address, or if Windows has any other similar reason to believe the entire network has become unreachable.


Windows also generates this error if it has given up on the machine at the other end of the connection ever responding to it.
If the network between your client and server goes down and your client then tries to send some data, Windows will make several attempts to send the data and will then give up and kill the connection. In particular, this can occur even if you didn’t do anything, if you are using SSH-2 and WinSCP attempts a key re-exchange.


The problem can be caused also
by the firewall. Try to disable it temporarily to see if the problem persists. Refer to FAQ.
It can also occur if you are using keepalives in your connection. Other people have reported that keepalives fix this error for them.1)
If you find DHCPNACK errors in the Event Viewer, your DHCP server may be briefly denying your IP address, causing your existing connections to fail. Where possible, this can be addressed by reserving a specific IP address on the DHCP server (e.g. cable modem/router), setting that as the static IP address, and disabling the DHCP client service.

 

 

 

아래 사람도 저랑 비슷한 경우인거 같습니다.

저도 첫번째 시도시는 잘 되는데... 두번째 시도할 때는 exception이 발생하더군요...

그리고 천천히 write를 하는게 아니라 좀 빨리 write를 하면은 정상적으로 동작합니다.

서버쪽에서 소켓을 닫아 버리는데, data를 받고서 어느 정도 기다렸다가 닫아버리는지 연속적으로 빠르게 data를 보내면 제대로 동작하더라고요. 결국에는 서버쪽에서 소켓을 닫아 버렸다고 생각할 수도 있는데 흠흠.. 아직 정확하지 않기 때문에 확인해보고 이야기 드리겠습니다.

 

Ladies, I also keep getting the same error message

"java.net.SocketException: Software caused connection abort: socket write error"

but it's always after my 2nd attempt to communicate through the socket.
The first attempt is fine.

Since I wrote the program for the server, I don't understand how it can be closing the connection to my client program (which I also wrote). I am not closing anything except data ports after data is transferred.

 

아래는 Socket관련 에러들에 대한 설명입니다.

대부분의 에러들에 대하여 설명이 되어 있습니다.

 

기타 다른 네트워크 에러 참고 사이트

http://winscp.net/eng/docs/messages

 

posted by 조금까칠한남자
2009/12/19 21:52 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

 

Log4j를 이용해서 package별로 로그를 남기려고 하는데, 이상한 사이트 보고 따라하다가 고생만 했습니다. ㅎ

 

아래 사이트에 굉장히 자세히 설명이 되어 있습니다. 꼭 읽어보시길 바랍니다.

http://kjunine.net/tag/log4j.properties

 

아래 설정은 위 링크 설명을 보면서 작성하였습니다.

아래 설정을 적용하여 테스트 해보시면 아시겠지만, package별로 로그를 쌓으실 수 있습니다.

 

제가 사용하려는 package는 다음과 같습니다.

테스트를 위해서 com.factory.vp.ctmp 패키지에 3개의 class를 만들어 두었습니다.

com.factory.vp.ctmp.CTMP;
com.factory.vp.ctmp.FROMCTMP;
com.factory.vp.ctmp.TOCTMP;
com.factory.vp.fod.FOD;
com.factory.vp.host.HOST;

 

아래 설정에 대한 설명은 링크를 참고하세요.

http://kjunine.net/tag/log4j.properties

log4j.debug=false

log4j.rootLogger=INFO
log4j.logger.com.factory.vp.ctmp=INFO, CTMP
log4j.logger.com.factory.vp.fod=INFO, FOD
log4j.logger.com.factory.vp.host=INFO, HOST


# CTMP
log4j.appender.CTMP=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CTMP.Threshold=INFO
log4j.appender.CTMP.File=
/app/logs/CTMP.log
log4j.appender.CTMP.layout=org.apache.log4j.PatternLayout
log4j.appender.CTMP.layout.ConversionPattern=[%-10c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

 

# FOD
log4j.appender.FOD=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FOD.Threshold=INFO
log4j.appender.FOD.File=
/app/logs/FOD.log
log4j.appender.FOD.layout=org.apache.log4j.PatternLayout
log4j.appender.FOD.layout.ConversionPattern=[%-10c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

 

# HOST
log4j.appender.HOST=org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST.Threshold=INFO
log4j.appender.HOST.File=
/app/logs/HOST.log
log4j.appender.HOST.layout=org.apache.log4j.PatternLayout
log4j.appender.HOST.layout.ConversionPattern=[%-10c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

 

 

DatePattern옵션은 아래 링크를 참고하세요.

[log4j] DailyRollingFileAppender의 DatePattern 옵션

 

각 CTMP.java, FOD.java, HOST.java 클래스에는 간단하게 log.info()를 이용해서 메시지만 찍어 주었습니다. 결과물은 다음과 같습니다.

일단 설정한 /app/logs 디렉토리 밑에 CTMP.log, FOD.log, HOST.log 파일이 생성됩니다.

 

 

파일을 열어보면은

com.factory.vp.CTMP패키지에 있는 CTMP.java, FROMCTMP.java, TOCTMP.java 에 관련된 로그만 찍혀있습니다.

 

com.factory.vp.FOD패키지에 있는 FOD.java

 

com.factory.vp.HOST패키지에 있는 HOST.java

 

이런식으로 패키지별로 로그를 남길 수 있습니다.

 

 

'CodeIN > Java' 카테고리의 다른 글

[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
[log4j] ConversionPattern  (0) 2009/12/12
posted by 조금까칠한남자
2009/12/19 21:51 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

으.. 역시나 한글은 문제를 일으키는구나... ㅎ


전문 통신할 때는 약속된 길이 만큼 정확하게 보내줘야 합니다. 그렇지 않으면... 항상 문제를 일으키고는 하죠..  뭐 한글이 문제는 아니지만요 ㅎ

보통 format을 맞추는 가장 쉬운 방법은 다음아래와 같습니다.

String.format("%-200s", communication);
communication의 원래 값 포함해서 Length가 200인 String을 return한다.

물론 String.format이 이런 식으로 원하는 Length만큼 format을 만들어 주기는 하지만 원래 목적은 이런게 아닌듯 싶다. 하지만 전문 통신할 때 이렇게 사용하면 굉장히 편리하다.

아래는 전문 통신하기 위해서 String length 100을 만들어 주는 소스이다.
sendMessage =
   String.format("%-12s", a) +
   String.format("%-6s", b)+
   String.format("%-22s", c) +
   String.format("%-60s", d);

이렇게 하면은 정확히 String length 100으로 보내게 된다.



하지만 어제 문제가 일어 났던 이유는 한글 사용 때문이며, 서버측이 c언어라서 문제가 발생했다.

String a = "김태정";
System.out.println(a.length);                          <- String length 3
System.out.println(a.getBytes().length);        <-  byte length 6
 
실행결과
3
6

문제가 일어난 원인은 위 소스와 같다.
한글은 2bytes 이므로 String length를 체크하게 되면은 "김태정"의 length는 3이 되지만, c언어에는 String이 없으므로 6이 된다.




'CodeIN > Java' 카테고리의 다른 글

[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
[log4j] ConversionPattern  (0) 2009/12/12
[log4j] log4j.properties 설정  (0) 2009/12/11
posted by 조금까칠한남자
2009/11/26 12:01 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

Eclipse Ganymede 사용하시는 분은

http://blog.naver.com/civan?Redirect=Log&logNo=150045205866

위 사이트를 참고하세요.
설명이 잘 되어 있습니다.

기존에 3.2버전에서 했던 포스팅은 이제 제대로 동작하지 않습니다.
그래서 삭제 했습니다.




posted by 조금까칠한남자
2009/11/20 09:14 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

으~ 역시 웹은 재미있지만 어렵군요..저에게는 ㅎㅎ

 

DBCP 연동 테스트도 끝나고 ㅎ 이제는 connectionPool을 제대로 활용을 해야하는데 어떻게 해야할지 잘 모르겠더라구요 ㅎ

 

검색과 질문 끝에 싱글톤을 이용하면 된다고 하시더라고요.

 

하늘이님 답변(코드인 자바 http://cafe.naver.com/javacircle) :
싱글턴으로 만들어서 생성자에 룩업 구문 넣고 커넥션만 리턴하는 메서드 만들어서 쓰심 됩니다.

 

싱글톤이 무엇인지는 알고 있는데 한번도 사용해볼 일이 없었네요.

그래서 다시 공부하면서 사용해봅시다!!

 

아래 자세히 설명되어 있군요. 순서대로 읽어보시면 금방 이해하실 수 있으실 것입니다.

Singleton에 대한 설명

Java에서 Singleton 패턴 제대로 구현하기

 

아래 사이트에 정말 제대로 설명이 되어 있습니다. 꼭 한번 읽어보시길.

멀티스레드 환경에서 Singleton pattern을 이용할 시 문제가 될 만한 이야기를 하고 있는데요, 왜 그런 문제가 발생할 수 있는지 설명하고 있습니다. 그리고 synchronized를 이용한 해결 방법도 이야기합니다. 저는 아직 이런 것을 사용할 만한 실력(?)이 안되기 때문에 Singleton pattern 사용방법만 알아보겠습니다.

출처 : Double-checked locking and the Singleton pattern

 

import java.util.*;
class Singleton
{
  private static Singleton instance;
  private Vector v;
  private boolean inUse;

  private Singleton()
  {
    v = new Vector();
    v.addElement(new Object());
    inUse = true;
  }

  public static Singleton getInstance()
  {
    if (instance == null)          //1
      instance = new Singleton();  //2
    return instance;               //3
  }
}

 

위 소스 보면서 만들어 보았습니다. 참 쉽죠잉~ 근데 잘 만들었는지는 모르겠네요 크크

DBconnector 클래스

 

public class DBconnector {
    private static DBconnector instance;
    private Connection con;
    private Context envContext;
    private DataSource ds;
    private DBconnector(){
        try {
            envContext = (Context) new InitialContext().lookup("java:/comp/env");
            ds = (DataSource) envContext.lookup("jdbc/VPLook");
            con = ds.getConnection();
        } catch (SQLException ex) {
            Logger.getLogger(DBconnector.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NamingException ex) {
            Logger.getLogger(DBconnector.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


    public static DBconnector getInstance(){
        if(instance==null){
            instance = new DBconnector();
        }
        return instance;
    }

 

    public Connection getConnection(){
        return con;
    }
}

 

 

 

 

posted by 조금까칠한남자
2009/10/28 20:19 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

전문통신 할 때, 한글 때문에 문제가 많다 ㅠㅡ
String을 byte로 변환해서 원하는 길이만큼 가져와서 String으로 만드는 방법.

소스.
String temp = "PC8000오늘두우리는달린다.           ";
byte[] t = temp.getBytes();
String a = new String(t, 0, 1);
String b = new String(t, 1, 1);
String c = new String(t, 2, 4);
String d = new String(t, 6, 30);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);


String 생성자에 사용된 parameter 입니다.
String(byte[] bytes, int offset, int length, String charsetName)


결과값.
P
C
8000
오늘두우리는달린다.       

posted by 조금까칠한남자
prev 1 2 3 4 5 ... 6 next