2009년 4월 30일 목요일

“가슴으로 낳은 자식 밝게 크는 기쁨에 살죠”

이 글은 이전 글의 복원이 아닙니다...ㅋㅋㅋ

“가슴으로 낳은 자식 밝게 크는 기쁨에 살죠”

막연한 입양에 대한 생각... 일단 자격조건은 되지만 과연 내가 할 수 있을까?

XML 특수문자 정리와 Java를 이용한 toXMLString 소스

XML에서는 아래 5가지의 특수문자를 사전정의하고 있다.

NameCharacterCode
quot""
amp&&
apos''
lt<&lt;
gt>&gt;

만약, 별도의 XML API를 사용하지 않는다면 해당 캐릭터가 String으로 XML의 value 또는 context text로 포함되어 있을 경우 XML 파서에서는 에러를 리턴하게 된다. 따라서 XML Write할 때 위의 특수문자를 Code로 바꾸어 주어야 한다.

다음은 Java를 이용하여 해당 문자를 Code로 바꾸어주는 TDD 소스이다.

/**
 * XML에서 사용할 수 없는 특수문자를 변경해 준다.
 */
package com.mediachorus.pepbox.encoding;
import java.nio.CharBuffer;
import junit.framework.TestCase;
/**
 * @author SangHyup LEE
 * @version 1.0
 *
 */
public class ToXMLStringTest extends TestCase {
 public void testToXMLString() {
  String name = "\"한&글'을<포>함";
  
  CharBuffer cb = CharBuffer.wrap(name);
  String xmlString = "";
  while ( cb.hasRemaining() ) {
   // System.out.println(cb.get() + " ");
   char tempChar = cb.get();
   
   if ( tempChar == '"' ) {
    xmlString += "&quot;";
   } else if ( tempChar == '&' ) {
    xmlString += "&amp;";
   } else if ( tempChar == '\'' ) {
    xmlString += "&apos;";
   } else if ( tempChar == '<' ) {
    xmlString += "&lt;";
   } else if ( tempChar == '>' ) {
    xmlString += "&gt;";
   } else {
    xmlString += tempChar;
   }
  }
  // System.out.println("xmlString : " + xmlString);
  
  assertEquals("&quot;한&amp;글&apos;을&lt;포&gt;함", xmlString);
 }
}



위의 testToXMLString() 메소드의 구현 부분을 static 메소드를 사용하여 구현해 주면 된다. 예를 들면 다음과 같다.

public class ConvertUtil {
 public static String toXMLString(String input) {
  String xmlString = "";
  
  CharBuffer cb = CharBuffer.wrap(input);
  while ( cb.hasRemaining() ) {
   char tempChar = cb.get();
   
   if ( tempChar == '"' ) {
    xmlString += "&quot;";
   } else if ( tempChar == '&' ) {
    xmlString += "&amp;";
   } else if ( tempChar == '\'' ) {
    xmlString += "&apos;";
   } else if ( tempChar == '<' ) {
    xmlString += "&lt;";
   } else if ( tempChar == '>' ) {
    xmlString += "&gt;";
   } else {
    xmlString += tempChar;
   }
  }
  
  return xmlString;
 }
}

좋은 기업을 넘어... 위대한 기업으로(Good to Great)

사용자 삽입 이미지
기업을 연구하는 많은 이유는 기업에 담긴 경영철학을 이해하기 위함이기도 하고, 
기업을 경영하고 있다면 더 나은 이 책에선 위대한 기업이 되기 위함이기도 하고, 
그 외 사람마다 여러가지 다른 이유로 책을 읽게 될 것이다. 

본인은 경영학도는 아니지만 기업경영에 관심이 많은 탓으로 
여러 책을 통해서 다양한 경영철학이나 원리, 또는 방법들을 접하고 있던 참이었다.
대부분의 경영서적 또는 마케팅 서적들이 평범한 방법이나 
좀 더 나은 방안들로 단기간에 세워진 원리들을 전하고 있는 반면, 
이 책은 참으로 탁월하다라고 할만큼 신선한 원리 아니 
몇 백년 또는 몇 십년 영유하는 기업 속에 담긴 탁월한 원칙을 깨닫게 해 준다. 

