Java로 텍스트 파일 읽기

버퍼 방식으로 사용하여 빠르게 텍스트 파일을 읽는 예제 코드입니다. 제가 Java 아재라서, 새로운 Java의 더욱 효과적인 파일 읽기 API가 분명 있을것 같은데.. 혹 있다면 추천 부탁드리겠습니다.

package tst;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class MainEntry {
	public static void main(String[] args) {
		String filePath = "D:\\__Data__\\DXF\\1_5000\\NGII_DTM_5000_울산_남구_35905\\35905090.dxf";

		FileInputStream fs = null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		
		try {
			long startTime = System.currentTimeMillis();
			
			fs = new FileInputStream(filePath);
			isr = new InputStreamReader(fs, "euc-kr");
			br = new BufferedReader(isr);
			
			String line = null;
			while((line = br.readLine()) != null) {
				//System.out.println(line);
			}
			
			long finishTime = System.currentTimeMillis();
			System.out.println("소요시간: " + (finishTime - startTime) + " ms");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(br != null) br.close();
				if(isr != null) isr.close();
				if(fs != null) fs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

위의 코드로 7.52MB 크기의 파일을 모두 읽는데, 약 0.13초정도 소요됩니다. 사용하고 있는 개발 환경은 i7-6700HQ@2.60GHz의 RAM 16GB 노트북입니다.

Python에서 외부 데이터 파일 읽기

파이썬에서 다양한 데이터 파일을 읽어오는 코드를 정리한 글로 추후 빠르게 참조하기 위한 목적으로 작성 되었습니다.

CSV 파일 읽기

import csv

rows = []
with open('../data/fileName.csv') as csvfile:
    csvreader = csv.reader(csvfile)
    next(csvreader, None)
    for row in csvreader:
        rows.append(row)

3번의 next 함수는 csv 파일의 첫줄에 있는 필드명을 건너뛰기 위함입니다. rows에 데이터가 저장됩니다.

JSON 파일 읽기

import json

with open('../data/fileName.json') as jsonfile:
    data = json.load(jsonfile)
    value_plainType = data["key1"]
    value_arrayType = data["key2"]
    value_dictionaryType = data["key3"]

    print(value_plainType)
    print(value_arrayType)
    print(value_dictionaryType["name"])

위의 fileName.json 파일의 내용이 다음과 같을때..

{
    "key1" : "string/numeric/bool",
    "key2" : [1, 2, 3, 4, 5],
    "key3" : { "name":"DoWise", "age": 12 }
}

출력 결과는 다음과 같습니다.

string/numeric/bool
[1, 2, 3, 4, 5]
DoWise

vi 편집기 명령 정리

이 글은 콘솔 환경에서 텍스트를 편집할 수 있는 vi 편집기 사용을 위해 요약한 글로 vi를 처음 접하는 분들은 다른 글을 참조하시기 바랍니다.

vi는 총 4가지 상태를 가지며 다음과 같은 상태 전환이 이루어집니다.

EX 모드

  • 변경된 내용 저장 w
  • 변경된 내용 저장하고 종료 wq
  • 변경된 내용 무시하고 종료 q!
  • 종료 q
  • 문자열 검색(예: boy) /boy
    • 다음 검색 문자열 n
    • 이전 검색 문자열 N
  • 문자열 변경(예: boy를 guy로 변경) %s/boy/guy/ig
  • 줄 번호 표시 set nu
  • 줄 번호 감추기 set nonu

명령 모드

  • 현재 커서 위치에서 편집 모드로 전환 i
  • 현재 커서 위치 줄의 첫문자 위치에서 편집 모드로 전환 I
  • 현재 커서의 바로 뒤에서 편집 모드로 전환 a
  • 현재 커서 위치 줄의 마지막 위치에서 편집 모드로 전환 A
  • 왼쪽으로 커서 위치 이동 h, ←
  • 오른쪽으로 커서 위치 이동 l, →
  • 위쪽으로 커서 위치 이동 k, ↑
  • 아래쪽으로 커서 위치 이동 j, ↓
  • 다음 단어 단위로 커서 이동 w
  • 이전 단어 단위로 커서 이동 b
  • 커서 위치 라인의 첫 문자로 이동 ^, 0
  • 커서 위치 라인의 끝 문자로 이동 $
  • 마지막 라인으로 이동 G
  • 100번째(1부터 시작) 라인으로 이동 100G
  • 편집된 내용 되돌리기 u
  • 커서 위치 한글자 삭제 x
  • 커서 위치를 포함해 세 글자 삭제 3x
  • 커서 앞의 글자 삭제 X
  • 커서 위치의 단어 단위로 삭제 dw
  • 커서 위치 줄 삭제 dd
  • 커서 위치의 줄을 포함해 세 줄 삭제 3dd
  • 커서 앞의 글자 삭제 X
  • 커서 위치에서 줄 끝 문자까지 삭제 D
  • 커서 위치의 줄을 버퍼에 복사 yy
  • 커서 위치의 줄을 포함해 세 줄을 버퍼에 복사 3yy
  • 버퍼에 복사된 문자열을 커서 위치에 붙여넣기 p
  • 버퍼에 복사된 문자열을 커서의 앞 위치에 붙여넣기 P
  • 한 글자만 수정 r
  • 커서 다음 위치에 빈줄 추가 o
  • 커서 이전 위치에 빈줄 추가 O
  • 커서 위치의 라인과 다음 라인을 한 라인으로 붙임 J

비주얼 모드

  • 글자 단위로 선택(명령모드에서 전환시) v
  • 라인 단위로 선택(명령모드에서 전환시) V
  • 블럭 단위로 선택(명령모드에서 전환시) ^v
  • 선택된 텍스트를 버퍼에 복사 y
  • 선택된 텍스트를 삭제 d, x

티베로(Tibero)의 Sequence 기능

Sequence는 국어로 표현하면 연속값 정도.. 하지만 시퀀스라고 이야기한다. 시퀀스는 DBMS 차원에서 유일한 정수 값이 필요할 때 사용된다. 티베로는 오라클의 SQL 구문과 매우 유사하다. 오라클을 이미 알고 있다면 쉽게 티베로도 사용할 수 있다. 그러므로 티베로의 Sequence와 관련된 내용은 모두 오라클의 그 것과 매우 유사하거나 동일하다.

먼저 시퀀스를 생성하는 구문이다.

CREATE SEQUENCE TEST_SEQ
MINVALUE 1 -- 기본값은 1
MAXVALUE 10 -- 기본값은 1E+28
NOCYCLE -- CYCLE로 지정되면 값이 최대값을 넘을 서면 다시 값은 최소값에서 시작됨, 기본값은 NOCYCLE로 값이 최대값을 넘어가면 에러 발생
NOCACHE;  -- 내부 메모리에 값을 캐시하는 것에 대한 설정으로 기본값은 NOCACHE이며 캐시하지 않은다는 의미

위의 구문 중 NOCACHE 옵션에 대한 부연 설명을 하면, 만약 아래처럼 CACHE 값을 지정했다고 하자.

CREATE SEQUENCE TEST_SEQ
CACHE 10;

시퀀스의 캐쉬 기능은 시퀀스 값을 더 빨리 생성하기 위해 원하는 개수만큼 미리 생성해 두게 된다. 위의 구문의 경우 미리 10개의 값을 생성해 두게 되고, NEXTVAL 함수를 통해 시퀀스 값을 생성할 때 미리 생성된 시퀀스 값을 빠르게 제공하게 된다. 문제는 미리 생성된 시퀀스 값들이 다 사용되지 못할지라도 다음의 시퀀스 값은 미리 생성된 값 다음 값이 사용된다는 점이다.

시퀀스가 생성되었다면, 시퀀스 값을 다음 구문으로 얻어올 수 있다.

SELECT TEST_SEQ.NEXTVAL FROM DUAL;

위의 구문을 통해 1이 얻어진다. 동일한 구문을 계속 실행하면 2, 3, 4, 5 등이 얻어지는 식이다. 여기서 DUAL 테이블은 임시 논리테이블로 어떤 함수의 사용법을 확인하기 위한 용도 등에 사용할 수 있다. 예를들어 함수의 사용을 확인하기 위해 테이블이 지정이 필요할때, 마땅이 지정할 테이블이 없을 경우 DAUL 테이블을 지정할 수 있다. (근데 왜 이름이 DAUL인지..)

NEXTVAL을 통해 매번 새로운 시퀀스 값을 얻는데, 새로운 값이 아닌 현재의 시퀀스 값을 확인하기 위한 구문은 다음과 같다.

SELECT TEST_SEQ.CURRVAL FROM DUAL;

시퀀스를 제거하는 구문은 다음과 같다.

DROP SEQUENCE TEST_SEQ;

마지막으로 생성된 시퀀스의 정보를 조회하는 구문은 다음과 같다.

SELECT * FROM ALL_SEQUENCES WHERE SEQUENCE_NAME = 'TEST_SEQ';

티베로에서 직접 위의 구문을 수행해 보면 다음과 같은 결과를 볼 수 있다. 환경에 따라 값이 달라질 수 있다.