'JAVA/sample JAVA'에 해당되는 글 30건

  1. 2010.12.17 [sample] FileUtil / File to Byte 2
  2. 2010.12.07 jar 실행파일로 만들기 1
  3. 2010.07.13 BASE64 형변환 / encode & decode 1
  4. 2010.07.13 inputStream & String 형변환
  5. 2010.07.01 [sample] streaming read to xml (스트리밍 타입으로 xml읽기)
  6. 2010.06.30 [sample] class 파일 버전 확인하기 1
  7. 2010.05.07 쿠키를 다루는 여러가지 방법
  8. 2010.03.24 java File 다루기 / 용량만큼 파일 자르기 및 용량이하는 파일 덧붙이기
  9. 2009.12.09 System 시간
  10. 2008.01.14 [sample] httpclient 요청후 상태확인


파일을 바이트로 변환하는 코드 입니다.
사용처는 Reomote 서버에 파일을 전송할때 유용하죠.
잊어먹으면 또 찾아야 되니 여기에 잘 보관 보관 ㅎㅎ

public static byte[] getBytesFromFile(File file) throws IOException {
     InputStream is = new FileInputStream(file);

     long length = file.length();

     // You cannot create an array using a long type.
     // It needs to be an int type.
     // Before converting to an int type, check
     // to ensure that file is not larger than Integer.MAX_VALUE.
     if (length > Integer.MAX_VALUE) {
         // File is too large
     }

     // Create the byte array to hold the data
     byte[] bytes = new byte[(int)length];

     // Read in the bytes
     int offset = 0;
     int numRead = 0;
     while (offset < bytes.length
            && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
         offset += numRead;
     }

     // Ensure all the bytes have been read in
     if (offset < bytes.length) {
         throw new IOException("Could not completely read file "+file.getName());
     }

     // Close the input stream and return bytes
     is.close();
     return bytes;
 }


jar 자체를 실행파일로 만들어 사용하는 방법입니다.

1. MANIFEST.MF 

Manifest-Version: 1.0
Class-Path: .
Main-Class: LocalTest

2. 그밖에 필요한 class 를 준비합니다.

3.  jar 로 엮어 냅니다. 

C:\lang\jdk1.5.0_09\bin\jar -cfm LocalTest.jar manifest.mf *

 4. jar 실행

export LD_LIBRARY_PATH=:.
java -cp ./TestAPIClient.jar:. -jar LocalTest.jar &

 
중요한것은  MANIFEST.MF  을 만들어서 최초 mainClass 를 지정하는것 입니다.
알아서 META-INF 를 만들어내니 신경 쓰지 않아도 됩니다.








 public final static String encodeSun(byte[] str) {
        String b64enc="";
        sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        b64enc  = encoder.encode(str);
        return b64enc;
 }

 

 public final static byte[] decodeSun(String str) {
  byte[] b64dec = null;
  try {
   sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
   b64dec = decoder.decodeBuffer(str);
  } catch (IOException ex) { }
        return b64dec;
 }


inputStream 을 String으로 만들때

StringBuffer sb = new StringBuffer();
     byte[] b = new byte[4096];
     for (int n; (n = inputStream.read(b)) != -1;) {
         sb.append(new String(b, 0, n));
     }
  sb.toString();



String 을 inputStream 으로 만들때

InputStream input = new ByteArrayInputStream(contents.getBytes("UTF-8"));


 


 


xml을 스트리밍 타입으로 읽어야 되는 필요성은 xml파일의 크기가 큰 경우에 해당하는것으로
이경우 xml 구조를 원하는데로 한꺼번에 가져오면 outOfMemory가 발생해서
VM이 죽어버리게 된다.
해법은 XML을 순차적으로 읽는것인데 JAVA에서는 특별한 API를 이용하지 않고서도
JDK6.0이상에서 지원되는 기본 API만으로도 쉽게 해결 할 수 있다. 

   : 찾아보면 아래와 같은 방법을 SAX와 DOM의 장점을 섞어 놓은 방법이라고 한다. test해본 결과
     의도한데로의 결과가 잘 출력이 되어서 다행이였다.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class Read2StreamingTypeXML {
   
    private XMLInputFactory inputFactory = null;   
    private XMLStreamReader xmlReader = null;
   
    public Read2StreamingTypeXML() {
        inputFactory = XMLInputFactory.newInstance();
    }
   
    public void read() throws Exception{
          
        xmlReader = inputFactory.createXMLStreamReader(
            new FileReader("neouserCreate.xml"));
       
        while (xmlReader.hasNext()){
           
            Integer eventType = xmlReader.next();
            if (eventType.equals(XMLEvent.START_ELEMENT)){
                System.out.print(" " + xmlReader.getName() + " ");
            }else if (eventType.equals(XMLEvent.CHARACTERS)){
                System.out.print(" " + xmlReader.getText() + " ");
            }else if (eventType.equals(XMLEvent.ATTRIBUTE)){
                System.out.print(" " + xmlReader.getName() + " ");
            }else if (eventType.equals(XMLEvent.END_ELEMENT)){
                System.out.print(" " + xmlReader.getName() + " ");
            }
        }       
        xmlReader.close();
    }
       
    public static void main(String args[]){
        try{
            Read2StreamingTypeXML obj = new Read2StreamingTypeXML();
            obj.read();           
        }catch(Exception exception){
            exception.printStackTrace();
        }
    }
}



