디컴파일러 Class 파일 -> java 파일로 보는 방법



자바에서 사용하는 API의 소스 내용을 확인 하고 싶을 때가 있을 것이다. 하지만 API는 class 파일로 되어 있어 확인이 어려운데 디컴파일러를 이용해 java파일로 변환해 소스를 보는 방법을 확인해 보겠다.


JAVA Decomplier



[Decomplier 다운]

아래 사이트에서 JD-GUI를 다운 받아서 class 파일을 java 소스 파일로 볼 수 있다.

http://jd.benow.ca/


이클립스에서 class -> java 변환 방법



[이클립스에 디컴파일러 플러그인 설치 방법]

아래 사이트에서 JD-Ecplise를 다운 받는다.

http://jd.benow.ca/


다운 받은 파일을 확인 한다.

jd-eclipse-site-1.0.0-RC2.zip


이클립스에서 다운 받은 파일을 설치 한다.

이클립스 실행 -> help -> Install New Software -> add -> Archive.... -> 

다운 받은 jd-eclipse-site-1.0.0-RC2.zip 파일 선택 -> java Decompiler Eclipse Plug-in 선택 - > next


String 클래스를 선택해 본다.

소스 중 String이 정의 된 곳에 Ctrl 키를 누르고 String을 마우스 왼쪽으로 클릭한다.

그럼 String 클래스의 java파일인 소스 내용을 확인 할 수 있다.


반응형

'프로그램 > Java' 카테고리의 다른 글

[java] NIO를 이용한 파일 쓰고 읽기  (0) 2018.06.05
[java] ByteBuffer 사용법  (0) 2018.06.03
[java] 파일 읽고,쓰기 사용법  (0) 2018.05.30
[java] 스레드 사용법  (0) 2018.05.27
[java] 함수 가변 인자 사용 방법  (0) 2018.05.25

NIO를 이용한 파일 쓰고 읽기(GatheringByteChannel, ScatteringByteChannel)



보통 자바가 C에 비에 느린 이유중 하나가 IO가 JVM 내부에 IO버퍼를 두었기 때문이다. java에서 IO 프로그램을 할 때 JVM의 내부 버퍼를 이용하지 않고 직접 운영체제의 데이터를 접근해 속도 개선을 한 것이 NIO이다. 이를 사용해 파일을 쓰고 읽기를 사용법을 익혀보도록 하겠다. 


NIO를 이용한 파일 쓰고 일기의 3가지 클래스


nio를 사용 하기 위해서는 GatheringByteChannel, ScatteringByteChannel, ByteBuffer 3가지 클래스를 이용한다. 우선 전체 예제 부터 살펴 보겠다.


[전체 예제]

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.channels.*;


public class ChannelFile {

public static void main(String[] args) {

try {

//NIO 함수를 이용해 파일 쓰기

FileOutputStream fo = new FileOutputStream("test.txt");

GatheringByteChannel gchannel = fo.getChannel();

ByteBuffer wheader = ByteBuffer.allocate(30);

ByteBuffer wbody = ByteBuffer.allocate(30);

ByteBuffer[] wbuffers = { wheader, wbody };

wheader.put("header is hello world".getBytes());

wbody.put("body is welcome to channel".getBytes());

wheader.flip();

wbody.flip();

gchannel.write(wbuffers);

gchannel.close();

//NIO 함수를 이용해 파일 읽기

FileInputStream fin = new FileInputStream("test.txt");

ScatteringByteChannel schannel = fin.getChannel();

ByteBuffer rheader = ByteBuffer.allocateDirect(10);

ByteBuffer rbody = ByteBuffer.allocateDirect(10);

ByteBuffer[] rbuffers = { rheader, rbody };

int readCount = (int) schannel.read(rbuffers);

System.out.println("cnt : " + readCount );

schannel.close();

rheader.flip();

rbody.flip();

byte[] byteHeaderBuffer = new byte[10];

byte[] byteBodyBuffer = new byte[10];

rheader.get(byteHeaderBuffer);

rbody.get(byteBodyBuffer);

System.out.println("header : " + new String(byteHeaderBuffer));

System.out.println("body : " + new String(byteBodyBuffer));

}catch( IOException e ) {

System.out.println(e);

}

}

}