특히, 제시하고 있는 6가지 정도의 원리 중에 
"사람 먼저... 다음에 할 일"이라는 원리는 경영이념이나 철학을 뛰어 넘어 인간 사회의 모든 영역에서 세워질 탁월한 원리 제시였다. 
최근에 읽은 책 중에 "CEO 안철수, 지금 우리에게 필요한 것은"에서 CEO 안철수는 "경영이념, 비전"에 대한 이야기를 많이 하는 것을 보았다. 
기업 또는 하나의 공동체는 세워가기에는 정말로 필수적인 요소라는 생각을 해 왔었다. 
순서로 따지면 경영이념/비전 세우기, 그리고 사람이라는 생각을 가지고 있던 참이었다. 
더군다나 이익을 목적으로 하는 기업문화에서는... 

그러나 "사람 먼저... 다음에 할 일"이라는 원리에서 정말로 신선하면서도 즐거운 원리 속에 빠져들고 말았다. 
기업 뿐만 아니라 인간 사회의 모든 영역에 동일한 원리가 숨어 있음을 기업경영연구를 통해서 알게 되었다는 것이 참으로 놀랄 일이었다. 그것도 성공하는 아니 위대한 기업으로서 성장하기에 필수적인 요건으로 존재하니 말이다. 
가히 탁월하다 또는 신선하다를 넘어 인간 사회의 모든 영역, 특히 사회의 공동체적 성격을 지닌 모든 단체들에 외치고도 싶은 제목이다. 
"사람 먼저... 다음에 할 일!" 
교회이건, 직장이건, 자신이 속한 사회에서 가장 먼저 적용해 볼 만한 원리가 아닐까? 

독백이 되어 버릴 지 모르지만 정말로 일하고 싶고, 만족을 얻으며 함께 성장하는 좋은 기업을 만들고 싶다. 
그 첫째가는 원리가 단계5의 리더쉽, 그리고 "사람 먼저... 다음에 할 일"을 세우는 것! 
이 원리를 잊어 버리지 않고 앞으로 계속되는 연구가 필요할 거 같다.

UTF-8을 기본 문자셋으로 사용하지 않는 시스템에서의 UTF-8 사용하기

최근 웹 표준을 기반으로 한 웹 사이트 기획이나 설계, 구현이 많이 이루어지고 있는 추세이다. 참 다행인 듯 하다.
웹 표준엔 XHTML + CSS + JavaScript를 이용한 프리젠테이션 영역의 이슈를 주로 다루고 있는데, 추가적으로 반드시 다루어야 하는 부분이 Character set 에 대한 표준이다.
Character set에 대한 표준은 단순히 웹 표준에서 뿐 만이 아니라 웹 애플리케이션, 응용 애플리케이션에 이르기까지 개발 전체적인 측면에서 표준으로 다루어야 한다.
그럼면에서 UTF-8을 기반으로 한 개발 표준을 다룰 줄 알아야 하고, 그에 따른 경험이 중요하다고 하겠습니다.

다행히 Java는 UTF-8을 기본으로 지원하기 때문에 구현이나 연동 상에 별다른 문제는 발생하지 않는다. 다만 타 시스템 간에 연동이나 UTF-8을 기본 문자셋으로 설정해 두지 않은(예를들면, Windows 같은) 시스템에서의 팁을 제공하고자 한다.

여기선 타 시스템 간의 연동에 대해서는 다루지 않고, 윈도우 같은 기본 문자셋을 UTF-8을 사용하지 않는 시스템에서의 웹 애플리케이션 구현히 발생할 수 있는 한 가지를 다루고자 한다.

자바는 문자셋을 시스템의 문자셋을 기본으로 VM이 가동되기 때문에 String을 처리할 때는 해당 문자셋 형태로 지원한다. 그래도 데이터베이스 + WAS + 웹 애플케이션을 UTF-8 형태로 맞추어두고 개발하게 된다. 이 때 발생할 수 있는 문제가 서버에서 XML을 리턴한다든지, response로 보내는 것이 HTML이 아닌 별도의 프로토콜에 의한 문자열을 반환할 때가 있다. 대표적인 것이 XML을 응답으로 주는 것이다.

