Presentation is loading. Please wait.

Presentation is loading. Please wait.

7장 파일과 데이터베이스.

Similar presentations


Presentation on theme: "7장 파일과 데이터베이스."— Presentation transcript:

1 7장 파일과 데이터베이스

2 개요 File과 java.io패키지 File클래스 FileSystem 클래스 DataBase DB 정렬기법

3 File과 java.io패키지 File 클래스는 파일에 대한 읽기/쓰기와 같은 기본적인 기능과 Stream 기능 지원을 위한 클래스 파일, 키보드(키패드), LCD, 메모리, 네트웍 연결등 다양한 입/출력 형태의 장치에 기록하고 읽어 들이기 위해 각각 장치에 관한 스트림이 존재하며 java.io에는 그와 관련된 작업을 할 수 있게 해주는 클래스가 존재.

4 java.io 패키지 ByteArrayInputStream ByteArrayOutputStream DataInputStream
DataOutputStream InputStream (바이트 입력 스트림을 위한 추상 클래스) InputStreamReader OutputStream (바이트 출력 스트림을 위한 추상 클래스) OutputStreamWriter PrintStream Reader(문자 입력 스트림을 위한 추상 클래스) Writer(문자 출력 스트림을 위한 추상 클래스)

5 File 클래스 파일이름은 모두 절대경로로 되어 있다.
실제로는 플랫폼에서 허용하는 디렉토리안에서 모든 파일을 만들고 지울 수 있다. 사용자입장에서는 플랫폼에서 어떤 식으로 지원하든 상관없이 절대경로로 사용하면 됨 구분자(separator)의 경우 유닉스 시스템의 관행을 따랐으므로 "/"를 사용하면 된다. FileSystem 클래스와 마찬가지로 경로를 지정하는 메소드의 경우 접근 방법에 대한 제한이 있다. 접근방법은 아래와 같은 3가지가 있다. FileSystem.PRIVATE_ACCESS, FileSystem.SHARED_ACCESS, FileSystem.SYSTEM_ACCESS

6 File클래스 주요 생성자 public File(String filename, int mode)
응용프로그램 자신만의 디렉토리에 지정된 파일을 생성한다. public File(String filename, int mode, int flag) 파일을 생성한다. 매개변수 filename 열고자 하는 파일의 절대 경로 mode READ_ONLY, WRITE, WRITE_TRUNC, READ_WRITE flag FileSystem.PRIVATE_ACCESS, FileSystem.SHARED_ACCESS, FileSystem.SYSTEM_ACCESS

7 접근 권한 flag PRIVATE_ACCESS SHARED_ACCESS SYSTEM_ACCESS
응용프로그램 자신만이 접근할 수 있는 디렉토리를 접근하고자 할 때 쓰는 플래그 SHARED_ACCESS 공유할 수 있는 디렉토리를 접근하고자 할 때 쓰는 플래그. 공유하고자 하는 디렉토리는 이미 프로그램이 설치될 때 응용 프로그램 명세 파일에 명시된 데로 지정되며, 사용자가 임의로 공유 디렉토리를 변경할 수는 없다. SYSTEM_ACCESS 시스템 응용프로그램이 사용하는 디렉토리를 접근하고자 할 때 쓰는 플래그. 공유하고자 하는 디렉토리는 이미 프로그램이 설치될 때 응용 프로그램 명세 파일에 명시된 데로 지정되며 사용자가 임의로 공유 디렉토리를 변경할 수는 없다.

8 사용용도 mode READ_ONLY-읽기만 할 때 쓰는 옵션
WRITE_ONLY-기존의 파일이 있으면 파일의 제일 끝부터 쓰기 시작하기 위한 옵션 WRITE_TRUNC-기존의 파일이 있으면 크기를 0으로 만들고 열기 위한 옵션 READ_WRITE-읽기와 쓰기를 동시에 하기 위한 옵션

9 File클래스 주요 method public InputStream openInputStream()
public DataInputStream openDataInputStream() DataInputStream을 가져온다. public OutputStream openOutputStream() OutputStream을 가져온다. public DataOutputStream openDataOutputStream() DataOutputStream을 가져온다. public void close() 파일을 닫다. public int write(int b) 파일에 한 바이트만 쓸 때 사용한다. public int write(byte[] buf) 파일에 buf에 들어 있는 데이타를 buf의 길이만큼 쓴다.