[실행 결과]

cnt : 20

header : header is 

body : hello worl


[파일 쓰는 방법]

10자리 byte 만큼 메모리 공간 확보

//NIO 함수를 이용해 파일 쓰기


//디스크에 test.txt 파일을 만들어 채널 형식으로 변환한다.

FileOutputStream fo = new FileOutputStream("test.txt");

GatheringByteChannel gchannel = fo.getChannel();

//nio는 byte단위로만 사용할 수 있어 ByteBuffer형식으로 메모리를 생성한다.

ByteBuffer wheader = ByteBuffer.allocate(30);

ByteBuffer wbody = ByteBuffer.allocate(30);

ByteBuffer[] wbuffers = { wheader, wbody };

//생성한 메모리에 2군데에 각각 값을 입력한다.

wheader.put("header is hello world".getBytes());

wbody.put("body is welcome to channel".getBytes());

//메모리에 값을 입력하면 buffer가 가지고 있는 내부 position 값이 변해서 0으로 초기화 시킨다.

wheader.flip();

wbody.flip();

//채널 클래스로 디스크 파일에 직접 입력하고 닫는다.

gchannel.write(wbuffers);

gchannel.close();


[파일 읽는 방법]

position 0~2까지 순차적으로 데이터가 10, 11, 12를 넣는다. 이때 position의 위치도 바뀐다.

//디스크에 test.txt 파일을 읽고 채널 형식으로 변환한다.

FileInputStream fin = new FileInputStream("test.txt");

ScatteringByteChannel schannel = fin.getChannel();

//nio는 byte단위로만 사용할 수 있어 ByteBuffer형식으로 메모리를 생성한다.

ByteBuffer rheader = ByteBuffer.allocateDirect(10);

ByteBuffer rbody = ByteBuffer.allocateDirect(10);

ByteBuffer[] rbuffers = { rheader, rbody };

//파일의 내용을 채널을 통해 버퍼에 담는다.

int readCount = (int) schannel.read(rbuffers);

System.out.println("cnt : " + readCount );

schannel.close();

//각 데이터 버퍼의 positon 값이 변동 되어 0으로 초기화 한다.

rheader.flip();

rbody.flip();

//byte 버퍼로 부터 byte값을 얻어오기 위해 byte 형식으로 메모리 생성

byte[] byteHeaderBuffer = new byte[10];

byte[] byteBodyBuffer = new byte[10];

//각 버퍼에서 데이터를 얻어온다.

rheader.get(byteHeaderBuffer);

rbody.get(byteBodyBuffer);

//byte를 스트링 형식으로 변환해 출력한다.

System.out.println("header : " + new String(byteHeaderBuffer));

System.out.println("body : " + new String(byteBodyBuffer));



반응형

ByteBuffer 사용법



ByteBuffer 사용법에 대해 알아보겠다. 이렇게 ByteBuffer를 자세히 설명하는 이유는 java에서 NIO를 이용하기 위해서다. 보통 자바가 C에 비에 느린 이유중 하나가 IO가 JVM 내부에 IO버퍼를 두었기 때문이다. 


ByteBuffer 초기화와 사용법



[전체 예제]

import java.nio.ByteBuffer;


