'분류 전체보기'에 해당되는 글 178건

  1. 2008.10.08 [oracle]Physical IO가 많은 상위 10개 테이블 조회하기
  2. 2008.10.08 [oracle]유용한 스크립트
  3. 2008.10.08 [ORACLE]날짜 계산 SQL문
  4. 2008.10.08 jsp에서 autoFlush 관련 확인 방법
  5. 2008.10.08 jsp 직접실행 막는 방법
  6. 2008.10.08 헥사 뷰어 만들기 예제
  7. 2008.10.08 한글 십육진수 상호 변환 예제
  8. 2008.10.08 텍스트 파일 생성 예제
  9. 2008.10.08 자바로 텍스트 파일 읽기 예제
  10. 2008.10.08 이진 파일, 이진 모드로 열어서 읽기 예제
2008. 10. 8. 15:25

[oracle]Physical IO가 많은 상위 10개 테이블 조회하기

physical I/O가 많은 상위 10개 테이블 조회하기
 
select table_name,total_phys_io
from ( select owner||'.'||object_name as table_name,
               sum(value) as total_phys_io
         from   v$segment_statistics
         where  owner!='SYS' and object_type='TABLE'
 and  statistic_name in ('physical reads','physical reads direct',
                         'physical writes','physical writes direct')
         group by owner||'.'||object_name
         order by total_phys_io desc)
 where rownum <=10;
2008. 10. 8. 15:23

[oracle]유용한 스크립트

lock 걸린 테이블 및 유저찾기
 
column username format a10
column lockwait format a10
column sql_text format a80
column object_owner format a14
column object format a15
select b.username username, c.sid sid, c.owner object_owner,
c.object object, b.lockwait, a.sql_text SQL
from v$sqltext a, v$session b, v$access c
where a.address=b.sql_address
and a.hash_value=b.sql_hash_value
and b.lockwait = 'WAIT'
and b.sid = c.sid
and c.owner != 'SYS';
 
리소스를 많이 차지 하는 sql찾기
 
1) 총 메모리 사용량이 많은 SQL (상위 N개)
SELECT BUFFER_GETS,DISK_READS,EXECUTIONS,SQL_TEXT
FROM (SELECT BUFFER_GETS,DISK_READS,EXECUTIONS,SQL_TEXT
FROM V$SQLAREA
ORDER BY BUFFER_GETS DESC )
WHERE ROWNUM <= :p_rank

2) 평균 메모리 사용량이 많은 SQL (상위 N개)
SELECT BUFFER_GETS,DISK_READS,
EXECUTIONS,BUFFER_PER_EXEC,SQL_TEXT
FROM ( SELECT BUFFER_GETS,DISK_READS, EXECUTIONS,
BUFFER_GETS/DECODE(EXECUTIONS,0,1,EXECUTIONS) BUFFER_PER_EXEC,
SQL_TEXT
FROM V$SQLAREA
ORDER BY BUFFER_GETS/DECODE(EXECUTIONS,0,1,EXECUTIONS) DESC )
WHERE ROWNUM <= :p_rank

3) 메모리, 디스크 사용량이 일정 기준치를 넘은 SQL
SELECT BUFFER_GETS,DISK_READS,
EXECUTIONS,BUFFER_GETS/EXECUTIONS,SQL_TEXT
FROM V$SQLAREA
WHERE BUFFER_GETS > :p_val1
OR DISK_READS > :p_val2
OR EXECUTIONS > :p_val3
 
실행중인 쿼리 보기
 
select s.sid, s.username username, s.osuser, s.program, a.sql_text SQL
from v$sqltext a, v$session s
where a.address = s.sql_address
and a.hash_value = s.sql_hash_value
 
출처 : http://blog.empas.com/goldenant
 
 
테이블이 사용중인 블록 크기를 계산해주는 SQL

/*
** Table이 사용하는 블럭 크기를 구하는 스크립트... <<박제용>>
**
** 사용법 : 1) DBA 권한으로 로그인한다.
** 2) SQL> @tab_block [table명]
**
** Notice : sum(blocks)는 사용하는 블럭의 갯수이며 사이즈는 db_block_size를
** 곱하여 얻을 수 있다.
*/
SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME, SUM(BLOCKS)
FROM DBA_EXTENTS
WHERE SEGMENT_NAME = UPPER('&1')
GROUP BY OWNER, TABLESPACE_NAME, SEGMENT_NAME
/

이미 컴파일된 프로시져소스를 보고싶을 때 사용하는 스크립트