10 public int write(byte[] buf, int off, int len)
파일에 buf에 들어 있는 데이타를 off부터 시작해서 len만큼 쓴다. public int read() input stream으로부터 1바이트를 읽어 들이다. public int read(byte[] buf) input stream으로부터 데이타를 읽어 들이다. public int read(byte[] buf, int off, int len) input stream으로부터 데이타를 len 바이트 수만큼 읽어 들이다. public void seek(int pos) 파일 포인터를 특정 위치로 옮긴다. public int sizeOf() 파일의 크기를 알려준다.

11 예제 7-1

12 FileSystem 클래스 파일에 관련된 생성/삭제/이름 바꾸기와 같은 일반적인 기능을 정의.
모든 파일 또는 디렉토리 경로는 모두 절대적인 경로다. 사용자가 임의로 절대경로를 지정할 수는 없다.

13 FileSystem 클래스 3가지 접근 방식으로만 지정할 수 있고, 그에 따라 시스템에서 절대경로를 지정해 준다.

14 FileSystem 클래스 이 클래스에 있는 메소드는 모두 Static이기 때문에 인스턴스를 생성하지 않아도 된다.
경로를 지정하는 모든 메소드는 접근방식을 지정해야만 한다. 아래는 접근 방식을 지정하는 메소드들이다. exists(java.lang.String, int) isDirectory(java.lang.String, int) isFile(java.lang.String, int) list(java.lang.String, int) mkdir(java.lang.String, int) rmdir(java.lang.String, int) remove(java.lang.String, int) rename(java.lang.String, int)

15 만약 응용프로그램 자신만의 디렉토리에 있는 FileTest라는 파일이 존재하는 지 여부를 알고 싶다면 다음과 같이 할 수 있다.
if (exists("FileTest", PRIVATE_ACCESS)) { System.err.println("FileTest exists"); }; 또는 아래와 같이 지정하지 않을 경우는 기본값으로 자신만의 디렉토리에서 찾게 된다. if (exists("FileTest"))

16 FileSystem클래스 주요 method
public static int getMaxFilenameLength() 사용할 수 있는 파일이름의 최대길이를 확인한다. public static Vector list(String dirname) 응용프로그램 자신만의 디렉토리 안에 있는 파일과 디렉토리를 모두 보여준다. public static Vector list(String dirname, int flag) 지정된 디렉토리 안에 있는 파일과 디렉토리를 모두 보여준다. public static boolean exists(String name) 응용프로그램 자신만의 디렉토리의 파일이나 디렉토리가 존재하는지를 확인한다. public static boolean exists(String name, int flag) 지정된 디렉토리 아래 파일이나 디렉토리가 존재하는 지를 확인한다. public static void remove(String filename) 응용프로그램 자신만의 디렉토리의 파일을 지운다.

17 FileSystem클래스 주요 method
public static void remove(String filename, int flag) 파일을 지운다. public static void mkdir(String dirname) 응용프로그램 자신만의 디렉토리에 디렉토리를 만든다. public static void mkdir(String dirname, int flag) 디렉토리를 만든다. public static void rmdir(String dirname) 응용프로그램 자신만의 디렉토리에 있는 디렉토리를 지운다. public static void rmdir(String dirname, int flag) 디렉토리를 지운다. public static int available() 응용 프로그램이 사용할 수 있는 공간이 얼마나 남았는지 알려준다. public static boolean isFile(String name) 응용프로그램 자신만의 디렉토리에 지정된 이름의 파일이 존재하는지 확인한다.

18 FileSystem클래스 주요 method
public static boolean isFile(String name, int flag) 지정된 이름의 파일이 존재하는지 확인한다. public static boolean isDirectory(String name) 응용프로그램 자신만의 디렉토리에 있는 디렉토리인지를 확인한다. public static boolean isDirectory(String name, int flag) 디렉토리인지를 확인한다. public static int getCreationTime(String name) 응용프로그램 자신만의 디렉토리에 있는 파일의 생성시간을 알아온다. public static int getCreationTime(String name, int flag) 파일의 생성시간을 알아온다. public static void rename(String oldName, String newName) 응용프로그램이 개인 디렉토리 및 하부 디렉토리 내에 있는 파일의 이름을 바꾼다. public static void rename(String oldName, String newName, int flag) 파일 이름을 바꾼다.

19 예제 7.2

