'java'에 해당되는 글 7건

  1. 2008.10.08 jsp에서 autoFlush 관련 확인 방법
  2. 2008.10.08 jsp 직접실행 막는 방법
  3. 2008.10.08 헥사 뷰어 만들기 예제
  4. 2008.10.08 한글 십육진수 상호 변환 예제
  5. 2008.10.08 텍스트 파일 생성 예제
  6. 2008.10.08 자바로 텍스트 파일 읽기 예제
  7. 2008.10.08 이진 파일, 이진 모드로 열어서 읽기 예제
2008. 10. 8. 15:21

jsp에서 autoFlush 관련 확인 방법

<%@ page buffer="9kb" autoFlush="true"%>
<%System.out.println("out.getBufferSize() : "+out.getBufferSize());%>
<%System.out.println("out.getRemaining() : "+out.getRemaining());%>
2008. 10. 8. 15:19

jsp 직접실행 막는 방법

spring 이나 struts 같은 프레임웍은 jsp 의 처리를 컨트롤러에 위임하게 된다.

그래서 *.do 같은 형태의 url 로 접근 하도록 만들어 놓은건데.

좀 똑똑한 사용자가 jsp 파일의 경로를 알아서 컨트롤러를 거치지 않고

바로 jsp 에 접근하는게 가능하다.

이것을 막기위해 web.xml 에다가 아래 코드를 추가하면 된다.


 <security-constraint>
  <display-name>JSP Protection</display-name>
  <web-resource-collection>
   <web-resource-name>SecureJSPPages</web-resource-name>
   <url-pattern>*.jsp</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>nobody</role-name>
  </auth-constraint>
 </security-constraint>
 
 <security-role>
  <description>
  Nobody should be in this role so JSP files are protected
  from direct access.
  </description>
  <role-name>nobody</role-name>
 </security-role>


2008. 10. 8. 15:19

헥사 뷰어 만들기 예제

자바로, 헥사 뷰어를 만드는 소스 코드입니다. 파일을 이진모드로 열어서, 16바이트씩 읽어 헥사(16진수)로 변환한 후, 출력합니다.

복잡한 기능은 없고 최대한 간단하게 만든 것입니다. 헥사 뷰어라는 것은, 이상하게도, 조그만 기능 하나만 추가해도, 상당히 복잡하게 되는 측면이 있습니다.


헥사 뷰어 만들기 소스 코드

소스 파일명: Example.java
버전 0.8
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
import java.io.*;

public class Example {
  public static void main(String[] args) throws IOException {

    if (args.length == 0) { // args.length 는 옵션 개수
      System.err.println("Input Filename...");
      System.exit(1); // 읽을 파일명을 주지 않았을 때는 종료
    }

    byte[] buf16 = new byte[16]; // 헥사 값이 16바이트씩, 즉, 한줄씩 저장될 버퍼
    int offset = 0; // 번지
    int buf16Len;   // 한줄에 들어있는 헥사 값의 개수, 즉, 길이
    DataInputStream in = new DataInputStream(new FileInputStream(args[0]));

    while ((buf16Len = in.read(buf16)) > 0) {
      System.out.format("%08X:  ", offset); // Offset (번지) 출력

      // 헥사 구역의 헥사 값 16개 출력 (8개씩 2부분으로)
      for (int i = 0; i < buf16Len; i++) {
        if (i == 8) System.out.print(" ");    // 8개씩 분리
        System.out.format("%02X ", buf16[i]); // 헥사 값 출력
      }

      // 한 줄이 16 바이트가 되지 않을 때, 헥사 부분과 문자 부분 사이에 공백들 삽입
      for (int i = 0; i <= (16 - buf16Len) * 3; i++)
        System.out.print(" ");
      if (buf16Len < 9) System.out.print(" "); // 한줄이 9바이트보다 적을 때는 한칸 더 삽입


      // 문자 구역 출력
      for (int i = 0; i < buf16Len; i++) {
        if (buf16[i] >= 0x20 && buf16[i] <= 0x7E) // 특수 문자 아니면 출력
          System.out.format("%c", buf16[i]);
        else System.out.print("."); // 특수문자, 그래픽문자 등은 마침표로 출력
      }

      offset += 16; // 번지 값을 16 증가
      System.out.println(); // 줄바꿈
    }

    if (offset == 0) System.out.format("%08X:  ", offset); // 0바이트 파일일 경우 처리
    in.close();
  }
}
컴파일 및 실행 결과 화면:
D:\Z>javac Example.java

D:\Z>java Example
Input Filename...