/*
** PL/SQL 소스를 보기위한 스크립트.. <박제용>
**
** 사용법 : find_plsql [프로시져명칭]
**
**
*/
select text
from user_source
where name = upper('&1')
order by line;

테이블을 복사해주는 스크립트 (v8.0 only)

/*
** table을 다른 스키마 혹은 table로 복사 <<박제용>>
**
** Notice) 1. Oracle 8.0 이상에서만 지원.
** 2. sql*net 이 설정되어 있어야만 한다.
** 3. 테이블과 PK만 복사하고 인덱스는 모두 다시 생성해주어야 한다.
** 따라서 테이블을 생성해 주고 입력하는것이 좋다.
** 4. sql*plus 에서만 실행된다.
** 사용법) @tab_copy scott/tiger@link source_table_name target_table_name
**
*/
copy from &1 create &3 using select * from &2

/* 다른 DB로 복사할때는
copy from &1 to &2 create &4 using select * from &3
*/

/* 미리 만들어진 table에 입력할때는
copy from &1 insert &3 using select * from &2
*/

Table Data Size를 정확히 계산해주는 스크립트

/*
** Table Data Size를 정확히 계산해주는 스크립트. <<박제용>>
**
** 사용법 : @tab_size [table_name]
**
*/
analyze table &1 delete statistics;
analyze table &1 compute statistics;

SELECT GREATEST(4, ceil(NUM_ROWS/
( (round(((1958-(INI_TRANS*23))*((100-PCT_FREE)/100))/AVG_ROW_LEN)))) * 2048) TableSize_Kbytes
FROM user_tables
WHERE table_name = upper('&1');

dead lock이 발생했을때 발생시킨 유저와 SQL문을 찾아주는 SQL

/*  
**  
**  사용법   :SQL> @find_deadlock
**  Description : 데드락이 발생할 경우 locking 된 유저와 sql문을 보여준다.
**  
**  데드락이 발생한 유저를 kill 하려면.
** Alter system kill session '{serial#},{SID}';
**
*/
Select a.serial#, a.sid, a.username, b.id1, c.sql_text
from v$session a, v$lock b, v$sqltext c
where b.id1 in( select distinct e.id1 from v$session d, v$lock e
where d.lockwait = e.kaddr)
and a.sid = b.sid
and c.hash_value = a.sql_hash_value
and b.request = 0;

딕셔너리에서 해당 키워드에 관한 뷰, 테이블을 찾아주는 SQL

/*
** 딕셔너리로부터 입력한 키워드에 관한 테이블명을 조회한다. <<박제용>>
**
** 사용법 : SQL> @dic_find [키워드(대소문자가림)]
**
*/
col TABLE_NAME format a15
col COMMENTS format a100

select * from dictionary
where COMMENTS like ('%&1%')
/

컬럼명만 가지고 테이블과 설정상태를 찾아주는 SQL

/*
** 컬럼의 스펙과, 소속 테이블을 찾는다. <<박제용>>
**
** 사용법 : SQL> @col_find [컬럼명]
**
*/
col CNAME format a20
col COLTYPE format a10
col NULLS format a5
col DEFAULTVAL format a10

select TNAME, COLNO, CNAME, COLTYPE, WIDTH, NULLS, DEFAULTVAL
from col
where CNAME = UPPER('&1')
/

Constraint 이름으로 해당 테이블과 컬럼찾는 SQL

/*
**=============================================
** CONSTRAINT 이름으로 사용 테이블 찾기
**=============================================
**
** Usage : @Show_Columns Constraint_Name
** Description : Shows The Columns Bound By A Constraint
** 사용예 : SQL> @show_Columns PK_EMPNO
*/
SET VERIFY OFF
CLEAR BREAK
BREAK ON CONSTRAINT_NAME ON TABLES

SELECT SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME,
SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,15) COL_NAME
FROM ALL_CONS_COLUMNS
WHERE CONSTRAINT_NAME = UPPER('&1');

컬럼에 걸려있는 constraint 를 보여주는 SQL

/*
**=======================================
** 해당 COLUMN에 걸려 있는 CONSTRAINT확인
**=======================================
**
** Usage : @Show_Constraints Table_Name Column_Name
**
** Description : 해당 Table의 Column에 걸려 있는 Constraint를 보여준다.
**
** < 실행 예 >
** SQL> @SHOW_CONSTRAINTS WIDGETS LENGTH
**
*/

SET VERIFY OFF
CLEAR BREAK
BREAK ON TABLES ON COL_NAME
SELECT SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,15) COL_NAME,
SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = UPPER('&1')
AND COLUMN_NAME = UPPER('&2');