20 DataBase 영속적인 데이터를 저장하고, 찾으며, 관리하기 위한 메카니즘을 제공.
Jlet에서 간단한 데이터베이스를 구현하기 위한 클래스. 데이터베이스에는 여러 개의 레코드(데이터)들이 저장되고 또 읽혀질 수 있다.

21 DataBase 실제 레코드는 플랫폼의 영속적인 영역에 저장되어 Jlet이 수행이 종료 되거나, 플랫폼이 다운되더라도 이미 저장된 레코드의 최소한의무결성은 보장. 레코드는 바이트 어레이의 형태로 저장된다. 저장되는 데이터의 의미는 무시된다. 저장된 데이터의 논리적인 의미를 파악하는 것은 사용자의 몫이다. 레코드의 크기는 처음 해당 데이터베이스를 생성할 때 지정한 크기를 초과할 수는 없다.

22 DataBase 각각의 레코드는 데이터베이스 상에서 레코드 ID라는 Integer 값으로 표현.
레코드 ID는 0부터 시작하며 레코드의 삭제가 없는 한 레코드 ID는 레코드를 하나 저장할 때 마다 1씩 증가. 레코드가 중간에 삭제되면 다음 레코드를 저장할 때는 삭제된 레코드 ID를 재사용.

23 DataBase 하나의 Jlet은 여러 개의 데이터베이스를 생성할 수 있다.
Jlet은 자신의 Jlet이 생성한 데이터베이스 모두에 접근이 가능하다. 대부분의 경우 다른 Jlet이 생성한 데이터베이스에 접근할 수는 없다. Jlet이 플랫폼 상에서 지워지면 데이터베이스도 삭제되며, 해당 데이터베이스가 플랫폼의 물리적인 영역에 생성한 자원들(주로 파일)도 동시에 삭제된다. 데이터베이스를 정렬하기 위해서 DataFilter 인터페이스와 DataComparator 인터페이스를 구현해야 한다.

24 데이터 베이스 생성 Public static DataBase openDataBase (String dataBaseName,int recordSize, boolean create) 데이터베이스를 연다.이 데이터베이스는 현재의 Jlet만 접근할 수 있다. 데이터베이스는 FileSystem.PRIVATE_ACCESS 모드로 열린다. public static DataBase openDataBase(String dataBaseName, int recordSize, boolean create, int flag) 데이터베이스를 연다. 현재의 Jlet만 접근할 수 있게 할 것인지, 다른 Jlet과 공유되는 데이터베이스를 열 것인지, 시스템이 제공하는 데이터베이스를 사용할 것인지 flag를 통해 지정할 수 있다. 매개변수 dataBaseName 데이터베이스 이름 recordSize 생성할 데이터베이스의 레코드 하나의 크기(byte단위). create 만약 데이터베이스가 존재하지 않으면 새로 만들 것인지 여부 flag 데이터베이스의 공유 방법을 지정.

25 데이터 베이스 닫기 public void closeDataBase() 데이터베이스를 닫다.

26 데이터 베이스 삭제 public static void deleteDataBase(String dataBaseName)
데이터베이스를 삭제한다. 해당 Jlet이 FileSystem.PRIVATE_ACCESS로 생성한 데이터베이스만 삭제할 수 있다. public static void deleteDataBase(String dataBaseName, int flag) 해당 Jlet이 flag로 접근 가능한 데이터베이스만 삭제 가능하다. 매개변수 dataBaseName 삭제할 데이터베이스 이름 flag 어떤 접근권한에 있는 데이터베이스를 지울 것 인지를 나타냄.

27 레코드 삽입 public int insertRecord(byte[] data, int offset, int numBytes)
새로운 레코드를 데이터베이스에 추가한다. public int insertRecord(byte[] data) 매개변수 data 저장할 데이터가 들어있는 버퍼 offset 버퍼에서 저장할 데이터가 시작되는 첫 번째 바이트 오 프셋 numBytes 저장할 바이트 수

28 레코드 선택 public byte[] selectRecord(int recordId)
public void selectRecord(int recordId, byte[] buffer, int offset)

29 레코드 수정 public void updateRecord(int recordId, byte[] newData, int offset, int numBytes) -특정 레코드의 데이터의 내용을 바꾼다. public void updateRecord(int recordId, byte[] newData) 매개변수 -recordId 데이터 내용을 변경시킬 레코드 ID -newData 새로이 저장할 데이터가 들어있는 버퍼 -offset 버퍼에서 저장할 데이터가 시작되는 첫 번째 바이트 오 프셋 -numBytes 저장할 바이트 수