추가적으로 stream 방법으로xml을 읽는경우에는 start와 end를 적절히 사용해서
stringBuffer에 적재하고 분석하는 로직이 추가로 개발 되어야 한다. 위에 코드는  단순히 streaming 형태로 xml을 읽을 수 있다는 sample만을 제시하고 있다.




생성된 class 파일의 버전을 몰라 애먹는 경우가 있어 구해놓습니다.
보통의 class 파일은 우리가 알고있는 이상의 로그정보를 가지고 있습니다.
주석, 컴파일된 내용 등등..
class를 날렵하게 생성하신다면 javac 당시에 옵션! 주는거 잊지 마세요.

import java.io.*;

public class ClassVersionChecker {
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < args.length; i++)
            checkClassVersion(args[i]);
    }

    private static void checkClassVersion(String filename)
        throws IOException
    {
        DataInputStream in = new DataInputStream
         (new FileInputStream(filename));

        int magic = in.readInt();
        if(magic != 0xcafebabe) {
          System.out.println(filename + " is not a valid class!");;
        }
        int minor = in.readUnsignedShort();
        int major = in.readUnsignedShort();
        System.out.println(filename + ": " + major + " . " + minor);
        in.close();
    }
}


 바보같이 보이겠지만 쿠키를 다루는 여러가지 방법이 있는 이유는
쿠키를 내가 받아서 다른 서버에 넘겨야 하는 이슈가 있기 때문입니다.
 CGI도 있겠고 JAVA도 있고 Apache도 있는데 여기서 각기 다른 원하는 형태와 버전의 이슈가 있습니다.


 

// httpClient2.x 에서 지원되는 방식
HttpClient client = new HttpClient();
PostMethod httppost = new PostMethod(POSTING_URL);
httppost.setRequestHeader("User-Agent", "Nozilla 9.9");
httppost.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
httppost.setRequestHeader("Cookie", msg.getSenderCookieString());


// httpClient2.x 에서 지원되는 방식
HttpState clientstate = new HttpState();
clientstate.addCookies(msg.getSenderCookieOrg());
clientstate.setCookiePolicy(CookiePolicy.COMPATIBILITY);
client.setState(clientstate);




// HttpClient 3.x 버전부터 지원되는 로직입니다. ymko
httppost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
httppost.addRequestHeader("COOKIE", msg.getSenderCookie());



아울러 쿠키는 jdk 쿠키와 apache 쿠키가 다르다. 이에 대한 변환과정을 만들어 두는것도 좋다.


지원기능 :  파일분할, 파일존재유무, 파일폴더 존재유무, 생성할 파일이 이미 존재 확인, 크기확인..

아래 예제는 객체 정보를 파일로 생성하는데 있어서 2M의 MAX 크기를 기본으로 설정하고
2M가 넘으면 새로운 파일을 만들어내는 로직이다.

다소 위험한 부분들도 있지만 (특히 NumberFormatException) 이런 취약부분은 코드가 길어지는
관계로 생략하고, 파일이 생성되야 하는 폴더에 생성이되고 증가되면서 임계치를 넘었는지 봐서
다음번 파일 생성시에는 이름을 달리해서 생성시키는 방법을 가지고 있다.