public class NioBuffer1 {


public static void main(String[] args) {

ByteBuffer buf = ByteBuffer.allocate(10);

System.out.println("position[" + buf.position() +"] Limit["+ buf.limit()+"] Capacity["+buf.capacity()+"]" );

buf.mark(); //나중에 찾아 오기 위해 현재 위치를 지정해 둔다. (현재 위치는 0 )

//순차적으로 데이터 넣기 -> 데이터를 넣을 때 마다 position이 바뀐다.

buf.put((byte)10);

System.out.println("put result -> position[" + buf.position() +"]");


buf.put((byte)11);

System.out.println("put result -> position[" + buf.position() +"]");

buf.put((byte)12);

System.out.println("put result -> position[" + buf.position() +"]");

//mark 해 두었던 위치로 이동

buf.reset();

System.out.println("put reset -> position[" + buf.position() +"]");

System.out.println("");

System.out.println("데이터 들어간 결과 확인");

//데이터를 get 할 때 마다 position이 바뀐다.

for( int i = 0 ; i < 5 ; i++ ) {

System.out.println("position[" + buf.position() +"] value["+ buf.get() + "]");

}

//지정한 위치에 데이터에 넣기

buf.put(2, (byte)22);

buf.put(3, (byte)23);

buf.put(4, (byte)24);

System.out.println("");

System.out.println("데이터 들어간 결과 확인");

for( int i = 0 ; i < 5 ; i++ ) {

System.out.println("position[" + i +"] value["+ buf.get(i) + "]");

}

}

}


[실행 결과]

position[0] Limit[10] Capacity[10]

put result -> position[1]

put result -> position[2]

put result -> position[3]

put reset -> position[0]


데이터 들어간 결과 확인

position[0] value[10]

position[1] value[11]

position[2] value[12]

position[3] value[0]

position[4] value[0]


데이터 들어간 결과 확인

position[0] value[10]

position[1] value[11]

position[2] value[22]

position[3] value[23]

position[4] value[24]


[메모리 크기 설정 및 초기화 된 값 확인]

10자리 byte 만큼 메모리 공간 확보

ByteBuffer buf = ByteBuffer.allocate(10);

System.out.println("position[" + buf.position() +"] Limit["+ buf.limit()+"] Capacity["+buf.capacity()+"]" );


[순차적으로 데이터 넣기]

position 0~2까지 순차적으로 데이터가 10, 11, 12를 넣는다. 이때 position의 위치도 바뀐다.

buf.put((byte)10);

System.out.println("put result -> position[" + buf.position() +"]");


buf.put((byte)11);

System.out.println("put result -> position[" + buf.position() +"]");

buf.put((byte)12);

System.out.println("put result -> position[" + buf.position() +"]");


[순차적으로 데이터 빼기]

position 0~4까지 순차적으로 데이터가 뺀다. 이때 position의 위치도 바뀐다.

for( int i = 0 ; i < 5 ; i++ ) {

System.out.println("position[" + buf.position() +"] value["+ buf.get() + "]");

}


[특정 위치에 데이터 넣기]

position 2에는 22, 3에는 23, 4에는 24를 넣는다. 

buf.put(2, (byte)22);

buf.put(3, (byte)23);

buf.put(4, (byte)24);


[특정 위치에 데이터 빼기]

position 0~4까지 데이터가 뺀다. 

for( int i = 0 ; i < 5 ; i++ ) {

System.out.println("position[" + i +"] value["+ buf.get(i) + "]");

}


반응형

파일 읽고 쓰기 사용법



java 프로그램을 할 때 파일을 읽고 쓰는법을 설명하겠습니다. 


파일 쓰고 읽기 전체 예제



[전체 예제]

import java.io.*;


public class File {

final static String FILE_NAME = "test.txt";

public static void main(String[] args ) {

//=====================//

//========파일 쓰기=======//

//=====================//

FileWriter fw = null ;

BufferedWriter bw = null;

try{

//파일 쓰기

fw = new FileWriter( FILE_NAME );

bw = new BufferedWriter( fw );

bw.write("Hello World"); //버퍼에 데이터 입력

bw.newLine(); //버퍼에 개행 삽입

bw.write("Welcome to java");

bw.newLine();

bw.flush(); //버퍼의 내용을 파일에 쓰기

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { fw.close(); } catch ( IOException e ) {}

try { bw.close(); } catch ( IOException e ) {}

}

//=====================//

//========파일 읽기=======//

//=====================//

FileReader rw = null ;

BufferedReader br = null;

try{

//파일 읽기

rw = new FileReader( FILE_NAME );

br = new BufferedReader( rw );


//파일을 한줄 씩 읽기

String readLine = null ;

while( ( readLine =  br.readLine()) != null ){

    System.out.println(readLine);

}

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { rw.close(); } catch ( IOException e ) {}

try { br.close(); } catch ( IOException e ) {}

}

}

}