이럴 때, 보통은 Servlet을 이용하여 HTTP Body에 XML을 실어서 보내게 되는데, String 처리까지는 UTF-8을 기반으로 한 코딩이 별도의 설정이나 기법없이 가능하다. 그리고 최종 아래와 같이 XML 문자열을 반환한다.

String xmlData = "뭐라뭐라";

PrintWriter out = response.getWriter();
        
out.println(xmlData);
        
out.flush();
out.close();


이 때, HTTP Response 객체를 이용한 HTTP Header를 셋팅해 주어야 하는데, 해당 문자열의 크기(즉, HTTP Body), Content Type 등을 다음과 같이 지정해 준다.

response.setContentLength(xmlData.getBytes().length);
response.setContentType("application/xml");
response.setCharacterEncoding("utf-8");


Content Length에 해당하는 결과 값으로 주어지는 String의 length가 실제 HTTP Body의 크기가 된다. 혹시나 실수로 xmlData.length() 함수를 사용하여 Content Length를 지정하는 일이 없길 바란다. 이러한 로직의 응답시에는 반드시 String의 lenght가 아니라 String byte의 length를 사용해야 한다.

그런데, 위의 예처럼 xmlData.getBytes().length 를 그대로 이용하여 UTF-8을 기본 문자셋으로 사용하지 않는 시스템에 서버 애플리케이션을 올려두면 한글이 들어간 XML인 경우에는 분명히 사이즈가 다르게 전달된다. 그래서 XML이 정상적으로 클라이언트에 전달되지 않는다.

이럴 때 아래와 같이 명시적으로 String의 byte 문자셋을 UTF-8으로 지정해 주어야 한다.

response.setContentLength(xmlData.getBytes("UTF-8").length);
response.setContentType("application/xml");
response.setCharacterEncoding("utf-8");


그러면, 소스 레벨에서 String의 문자셋을 UTF-8 형태로 byte를 얻어오기 때문에 정상적인 처리가 가능하다.

단순히 웹 사이트나 통일된 환경에서의 처리에는 이와 같은 팁이 유용하지 않치만 타 시스템 간의 연동이나 개발/운영된 환경에서 벗어난 포팅등에서는 유용하게 사용될 만한 팁이라 할 수 있다.

네트웍에서 2바이트로 들어오는 unicode를 자바에서 처리하기

개발환경은 JEE 이지만 실제코드와 업무영역은 JSE에 가까워서 JavaSE 카테고리에 넣어둡니다. 이전 자료입니다^^;;


프로젝트 진행중에 클라이언트는 C++로 작성되어져 있고,

서버는 J2EE A/S를 기반으로 작성되어져 있습니다.

여러가지 연동 중에 소켓을 통해서 데이터를 주고 받는 게 있는데, 그 중에 2바이트 유니코드를 받아서 처리해야 하는 부분이 있었습니다.

많은 곳에 찾아봐도 해답을 얻지 못했는데, 하루 밤을 새워 알게 되었습니다.

도움이 되었으면 좋겠군요^^


먼저 네트워크에서는 big-endian byte order를 지켜야 함을 명시합니다.

만약 '홍길동'이란 단어를 실제 유니코드를 표현하면 다음과 같습니다.


\ud64d\uae38\ub3d9


그러나, 네트웍에서는 2바이트로 어떻게 들어올까요?

16진수로 표현하면 다음과 같이 들어오게 됩니다.


0x4d 0x64 0x38 0xua 0xd9 0xb3

쉽게표현하면 위와 같이 들어오는 것이고 이를 그냥 stream으로 네트워크에서는 들어오기 때문에 DataInputStream으로 표현하여 StringBuffer에 넣으면 다음과 같이 나오게 됩니다.


4d6438uad9b3


때문에 이를 다음과 같이 변환해 주어야 합니다. 왜냐하면 네크워크에서는 big-endian으로 들어오기 때문이죠...