D:\Z>java Example test.bin
00000000:  4D 5A 90 20 03 20 20 20  04 20 20 20 FF FF 20 20  MZ. .   .   ..
00000010:  B8 20 20 20 20 20 20 20  40 20 20 20 20 20 20 20  .       @
00000020:  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20
00000030:  20 20 20 20 20 20 20 20  20 20 20 20 D0 20 20 20              .
00000040:  0E 1F BA 0E 20 B4 09 CD  21 B8 01 4C CD 21 54 68  .... ...!..L.!Th
00000050:  69 73 20 70 72 6F 67 72  61 6D 20 63 61 6E 6E 6F  is program canno
00000060:  74 20 62 65 20 72 75 6E  20 69 6E 20 44 4F 53 20  t be run in DOS
00000070:  6D 6F 64 65 2E 0D 0D 0A  24 20 20 20 20 20 20 20  mode....$
00000080:  64 C7 F9 7C 20 A6 97 2F  20 A6 97 2F 20 A6 97 2F  d..| ../ ../ ../
00000090:  E3 A9 CA 2F 23 A6 97 2F  20 A6 96 2F 77 A6 97 2F  .../#../ ../w../
000000A0:  07 60 EA 2F 30 A6 97 2F  07 60 FA 2F 49 A6 97 2F  .`./0../.`./I../
000000B0:  07 60 F9 2F 02 A6 97 2F  07 60 EF 2F 21 A6 97 2F  .`./.../.`./!../
000000C0:  52 69 63 68 20 A6 97 2F  20 20 20 20 20 20 20 20  Rich ../
000000D0:  50 45 20 20 4C 01 03 20  B8 E3 22 46 20 20 20 20  PE  L.. .."F
000000E0:  20 20 20 20 E0 20 03 01  0B 01 08 20 20 B0 20 20      . .....  .
000000F0:  20 50 20 20 20 20 20 20  CF 1C 20 20 20 10 20 20   P      ..   .
00000100:  20 C0 20 20 20 20 40 20  20 10 20 20 20 10 20 20   .    @  .   .
00000110:  04 20 20 20 20 20 20 20  04 20 20 20 20 20 20 20  .       .
00000120:  20 10 01 20 20 10 20 20  20 20 20 20 03 20 20 20   ..  .      .
00000130:  20 20 10 20 20 10 20 20  20 20 10 20 20 10 20 20    .  .    .  .
00000140:  20 20 20 20 10 20 20 20  20 20 20 20 20 20 20 20      .
00000150:  94 D8 20 20 28 20 20 20  20 20 20 20 20 31 31 31  ..  (        111
00000160:  30                                                0

D:\Z>
D:\Z>java Example test.bin > out.txt

D:\Z>
java Example test.bin > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.

2008. 10. 8. 15:17

한글 십육진수 상호 변환 예제

자바는 기본적으로 유니코드를 사용하기에 한글을 다루기에도 편리합니다. 다음과 같은 방법을 사용하면 한글을 16진수 헥사로 상호 변환할 수 있습니다. 단, 여기서의 16진수 코드는 "유니코드 코드 번호"입니다. 한글 완성형의 16진수 코드와는 다릅니다.


한글 <-> 십육진수 바꾸기 (상호 변환)

예제 소스 파일명: Example.java
public class Example {
  public static void main(String[] args) {


    // 한글을 16진수로 변환 출력
    System.out.format("%04X%n", (int) '가');
    // 출력 결과: AC00


    // 16진수를 한글로 변환 출력
    System.out.format("%c%n", (char) 0xAC00);
    // 출력 결과: 가


    // 출력 결과를 화면이 아닌 변수에 저장하여 완전 변환 방법
    String s = String.format("%c", (char) 0xAC00);
    System.out.println(s);
    // 가

  }
}

2008. 10. 8. 15:16

텍스트 파일 생성 예제

자바로, 텍스트 파일을 만들어서, 그 안에 문자열을 쓰고, 저장하는 예제입니다.


텍스트 파일 생성/만들기 예제 소스

소스 파일명: Foo.java
import java.io.*;

public class Foo {
  public static void main(String args[]) {

    try {
      ////////////////////////////////////////////////////////////////
      BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
      String s = "출력 파일에 저장될 이런 저런 문자열입니다.";

      out.write(s); out.newLine();
      out.write(s); out.newLine();

      out.close();
      ////////////////////////////////////////////////////////////////
    } catch (IOException e) {
        System.err.println(e); // 에러가 있다면 메시지 출력
        System.exit(1);
    }

  }
}
위의 자바 소스를 컴파일한 후 실행하면, 하드의 현재 디렉토리에 out.txt 라는 텍스트 파일이 생깁니다.

생성된 out.txt 파일의 내용:
출력 파일에 저장될 이런 저런 문자열입니다.
출력 파일에 저장될 이런 저런 문자열입니다.

참고로, newLine() 이라는 메소드는, 현재 운영체제의 종류를 자동으로 판단한 후, 적절한 개행문자를 출력하여 줄바꿈하는 것입니다.

2008. 10. 8. 15:15

자바로 텍스트 파일 읽기 예제

하드에 있는 텍스트 파일을, 명령행 옵션으로 지정해 주면, 그 파일을 한 줄씩 읽어서 화면에 출력하는 자바 프로그램입니다.

if (args.length == 0) 라는 부분은 읽을 파일명을 지정해 주지 않았을 때 에러 메시지를 출력하는 코드입니다.


자바로 텍스트 파일 읽기 예제 소스

소스 파일명: Foo.java
import java.io.*;

public class Foo {
  public static void main(String args[]) {

    if (args.length == 0) {                   // args.length 는 옵션 개수
      System.err.println("Input Filename...");
      System.exit(1);                         // 읽을 파일명을 주지 않았을 때는 종료
    }

    try {
      ////////////////////////////////////////////////////////////////
      BufferedReader in = new BufferedReader(new FileReader(args[0]));
      String s;

      while ((s = in.readLine()) != null) {
        System.out.println(s);
      }
      in.close();
      ////////////////////////////////////////////////////////////////
    } catch (IOException e) {
        System.err.println(e); // 에러가 있다면 메시지 출력
        System.exit(1);
    }

  }
}
위의 소스에서 빗금 쳐진 구역이, 파일을 읽는 핵심부입니다.

FileReader 는 현재 시스템의 기본 인코딩으로 파일을 읽는데, BufferedReader 로 감싸 주어야 합니다.

readLine() 은 파일을 한 줄씩 읽지만 줄바꿈 문자는 읽지 않습니다. 그래서 println()이 아닌 print(s)로 출력하면 모든 줄이 하나로 붙어서 나옵니다.


0.txt 라는 테스트용 텍스트 파일에, 이육사 시인의 '청포도'라는 시가 적혀 있다고 가정합니다.

javac Foo.java
이렇게 컴파일 한 후

java Foo 0.txt
이렇게 실행시킵니다.


실행 결과:
D:\Z>javac Foo.java

D:\Z>java Foo 0.txt

          청포도


                          이육사


내 고장 칠월은
청포도가 익어 가는 시절

이 마을 전설이 주저리주저리 열리고
먼 데 하늘이 꿈꾸며 알알이 들여와 박혀

하늘 밑 푸른 바다가 가슴을 열고
흰 돛단배가 곱게 밀려서 오면,

내가 바라는 손님은 고달픈 몸으로
靑袍를 입고 찾아온다고 했으니

내 그를 맞아, 이 포도를 따먹으면
두 손은 함뿍 적셔도 좋으련

아이야, 우리 식탁엔 은쟁반에
하이얀 모시 수건을 마련해 두렴


D:\Z>

2008. 10. 8. 15:14

이진 파일, 이진 모드로 열어서 읽기 예제

자바에서, 이진파일을 이진모드로 열어서, 읽는 방법입니다. DataInputStream 클래스의 read() 메소드(함수)를 사용합니다. byte 버퍼의 크기만큼 파일에서 읽어옵니다. (이 예제에서는 버퍼 크기가 1024 바이트임)


이진 파일, 이진 모드로 열어서 읽기 예제 소스

소스 파일명: Example.java
import java.io.*;

public class Example {
  public static void main(String[] args) throws IOException {

    String filename = "test.bin";
    byte[] b = new byte[1024];
    int len; // 실제로 읽어온 길이 (바이트 개수)
    int counter = 0;

    DataInputStream in = new DataInputStream(new FileInputStream(filename));

    while ((len = in.read(b)) > 0) {
      for (int i = 0; i < len; i++) { // byte[] 버퍼 내용 출력
        System.out.format("%02X ", b[i]);
        counter++;
      }
    }


    System.out.format("%n%n%n[%d 바이트를 읽어서 출력]", counter);
    in.close();

    System.out.println(); // 줄 바꾸고 종료
  }
}
이진파일의 각 바이트를 십육진수로 변환한 후, 화면에 출력합니다.

컴파일 및 실행 결과 화면:
D:\Z>javac Example.java && java Example
4D 5A 90 20 03 20 20 20 04 20 20 20 FF FF 20 20 B8 20 20 20 20 20 20 20 40 20 20
 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2
0 20 20 20 20 20 20 D0 20 20 20 0E 1F BA 0E 20 B4 09 CD 21 B8 01 4C CD 21 54 68
69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E 20 69 6E
 20 44 4F 53 20 6D 6F 64 65 2E 0D 0D 0A 24 20 20 20 20 20 20 20 64 C7 F9 7C 20 A
6 97 2F 20 A6 97 2F 20 A6 97 2F E3 A9 CA 2F 23 A6 97 2F 20 A6 96 2F 77 A6 97 2F
07 60 EA 2F 30 A6 97 2F 07 60 FA 2F 49 A6 97 2F 07 60 F9 2F 02 A6 97 2F 07 60 EF
 2F 21 A6 97 2F 52 69 63 68 20 A6 97 2F 20 20 20 20 20 20 20 20 50 45 20 20 4C 0
1 03 20 B8 E3 22 46 20 20 20 20 20 20 20 20 E0 20 03 01 0B 01 08 20 20 B0 20 20
20 50 20 20 20 20 20 20 CF 1C 20 20 20 10 20 20 20 C0 20 20 20 20 40 20 20 10 20
 20 20 10 20 20 04 20 20 20 20 20 20 20 04 20 20 20 20 20 20 20 20 10 01 20 20 1
0 20 20 20 20 20 20 03 20 20 20 20 20 10 20 20 10 20 20 20 20 10 20 20 10 20 20
20 20 20 20 10 20 20 20 20 20 20 20 20 20 20 20 94 D8 20 20 28 20 20 20 20 20 20
 20 20 31 31 31 30


[353 바이트를 읽어서 출력]

D:\Z>