[실행 결과]

Hello World

Welcome to java


[메모장으로 파일 열었을 때]

eclipse에서 실행 하면 bin 폴더 상위에 파일이 생성 됩니다.

Hello World

Welcome to java



파일을 쓰는 방법



[import 목록]

import java.io.*;

java.io 패키지에 있는 모든 클래스를 import 합니다.


[파일 쓰는 예제]

//=====================//

//========파일 쓰기=======//

//=====================//

FileWriter fw = null ;

BufferedWriter bw = null;

try{

//파일 쓰기

fw = new FileWriter( "test.txt" );

bw = new BufferedWriter( fw );

bw.write("Hello World"); //버퍼에 데이터 입력

bw.newLine(); //버퍼에 개행 삽입

bw.write("Welcome to java");

bw.newLine();

bw.flush(); //버퍼의 내용을 파일에 쓰기

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { fw.close(); } catch ( IOException e ) {}

try { bw.close(); } catch ( IOException e ) {}

}


[파일 쓰기 준비 동작]

FileWriter fw = null ;

BufferedWriter bw = null;

try{

fw = new FileWriter( "test.txt" ); <- 생성할 파일 명을 넣어 줍니다. <- eclipse에서 실행 하면 bin 폴더 상위에 파일이 생성 됩니다.

bw = new BufferedWriter( fw );  <- 파일을 쓸 때는 버퍼를 이용한다.

...


[버퍼에 파일 쓰기]

bw.write("Hello World"); //버퍼에 데이터 입력

bw.newLine(); //버퍼에 개행 삽입


[버퍼에 있는 내용 파일에 쓰기]

bw.flush(); //버퍼의 내용을 파일에 쓰기


파일을 읽는 방법



[import 목록]

import java.io.*;

java.io 패키지에 있는 모든 클래스를 import 합니다.


[파일 읽는 예제]

//=====================//

//========파일 읽기=======//

//=====================//

FileReader rw = null ;

BufferedReader br = null;

try{

//파일 읽기

rw = new FileReader( FILE_NAME );

br = new BufferedReader( rw );


//파일을 한줄 씩 읽기

String readLine = null ;

while( ( readLine =  br.readLine()) != null ){

    System.out.println(readLine);

}

}catch ( IOException e ) {

System.out.println(e);

}finally{

try { rw.close(); } catch ( IOException e ) {}

try { br.close(); } catch ( IOException e ) {}

}


[파일 읽기 준비 동작]

FileReader rw = null ;

BufferedReader br = null;

try{

//파일 읽기

rw = new FileReader( "text.txt"); <- 앞에서 파일을 생성했기 때문에 해당 파일이 존재 함

br = new BufferedReader( rw ); <- 버퍼를 이용해서 파일을 읽는다.

...


[버퍼를 이용한 파일읽기]

String readLine = null ;

while( ( readLine =  br.readLine()) != null ){  //버퍼 기능인 한줄 씩 읽기 함수를 이용해 파일 내용을 읽어 출력한다.

    System.out.println(readLine);

}



반응형

'프로그램 > Java' 카테고리의 다른 글

[java] NIO를 이용한 파일 쓰고 읽기  (0) 2018.06.05
[java] ByteBuffer 사용법  (0) 2018.06.03
[java] 스레드 사용법  (0) 2018.05.27
[java] 함수 가변 인자 사용 방법  (0) 2018.05.25
[java] Random 사용법  (0) 2018.05.24

+ Recent posts