그리고, 위의 '홍길동'에서는 0x01과 같이 앞 바이트가 '0'이 들어가는 게 없어서 괜찮은데, 만약 '0'이 들어오면 임의로 '0'을 추가해 주어야 합니다.


예제 소스를 첨부합니다


StringBuffer sb = new StringBuffer();

byte[] buf = new byte[4096];
int pos = dataInputStream.read(buf, 0, 4096);

byte[] stringName = new byte[80];

for ( int i=0; i < pos; i+=2 ) {
    String uniString = "\\u";
    
    i += 1;
    try {
       stringName [i] = buf.getByte();
    } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }


    String tempString1 = Integer.toHexString(stringName [i] & 0x000000FF);
    if ( tempString1.length() == 1 )
      tempString1 = "0" + tempString1;
    uniString += tempString1;

    i -= 1;
    try {
      stringName [i] = buf.getByte();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }


    String tempString2 = Integer.toHexString(stringName [i] & 0x000000FF);
    if ( tempString2.length() == 1 )
       tempString2 = "0" + tempString2;
    uniString += tempString2;
    
    sb.append(ByteUtil.UnitoStr(uniString));
}


소스를 가능하면 명확하게 하기 위해 노력했습니다^^

모두 행복하게 살았으면 좋겠네요ㅎㅎ

Flickr-j를 이용한 플리커 이미지 검색하기

Flickr Open API를 각 언어별로 구현해 둔 오픈소스들이 많이 있다. 야후 플리커에서 소개하고 있는 킷 중에 Flickr-j 오픈소스를 이용해서 플리커의 이미지를 검색하는 예제소스를 구현해 보자.

플리커, 피카사, 아마존, 구글 API등을 이용한 새로운 서비스를 만드는 것을 매쉬업이라고 한다. 아마도 대부분은 이에 대한 것을 잘 알고 있으리라 생각하고 생략한다. 그냥 나도 이번 기회를 통해서 매쉬업 서비스를 중점적으로 연구해 볼까? 하는 생각을 해 본다. 물론 언제나 시간적 여건이 마련되어야 하지만...^^;;
암튼, 매쉬업 서비스를 위한 첫 발걸음을 본격적으로 내딛었다고 생각한다. 그럼 다음의 소스를 간략하게 실행해 보자.
컴파일, 실행 전에 반드시 flickrapi.jar 를 classpath에 포함시켜야 한다. 이클립스 환경에서 수행하면 쉽게 수행할 수 있다.

/**
 * FlickrSearch.java
 *
 * Flickr-j를 이용한 Flickr 검색 애플리케이션
 *
 */
package net.wiseant.flickr.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.aetrion.flickr.Flickr;
import com.aetrion.flickr.FlickrException;
import com.aetrion.flickr.REST;
import com.aetrion.flickr.RequestContext;
import com.aetrion.flickr.auth.Auth;
import com.aetrion.flickr.auth.Permission;
import com.aetrion.flickr.photos.Photo;
import com.aetrion.flickr.photos.PhotosInterface;
import com.aetrion.flickr.photos.SearchParameters;
import com.aetrion.flickr.util.IOUtilities;

/**
 * @author Sang Hyup Lee
 * @version 1.0
 *
 */
public class FlickrSearch {

    static String apiKey;
    static String sharedSecret;

    Flickr flickr;
    REST rest;
    RequestContext requestContext;
    Properties properties = null;

    public FlickrSearch() throws ParserConfigurationException, IOException {
        InputStream in = null;
        try {
            in = getClass().getResourceAsStream("/setup.properties");
            properties = new Properties();
            properties.load(in);
        } finally {
            IOUtilities.close(in);
        }

        flickr = new Flickr(properties.getProperty("apiKey"), properties.getProperty("secret"), new REST());
        requestContext = RequestContext.getRequestContext();
        requestContext.setSharedSecret(properties.getProperty("secret"));

        Auth auth = new Auth();
        auth.setPermission(Permission.READ);
        auth.setToken(properties.getProperty("token"));

        requestContext.setAuth(auth);
        Flickr.debugRequest = false;
        Flickr.debugStream = false;
    }