PK와 FK간의 연관관계를 찾아 보여주는 SQL

/*  
**  
**  사용법     :> @Show_Positions  Parent_Table  Child_Table  
**  Description  :  Shows Primary And Foreign Key Positions  
**  
**  WARNING   :  이 문장은 해당 Table의 Constraint생성시 Naming   
**          Convention을 따른 경우에 적용되도록 되어 있다.  
**
*/
SET VERIFY OFF  
CLEAR BREAK  
BREAK ON CONSTRAINT_NAME ON TABLES
SELECT SUBSTR(CONSTRAINT_NAME,1,27) CONSTRAINT_NAME,
SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,15) COL_NAME,
SUBSTR(POSITION,1,3) POSITION,
SUBSTR(OWNER,1,7) OWNER
FROM USER_CONS_COLUMNS WHERE TABLE_NAME = UPPER('&1') AND CONSTRAINT_NAME LIKE 'PK%'
UNION
SELECT SUBSTR(CONSTRAINT_NAME,1,27) CONSTRAINT_NAME,
SUBSTR(TABLE_NAME,1,15) TABLES,
SUBSTR(COLUMN_NAME,1,25) COL_NAME,
SUBSTR(POSITION,1,3) POSITION,
SUBSTR(OWNER,1,7) OWNER
FROM USER_CONS_COLUMNS WHERE TABLE_NAME = UPPER('&2') AND CONSTRAINT_NAME LIKE 'FK%'
ORDER BY 1 DESC,4 ASC;

테이블의 특정 컬럼에 중복된 값을 찾는 SQL

/*
**=============================================
** 중복된 값 있는지 찾기
**=============================================
** Usage : @중복찾기.sql [테이블명] [중복을조사할컬럼명]
**
** Warning : 똑같은값이 2개 이상있을때 처음값은 출력 않되고 2번째 값부터 출력됨. <>
*/

select * from &1 A
where rowid >
(SELECT min(rowid) FROM &1 B
WHERE B.&2 = A.&2)
order by &2;
 

2008. 10. 8. 15:22

[ORACLE]날짜 계산 SQL문

날짜 계산 SQL   조회(336)
 
Database | 2004/12/22 (수) 13:42   공감하기(0)  | 스크랩하기(1) 
 
 

날짜 계산 SQL

select months_between(sysdate,to_date('2002-12-22','yyyy-mm-dd'))
-- months_between(A,B) = A-B/30
--select add_months(sysdate,4) -- 특정일의 달수 더한 날
--select next_day(sysdate,'friday') -- 특정일의 다음주 요일
--select last_day(sysdate) -- 특정일의 해당 월의 마지막 날
--select round(sysdate,'dd') -- 특정일의 반올림(오후면 다음날..)
--select trunc(sysdate,'ww') -- 특정일의 주 첫일 찾기
from dual

날짜계산

/* 어제 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE-1)+0.99999421
/* 오늘 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999421
/* 내일 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+1) AND TRUNC(SYSDATE+1)+0.99999421
/* 금주 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'D')
AND TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'D')+6.99999421
/* 차주 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+8)-TO_CHAR(SYSDATE, 'D')
AND TRUNC(TRUNC(SYSDATE)+14.99999421)-TO_CHAR(SYSDATE, 'D')
/* 금월 */ 날짜칼럼 BETWEEN TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'DD')
AND TRUNC(LAST_DAY(SYSDATE))+0.99999421
/* 전월 */ 날짜칼럼 BETWEEN TRUNC(ADD_MONTHS(SYSDATE,-1)+1)-TO_CHAR(SYSDATE,'DD')
AND TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -1)))+0.99999421
/* 차월 */ 날짜칼럼 BETWEEN ADD_MONTHS(TRUNC(SYSDATE),1)-TO_CHAR(SYSDATE,'DD')+1
AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),1)+0.99999421)

# 특정일 까지의 간격을 년, 개월, 일로 표현하기

SELECT
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD'))/12) "년",
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD'))/12) * 12) "개월",
TRUNC((MONTHS_BETWEEN(SYSDATE,TO_DATE('19970101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19970101', 'YYYYMMDD')))) * 30.5) "일"
FROM DUAL;

SELECT
'20040511' as "날짜"
, ceil((to_number(substrb('20040511', -2, 2)) + 7 - to_number(TO_CHAR(TO_DATE('20040511','YYYYMMDD'),'D')))/7) as "월별 주차"
from dual;

출처 : http://blog.empas.com/goldenant/5485949

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>