30 레코드 삭제 public void deleteRecord(int recordId) 레코드를 데이터베이스에서 삭제한다.

31 레코드 정렬 public int[] sortRecord(DataFilter filter, DataComparator comparator) 레코드를 정의한 비교 방법과 제한 조건으로 정렬한다. 매개변수 filter 레코드 제한 조건. null이 될 수 있음 comparator 레코드 비교 방법. null이 될 수 있음

32 DB 정렬기법 비교하여 정렬하기 위한 클래스 필터링 작업을 위한 클래스 DataComparator 인터페이스
DataComparatorInteger 클래스 DataComparatorString 클래스 필터링 작업을 위한 클래스 DataFilter 인터페이스 DataFilterInteger 클래스

33 DataComparator DataComparator는 두 개의 레코드를 비교하는 인터페이스
데이터베이스를 정렬할 때 필요하며 그 때 sortRecord 메쏘드는 이 인터페이스에 있는 compare 메쏘드를 이용하여 데이터베이스의 각 레코드들끼리의 순서를 결정한다. 레코드를 정렬하려면 애플리케이션은 이 인터페이스를 구현해 주어야 한다. 기본적으로 자주 사용되는 정수, 문자열 비교를 위해서는 DataComparatorInteger 클래스, DataComparatorString 클래스를 사용하면 된다. DataComparator인터페이스에는 compare(byte[] data1, byte[] data2) 메소드가 단 하나 존재하며 두 개의 레코드를 인자로 받아서 조건에 맞게 정렬을 한 후 리턴 해주면 된다.

34 DataComparator인터페이스 주요 필드
public static final int EQUIVALENT 레코드 정렬이나 검색 시 파라미터로 받은 두 개의 레코드가 순서상 같다는 의미. public static final int FOLLOWS 레코드 정렬이나 검색 시 파라미터로 받은 첫 번째 레코드가 두 번째 레코드 다음에 온다는 의미. public static final int PRECEDES 레코드 정렬이나 검색 시 파라미터로 받은 두 번째 레코드가 첫 번째 레코드 다음에 온다는 의미.

35 DataComparatorInteger클래스
두 개의 레코드를 정수로 비교하는 클래스이다. 데이터베이스의 sortRecord메소드를 호출할 때 필요하다.

36 DataComparatorInteger의 주요 method
public int compare(byte[] data1, byte[] data2) 레코드를 비교하는 메소드다. 매개변수 data1 비교할 레코드의 데이터 data2 비교할 레코드의 데이터

37 DataComparatorString클래스
두 개의 레코드를 문자열로 비교하는 클래스이다. 데이터베이스의 sortRecord메소드를 호출할 때 필요하다.

38 DataComparatorString의 주요 method
public int compare(byte[] data1, byte[] data2) 레코드를 비교하는 메소드다. 매개변수 data1 비교할 레코드의 데이터 data2 비교할 레코드의 데이터

39 DataFilter 정렬에 사용할 레코드를 제한할 때 사용되는 인터페이스이다.
sortRecord 메소드로 데이터베이스의 레코드를 정렬할 때 해당 레코드를 정렬에 포함시킬 것인가를 결정한다. 기본적으로 자주 사용되는 정수, 문자열 비교를 위해서는 DataFilterInteger 클래스를 사용하면 된다.

40 DataFilter인터페이스의 주요 method
public boolean filter(byte[] data) 정렬에 사용할 레코드를 제한하는 메소드. 해당 레코드를 정렬에 사용할 것인지를 결정. 매개변수 data 레코드에 저장된 데이터를 나타내는 바이트 어레이

41 DataFilterInteger클래스
정렬에 사용할 레코드를 한정한다. 정수로 정렬할 때 사용한다. 레코드의 데이터인 바이트 어레이에서, 특정 오프셋에 저장된 데이터가 정수(int)라 가정하고, 이 값이 일정 범위(min, max로 지정된)에 속한 레코드만 정렬에 포함한다.

42 DataFilterInteger클래스 주요 method
public boolean filter(byte[] data) 정렬에 사용할 레코드를 제한하는 메소드다. 해당 레코드를 정렬에 사용할 것인지를 결정한다.

43 예제 7-3


Download ppt "7장 파일과 데이터베이스."

Similar presentations


Ads by Google