이런로직의 핵심은    OutputStream os = new FileOutputStream(neoPathFile, addFile);  로써
addFile true 라면 덧붙이기가 가능하고 false면 새롭게 생성하게 된다.
이미 단위메소드 활용법에 대해서는 알고 있을테지만 종합선물셋트 형태에서는 고민할꺼리가 많아지는터라 이렇게 정리를 해본다.

 public static String  makeFileOneContents(String fileName,  String serviceRoot, XMLHeaderBean xmlUserInfo, List<XMLCategoryBean>  xmlCategory,  XMLPostBean postBean,  NeoBean neoBean) {
  boolean makeFileBoolean = false;
  boolean addFile = false;
  String neoFileName = fileName;
  
  String neouserFileRoot = serviceRoot+File.separator+neoBean.getName()();
  long maxFileSize = 2 * 1024 * 1024; // 2M
  long nowFileSize = 0; // 2M

  File fileDirRoot = new File (neouserFileRoot);

  if (fileDirRoot.isDirectory()) {  // 디렉토리 존재하는가? / 네 존재합니다.
   File[] files = fileDirRoot.listFiles();
   
   for (File fileDir : files) {
          String fileNames = fileDir.getName();
          long file_size = fileDir.length();

          if (fileNames.equals(neoFileName+".xml") && file_size >= maxFileSize) {
           int fileCount = Integer.parseInt(neoFileName.substring(neoFileName.lastIndexOf("_")+1, neoFileName.length())) + 1;
           neoFileName = neoFileName.substring(0, neoFileName.lastIndexOf("_")) +"_"+fileCount;
          } else {
           nowFileSize = files.length;
           addFile = true;
          }
      }
  } else {
   fileDirRoot.mkdir();
  }
  
  String neoPath = serviceRoot+File.separator+neoBean.getName()()+File.separator+neoFileName;
  neoPath = neoPath +".xml";  // 넘어올때 xml이라는 확장자 이름을 달고오지 않습니다.
    
  File neoPathFile = new File(neoPath);
  XMLBean xmlBean = new XMLBean();

  BufferedReader in = null; 
  BufferedWriter out = null;
  try {
   OutputStream os = new FileOutputStream(neoPathFile, addFile);  //addFile의 옵션에 따라 파일을 덧 추가하거나 분할한다. (true: 추가 / false : 분할) 
   out = new BufferedWriter (new OutputStreamWriter(os, "UTF-8"));
   
   // XML을 만들때 setting + category 를 1개의 Set으로 간주해서 우선 파일을 생성합니다.
   // 그리고 postAL 의 경우는 attach된 파일이 있을경우를 대비 1개씩 추가로 삽입합니다.
   String readLine;
   String readSetting = xmlUserInfo.getXml().toString();
   StringBuffer sbCate = new StringBuffer();
   for (XMLCategoryBean categoryBean: xmlCategory) {
    sbCate.append(categoryBean.getXml());   
   }
   readSetting = readSetting+sbCate.toString(); // setting + category
   
   if (!addFile) {  // 새로만든 파일은 해더와 카테고리 정보를 넣습니다. 
    out.write(xmlBean.getHeader());
    in = new BufferedReader (new InputStreamReader(new ByteArrayInputStream(readSetting.getBytes())));
    while ((readLine = in.readLine()) != null) {
     out.write(readLine);
     out.newLine();
    }
   }
      
   if (postBean != null) {
    nowFileSize  =+ postBean.getXml().toString().getBytes().length;
    in = new BufferedReader (new InputStreamReader(new ByteArrayInputStream(postBean.getXml().toString().getBytes())));
    while ((readLine = in.readLine()) != null) {
     out.write(readLine);
     out.newLine(); 
    }     
   }
 
   makeFileBoolean = true;
   
   if (nowFileSize >= maxFileSize) {  // 생성될 파일의 크기가 크다면 Footer 정보를 넣어줍니다.
    out.write(xmlBean.getFooter());
   }   
  }
  catch (MalformedURLException e) { e.printStackTrace(); }
  catch (IOException e) { e.printStackTrace(); }
  finally {
       try {
    in.close();
    out.close();
   } catch (IOException e) { e.printStackTrace(); }
  }  
  return neoFileName;
 }
}




System 시간

JAVA/sample JAVA 2009. 12. 9. 15:57

long neouser = System.currentTimeMillis();


이분.. 매번 찾으려 들면 잘 안떠올라 T-T

HttpClient를 이용해서 해당 url을 호출한뒤 상태를 확인해보는 sample입니다.
이것을 가지고 해당 url이 오류여부 확인 가능하다.

 public void test_001 () {
//  String rssurl = "
http://crizin.net/rss";
  String rssurl = "
http://neouser.tistory.com/rss";
  HttpClient client = new HttpClient();
  GetMethod getMethod = new GetMethod(rssurl);

  try {
   int status = client.executeMethod(getMethod);  
   String message = getMethod.getStatusText();
   
System.out.println("status : "+status);  
System.out.println("001 : "+getMethod.getResponseBodyAsString());  
System.out.println("002 : "+getMethod.getStatusLine());  
System.out.println("003 : "+getMethod.getName());
System.out.println("003 : "+getMethod.getResponseHeader("Location"));
//System.out.println(new String (request));  
  } catch (HttpException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 
 }

1 2 3 

글 보관함

카운터

Total : / Today : / Yesterday :
get rsstistory!