    public void search() throws FlickrException, IOException, SAXException {
        Map starredPhotos = new HashMap();
        Map blockedPhotos = new HashMap();

        PhotosInterface photosInterface = flickr.getPhotosInterface();

        SearchParameters params = new SearchParameters();

        // tag setter
        // params.setTags(new String[] {"java", "jsp"});
        params.setText("java");

        int perPage = 10;
        int pageIndex = 0;
        List photoList = photosInterface.search(params, perPage, pageIndex);
        List photos = new ArrayList();

        System.out.println("===== Search result =====");
        for ( Object object : photoList ) {
             Map photoMap = new HashMap();
             Photo photo = (Photo)object;

             System.out.println("Photo id : " + photo.getId());
             System.out.println("Photo title : " + photo.getTitle());
             System.out.println("Photo small square url : " + photo.getSmallSquareUrl());

             photoMap.put("url",    photo.getSmallSquareUrl());

            String id = photo.getId();
             photoMap.put("id", id);

             Boolean starred = (Boolean) starredPhotos.get(id);
             photoMap.put("starred", starred == null ? Boolean.FALSE : starred);
            if (blockedPhotos.get(id) == null) {
                 photos.add(photoMap);
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        FlickrSearch flickrSearch = new FlickrSearch();
        flickrSearch.search();

        System.exit(0);
    }

}

위의 소스를 실행하기 전에 setup.properties를 properties로 설정해 두는 부분이 있다. setup.properties의 양식은 다음과 같다.

apiKey = your api key
secret = your secret
token = your token

setup.properties 에서 value 값으로 사용되는 것들은 플리커 API 키를 신청하면 얻을 수 있다. token은 flickr-j 의 examples 소스의 AuthExample.java 를 통해서 얻어올 수 있다.

특별히 설명이나 어려운 부분없다. 대부분은 flickr-j 에서 제공함으로 API를 호출하기만 하면 된다. example을 통해서 여러 가지 살펴보고 있는데, 블로그를 통해서 소개할 만한 부분들은 언제든지 소개할 것이다.

이것으로 첫 매쉬업 서비스를 런칭해 보았다^^
참, flickrj 는 다음의 주소에서 구할 수 있다.

[링크]다양한 자바 소스

구글링을 하다가 우연히 찾게된 사이트이다.
카테고리별로 간단/명료한 자바 소스가 잘 정리되어 있는 사이트이다.
다음의 링크를 따라가보자^^



를 살려보면 Oracle, Java, Linux 에 상당한 지식을 소유하고 있는 개인 사이트이다.

암튼, 잘 정리된 소스를 찾을 수 있는데 도움이 될거 같다.

육일약국 갑시다

사용자 삽입 이미지
단숨에 읽어버린 책이다. 특이한 제목으로 읽게 된 책에서 귀한 "섬김의 비지니스"를 발견하게 되었다. 이전에 메가스터디에 대한 신화는 이미 들어 알고 있었지만 '육일약국'에 대한 이야기는 전혀 들어본 적이 없던 때였다. 그러니깐 내겐 엠베스트라는 온라인 교육 사이트도 들어본 적이 없던 때였다.

책의 소개에서도 저자의 특이한 CEO 경력이 마음 한편으론 전문가적이지 못하거나 믿음이 쉽게 가지 않는 문구가 많았다. 약국경영->제조업->그리고 온라인 교육 사업으로 이어지는 저자의 경력이 비전문가적인 면으로 비취어지기도 하였기 때문이다. 하지만 나의 예상은 완전히 빗나가 버렸다.

저자 김성오 CEO는 참으로 이 시대에 귀감이 되는 CEO 경영 마인드를 가지고 있다. "육일약국 갑시다"란 책을 통해서 사람들에게 널리 널리 알려졌으면 좋겠다는 생각이 든다.

이 책은 단순한 저자의 경험담이나 노하우를 전달하는 것 뿐만 아니라 CEO로서의 올바른 경영마인드, 그리고 기업의 사회적 역할에 이르기까지 한 시대를 살아가면서 본을 받고 심을만큼 훌륭한 면을 지니고 있다.
책의 내용이나 깊이면에서 경영전문서적이라고 말하기는 힘들지만 저자가 직접 겪은 스토리를 기반으로 한 현장에서의 살아있는 경영노하우에 대해서 말하고 있기 때문에 오히려 더 적용가능하고 현장감있게 받아들일 수 있다는 생각이 든다.

내게 더욱 재밌는 부분은 현재 엠베스트 중등부 대표를 맡고 있으면서 온라인 교육의 혜택을 많은 이들에게 누리게 하고 싶은 마인드이다. 메가스터디의 발전 모습을 보면서 사교육의 대체, 저소득층의 대안으로서 온라인 교육을 할 수 있다고 생각해왔었는데 이미 이를 실천하고 있다는 것이었다.
실제로 돈이 많이 없어 교육의 기회를 잃어버리거나, 사교육을 쉽게 받을 수 없는 이들에겐 좋은 대안이라고 생각이 든다.

책의 내용을 하나 하나 소개하고 싶을 만큼 현장감이 있으면서 CEO를 하고 있거나 CEO를 꿈꾸는 자들에게 꼭 한 번씩은 선물로 주고 싶은 책이다. 당연히 나 역시 김성오 CEO를 본받아 좋은 CEO가 될 수 있었으면 좋겠다.

다음은 이 책의 목차인데 책의 내용을 일일히 소개할 수 없어 목차만이라고 소개한다.

CHAPTER 1 고객을 영업부장으로 만들어라 
육일약국 갑시다 
정성이 대단한 사람 
혁신의 가장 큰 장애물, 고정관념 
약사님은, 한방 공부 중 
물건을 팔기보다 정성을 파는 마음으로 
분수에 맞게, 힘닿는 만큼 
가장 효율적이고 지속적인 경쟁력, 마음경영

CHAPTER 2 고객에 앞서 직원부터 감동시켜라 
장사란, 이익보다 사람을 남기는 것 
직장인 마인드, 자영업자 마인드 
시간이 흐를수록 빛나는 신념, 정직 
적군도 아군으로 만드는 비법 
실패, 그것은 경험이자 노하우

CHAPTER 3 이윤보다 사람을 남기는 장사를 하라 
위기, 그것은 성공의 열쇠를 만드는 시간 
자금의 선순환, 직원의 선순환 
역전도 가능케 하는 기회, 경쟁 
약국 (경영) 합니다 
불가능이란, 노력하지 않은 자의 변명

CHAPTER 4 나누고 베풀어라, 아버지의 유산 
아버지의 생활신조 
내게 복을 주러 온 사람들 
산을 옮길 수 있다는 믿음 
한 명의 회원으로 시작한 엠베스트

내가 바라 본 김성오 대표



참, 이 책에서는 저자의 기독교인으로서의 정체성을 분명히 밝힘과 동시에 인간중심적(직원/고객 감동) 경영 마인드가 자주 언급되는데, 이 두개의 사상이 결코 이분법적인 것이 아니라 서로 일치하는 것임을 알게 되었으면 좋겠다. 이러한 것이 위의 목차에서도 잘 나타나고 있기 때문에 소개한 것이다.

SVG에 Javascript 파일 포함시키기

보통 HTML에서 Javascript 파일을 포함시키는 방법은 다음과 같다.

<head>
<script src="example.js"></script>
</head>


하지만 SVG+Javascript 연동시에 SVG 파일에 Javascript를 포함하려면 위의 코드로는 불가능하다.
아래와 같이 해 주어야 한다. <svg>태그 아래에 다음과 같이 해 준다.

<script xlink:href="example.js" />


별다른 차이가 없지만 SVG+Javascript 사용시에는 중요하다.

안드로이드 Java SE 지원 패키지

Google Android 문서의 "Reference Information --> Package Index"에서 찾아볼 수 있는데, 기본적인 Java package 지원 범위를 한 눈에 알 수 있다.

요약하면, java.lang, java.io, java.nio, java.util, java.text 라고 할 수 있다. UI는 android api를 사용해야 하니 UI 제외한 대부분의 기본 자바는 사용할 수 있다고 봐야 한다.


java.awt.font 
java.io

Provides input and output facilities by means of streaming, filesystem access and serialization.

java.lang

Provides core classes of the Android environment.

java.lang.annotation

Defines interfaces and exceptions necessary for annotation support.

java.lang.ref 
java.lang.reflect 
java.math

This package provides arbitrary-precision integers and decimals.

java.net

Provides networking-related functionality, such as streaming and datagram sockets, handling of Internet addresses, and dealing with HTTP requests.

java.nio

Provides buffers that help handling data.

java.nio.channels

Channels provide a way to connect to sources of data such as files, sockets or other structures that allow input and/or output of data.

java.nio.channels.spi

Service-provider classes for nio channels.

java.nio.charset

This package allows translating between bytes and different character sets.

java.nio.charset.spi

Service-provider classe for nio charset.

java.security

This package provides all the classes and all the interfaces needed by Java security framework.

java.security.acl

This package provides all the classes and all the interfaces needed to build Access Control List.

java.security.cert

This package provides all the classes and all the interfaces needed to generate, administer and verify X.509 certificates.

java.security.interfaces

This package provides the interfaces needed to generate: (1) Keys for the RSA asymmetric encryption algorithm using the PKCS#1 standard; (2) Keys for the Digital Signature Algorithm (DSA) specified by FIPS-186; (3) Keys for a generic Elliptic Curve asymmetric encryption algorithm.

java.security.spec

This package provides the classes and interfaces needed to specify keys and parameter for encryption and signing algorithms.

java.sql

Provides a standard interface for accessing SQL-based databases.

java.text

The java.text package allows to uncouple the text in the application from a natural language.

java.util

Provides an extensive set of utility classes.

java.util.concurrent

Utility classes commonly useful in concurrent programming.

java.util.concurrent.atomicA small toolkit of classes that support lock-free thread-safe programming on single variables.
java.util.concurrent.locksInterfaces and classes providing a framework for locking and waiting for conditions that is distinct from built-in synchronization and monitors.
java.util.jar

The java.jar package gives access to jar files content.

java.util.logging

This package allows to add logging to any application.

java.util.prefs

Provides a preferences mechanism, that is, a means of writing configuration data (key/value pairs) to a persistent data store and retrieving it from there.

java.util.regexProvides an implementation of regular expressions, which is useful for matching, searching, and replacing strings based on patterns.
java.util.zip

This package can read and write the standard zip format.

javax.crypto

This package provides the classes and interfaces needed to define encryption algorithm, keys' agreement algorithms and MAC (Message Authentication Code).

javax.crypto.interfaces

This package provides the interfaces needed to implement the Diffie-Hellman (DH) key agreement's algorithm as specified by PKCS#3.

javax.crypto.spec

This package provides the classes and interfaces needed to specify keys and parameter for encryption.

javax.microedition.khronos.egl 
javax.microedition.khronos.opengles 
javax.net 
javax.net.ssl

This package provides all the classes and interfaces needed to implemenet and program the Secure Socket abstraction based on the SSL protocol SSSLv3.0 or TLSv1.2 All the details of the SSL handshake protocol ar card for, and the cipher set with which a client or a server work can be specified.

javax.security.auth

This package provides all the classes and interfaces needed to implemenet and program different methods of users' authentification and role based users' authorization.

javax.security.auth.callback

This package provides all the classes and interfaces needed to interact with the application in order to execute the authentification and authorization processes.

javax.security.auth.login

This package provides a pluggable and stackable authentication system based on ideas and concepts from the Unix-PAM module.

javax.security.auth.x500

This package provides all the classes needed to store X.500 principals and their credentials.

javax.security.cert

This package is provided only for compatibility reasons.

javax.sql

Provides extensions to the standard interface for accessing SQL-based databases.

javax.xml 
javax.xml.parsers

Provides facilities for parsing XML documents and building Document Object Model (DOM) trees from them.

junit.frameworkThe junit test framework.
junit.runnerUtility classes supporting the junit test framework.