330 likes | 546 Vues
위피 입출력. Introduction. Java.io org.kwis.msp.io org.kwis.msp.db. Overview – (1). 휴대폰 같은 무선 단말기도 입출력이 필요 무선 단말기에는 보조 기억장치가 없기 때문에 메모리를 파일 처럼 사용 두 가지 메모리 프로그램 수행시 할당되어 사용되는 힙과 스택등을 위해 사용되는 메모리 프로그램이 종료된 후에도 계속 단말기에 존재하여 이후 계속해서 필요할 때마다 사용될 수 있는 메모리. Overview – (2).
E N D
Introduction • Java.io • org.kwis.msp.io • org.kwis.msp.db
Overview – (1) • 휴대폰 같은 무선 단말기도 입출력이 필요 • 무선 단말기에는 보조 기억장치가 없기 때문에 메모리를 파일 처럼 사용 • 두 가지 메모리 • 프로그램 수행시 할당되어 사용되는 힙과 스택등을 위해 사용되는 메모리 • 프로그램이 종료된 후에도 계속 단말기에 존재하여 이후 계속해서 필요할 때마다 사용될 수 있는 메모리
Overview – (2) • 입출력과 관계되는 메모리는 플래시 메모리 영역 • 두 가지 타입으로 존재 • 파일 형태 • 데이터베이스 형태 • 입출력의 기본이 되는 클래스 들은 java.io 패키지에 존재 • File에 대한 클래스 들은 org.kwis.msp.io 패키지에 존재 • Database에 관한 클래스들은 org.kwis.msp.db 에 존재
Java.io – (1) • 위피가 제공하는 입출력 스트림을 설명
Object InputStream DataInput ByteArrayInputStream ByteArrayOutputStream OutputStream DataInput ByteArrayOutputStream DataOutputStream PrintStream Reader InputStreamReader Writer InputStreamWriter Java.io – (2) • java.io 패키지의 상속도
Java.io – (3) • InputStream , OutputStream 는 모두 추상클래스 이므로 다른 메소드로부터 객체를 전달 받아 사용 • 클래스를 전달해주는 메소드 Socket Class InputStream getInputStream() OutputStream getOutputStream() HttpSocket Class InputStream getInputStream() OutputStream getOutputStream() File Class InputStream openInputStream() OutputStream openOutputStream() • Reader와 Writer는 바이트 입력 스트림을 문자 스트림으로 또 2바이트 문자를 바이트 스트림으로 변환해 주는 추상 클래스 • InputSreamReader와 OutputStreamWriter의 부모 클래스
org.kwis.msp.io– (1) • 모바일 표준 규격 문서에서는 “Addional IO”라고 분류 • org.kwis.msp.io • File • FileSystem
File– (1) • File 클래스는 파일에 대한 읽기/쓰기와 같은 기본적인 기능과 조금 더 빠르고 편리하게 사용하기 위한 Stream 기능 지원을 위한 클래스 • 파일이름은 모두 절대경로 • 구분자(separator)의 경우 유닉스 시스템의 관행대로 함 • "/"를 사용 public File(String filename, int mode) public File(String filename, int mode, int flag) 파일의 생성자 READ_ONLY WRITE WRITE_TRUNC READ_WRITE 파라미터 flag FileSystem.PRIVATE_ACCESS, FileSystem.SHARED_ACCESS, FileSystem.SYSTEM_ACCESS 파라미터 mode
File– (2) • File 메소드 중에서는 low level로 보다 빠른 접근을 가능하게 하는 API read(byte[]) read(byte[], int, int) write(byte[]) write(byte[], int, int) write(int) seek(int) sizeOf() FileTest.java page. 266 • 사용자로부터 파일 이름을, 파일 내용을 받아 들여 파일을 PRIVATE, SHARED, SYSTEM 영역에 각각 생성하는 프로그램
FileSystem– (1) • File 메소드 중에서는 low level로 보다 빠른 접근을 가능하게 하는 API read(byte[]) read(byte[], int, int) write(byte[]) write(byte[], int, int) write(int) seek(int) sizeOf() FileTest.java page. 266 • 사용자로부터 파일 이름을, 파일 내용을 받아 들여 파일을 PRIVATE, SHARED, SYSTEM 영역에 각각 생성하는 프로그램
File– (2) • File 메소드 중에서는 low level로 보다 빠른 접근을 가능하게 하는 API read(byte[]) read(byte[], int, int) write(byte[]) write(byte[], int, int) write(int) seek(int) sizeOf() FileTest.java page. 266 • 사용자로부터 파일 이름을, 파일 내용을 받아 들여 파일을 PRIVATE, SHARED, SYSTEM 영역에 각각 생성하는 프로그램
FileSystem– (1) • 이미 존재하는 파일의 이름바꾸기, 파일리스트 등 좀 더 편리한 기능을 FileSystem 클래스를 통하여 제공 • FileSystem 클래스에서 제공하는 메소드 들은 모두 static으로 선언되어 있어 프로그램 어디에서나 사용 가능 • FileSystem 클래스의 메소드 • 디렉토리관련메소드 • 파일 관련메소드 • 파일/디렉토리 공통관련 메소드 • 기타 유용한 메소드 • 메소드들의 사용법을 보면 • if (exists("test", PRIVATE_ACCESS)) • { • System.err.println("test exists"); • };
FileSystem– (2) • 루트 디렉토리를 읽어 들이기 try{ Vector files = FileSystem.list(dir, FileSystem.PRIVAT_ACCESSE); m_listsItem = new ListItem[files.size()]; for(int i = 0 ; i < files.size() ; i++ ){ String filename = (String) files.elementAt(i); if(FileSystem.isDirectory(filename,ACCESSAREA)) m_listsItem[i] = new ListItem(img_dir,img_dir,filename,"dir",false); else m_listsItem[i] = new ListItem(img_file,img_file,filename,"file",false); } } catch(Exception e){}; FileTest.java page. 266
FileSystem– (3) • dir에 “/”가 사용되었고 접근권한 에는 FileSystem.PRIVAT_ACCESSE가 사용 파일리스트 (“/”)
FileSystem– (4) • FileSystem.available(); 메소드를 이용하여 전체 사용 가능한 용량 구하기 if(c.equals(cmd_info) && type == 2 ) { int space = FileSystem.available(); int total = (int) Runtime.getRuntime().totalMemory(); int freemem = (int) Runtime.getRuntime().freeMemory(); card.scroll.ItemChanged(card.scroll.getItemArray("파일 영역 "+space + " 만큼 사용가능 합니다 , 메모리는 총 "+ total+" 중 "+freemem+" 만큼 사용가능합니다.", card.getWidth() -10 , null)); card.m_currentmode = card.MODE_INFO; card.repaint(); } ExplorerTest.java Page. 278
FileSystem– (5) • “선택” 을 선택 하였을 때 의 수행을 보여줌 선택 파일 내용 보기
FileSystem– (6) • 폴더를 추가 하는 화면 폴더 만들기 선택 LabelComponent와 TextFieldComponent를 출력 폴더 이름 입력 받음 FileSystme.mkdir() 메소드를 이용하여 폴더를 생성 디렉토리 만들기 리스트 보여주기
FileSystem– (7) • 폴더를 추가 하는 화면 파일 만들기 선택 파일이름을 입력 받는 TextFieldComponent 와 파일 내용을 입력받는 TextBoxComponent를 추가 file = new File(filename, File.WRITE) 로 파일을 생성 file.write()메소드를 사용하여 파일에 입력받은 내용을 추가 Card를 Display의 Card 스택에 다시 추가 파일 만들기
FileSystem– (8) • 제거하기 if(c.equals(cmd_del) && type == 2 ) { if(card.m_currentmode != card.MODE_DIR ){ card.scroll.ItemChanged(card.scroll.getItemArray("리스트보기 상태에서 수행 가능”+ 합리스트 보기로 이동하십시요 ",card.getWidth() -10 , null)); card.scroll.setSelectionMode(false); }else{ String filename = CURRENTDIR+"/"+card.scroll.SelectPressed().title; try{ if(FileSystem.isDirectory(filename)){ FileSystem.rmdir(filename); }else { FileSystem.remove(filename); } }catch(Exception e){ card.scroll.ItemChanged(card.scroll.getItemArray("오류가 발생하였습니다." , card.getWidth() -10 , null)); card.scroll.setSelectionMode(false); card.repaint(); return ; } card.m_currentmode = card.MODE_MKDIR; card.scroll.ItemChanged(card.getListItems()); card.repaint(); } return ; } 디렉토리 & 파일 삭제하기
FileSystem– (9) • 이름 바꾸기 • 파일이나 디렉토리의 이름을 변경하고자 할 때에는 FileSystem. Rename() 메소드를 사용 “이름바꾸기”가 눌러졌을 때 수행되는 부분 if(_btn.getString().indexOf("이름바꾸기") != -1 ){ try{ FileSystem.rename(textfield.getString(), textbox.getString()); }catch(Exception e){ } } load(); draw(); card.scroll.ItemChanged(card.getListItems()); card.m_currentmode=card.MODE_DIR ; card.repaint(); 이름 바꾸기
org.kwis.msp.db • 위피-java에서는 영속적인 데이터를 저장하고, 찾으며, 관리하기 위하여 org.kwis.msp.db 패키지를 제공 • J2ME에서 Record Management System(RMS)와 비슷한 것
DataBase – (1) • Jlet에서 간단한 데이터베이스를 구현하기 위한 클래스 • DataBase객체는 실제 DataBase에서의 Table에 해당함 • 레코드는 바이트 배열의 형태로 저장 • 위피 – C 에서는 문자 배열의 형태로 저장 • 레코드는 데이터베이스 상에서 레코드 ID라는 Integer 값으로 표현 • 레코드 ID는 0부터 시작하며 레코드의 삭제가 없는 한 레코드 ID는 레코드를 하나 저장할 때 마다 1씩 증가 DataBase 생성 메소드 : static DataBase openDataBase(String dataBaseName, int recordSize, boolean create) static DataBase openDataBase(String dataBaseName, int recordSize, boolean create, int flag)
DataBase – (2) CreateDBTest.java소스 코드 일부 : DataBase p_db = DataBase.openDataBase("p_id",10,true, FileSystem.PRIVATE_ACCESS); }catch(Exception e){ } try{ DataBase s_db = DataBase.openDataBase("s_id",10,true, FileSystem.SHARED_ACCESS); }catch(Exception e){ } try{ DataBase t_db = DataBase.openDataBase("t_id",10,true, FileSystem.SHARED_ACCESS); 사용을 한 후 DataBase 닫아 주기 void closeDataBase() 필요가 없어진 DataBase 삭제하기 static void deleteDataBase(String dataBaseName) static void deleteDataBase(String dataBaseName, int flag)
DataBase – (3) • DataBase 클래스의 메소드 • 데이터 관리 메소드 • DataBase 관리 메소드 • 데이터를 추가 하기 위해서 메소드 • int insertRecord(byte[] data) • int insertRecord(byte[] data, int offset, int numBytes) • InsertDBTest.java수행 • p_id.db 와 p_id.idx 파일
DataBase DataComparator DataComparatorInteger DataComparatorString Filter DataFilterInteger DataBase – (4) • 클래스 상속관계 • org.kwis.msp.db 패키지에는 DataBase 클래스와 DataComparator , Filter 인터페이스를 바탕으로 이루어짐
Filter • 데이터베이스의 레코드 중 값에 특정문자 를 포함 하고 있는 것만 찾아오는 Filter 클래스 • MyFilter를 이용하여 데이터 베이스에 있는 레코드 중에서 “123”을 포함하는 레코드만을 출력한 예 record ID =33, record = 0123 record ID =13, record = 0123 record ID =23, record = 0123 record ID =3, record = 0123 record ID =14, record = 01234 record ID =24, record = 01234 record ID =4, record = 01234 . . . record ID =36, record = 0123456 record ID =26, record = 0123456 record ID =16, record = 0123456 record ID =17, record = 01234567 record ID =7, record = 01234567 record ID =27, record = 01234567 record ID =37, record = 01234567 record ID =38, record = 012345678 record ID =8, record = 012345678 record ID =18, record = 012345678 수행 결과 DBFilterTest.java Page. 301
DataComparator – (1) • DataComparatorString를 상속받아 compare()를 원하는 순서를 출력하도록 메소드를 변경 DBFilterTest.java Page. 301 DataComparatorReverseString.java Page. 303 record ID =18, record = 012345678 record ID =38, record = 012345678 record ID =8, record = 012345678 record ID =28, record = 012345678 record ID =27, record = 01234567 record ID =37, record = 01234567 record ID =17, record = 01234567 record ID =7, record = 01234567 . . . record ID =14, record = 01234 record ID =34, record = 01234 record ID =4, record = 01234 record ID =24, record = 01234 record ID =3, record = 0123 record ID =23, record = 0123 record ID =33, record = 0123 record ID =13, record = 0123 record ID =33, record = 0123 record ID =13, record = 0123 record ID =23, record = 0123 record ID =3, record = 0123 record ID =14, record = 01234 record ID =24, record = 01234 record ID =4, record = 01234 . . . record ID =26, record = 0123456 record ID =16, record = 0123456 record ID =17, record = 01234567 record ID =7, record = 01234567 record ID =27, record = 01234567 record ID =37, record = 01234567 record ID =38, record = 012345678 record ID =8, record = 012345678 record ID =18, record = 012345678 비교하기
DataComparator – (2) • 데이터베이스의 레코드중 “123”인 레코드를 “ABC”로 바꾸는 프로그램 DataComparatorReverseString.java Page. 304 수행 결과 0123 has changed to ABC... : RECORDID is 3 0123 has changed to ABC... : RECORDID is 23 0123 has changed to ABC... : RECORDID is 33 0123 has changed to ABC... : RECORDID is 13
10byte 11byte 49 byte 30byte 100 byte MultipulColumn – (1) • 데이터베이스 클래스는 복수개의 컬럼을 지원하지 않는다. • 레코드의 데이터 타입이 byte 배열이기 때문에 우리가 원하는 만큼 크게 사용하여 여러 개의 컬럼을 하나의 레코드에 저장하는 방법을 사용할 수 있다. • 일정한 크기 별로 저장하는 방법 • 컬럼과 컬럼 사이에 DELIMETER를 두어 구별하는 방법 • 컬럼의 크기와 컬럼의 내용을 같이 사용하는 방법 • 무선 단말기에서 전화번호를 관리하는 프로그램 • 컬럼이 이름, 전화번호, 주소, 이메일 인 데이터를 갖는 데이터 베이스가 필요 자료구조를 저장하고 사용하기 위하여 이를 대표하는 클래스 AddressBookData를 선언 AddressBookData.java page. 306
A n 10개 MultipulColumn – (2) • 바이트 배열로 AddressBook 클래스를 생성 … try{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.write((name+" ").substring(0,10).getBytes()); dos.write((phone+" ").substring(0,11).getBytes()); dos.write((addr+" ").substring(0,49).getBytes()); dos.write((email+" ").substring(0,30).getBytes()); data = baos.toByteArray(); baos.close(); dos.close(); …
MultipulColumn – (3) • 프로그램이 시작한 후 사용자로부터 입력을 받아 들이는 화면 • ShellComponent에 FirmComponent를 추가한 후 TextFieldcomponent 4개를 사용하여 사용자로부터 이름, 전화번호, 주소, 이메일을 받아 들인다. “DB에 추가” 버튼이 눌려지면 AddressBookData data를 생성 컬럼들은 하나의 byte 배열로 바꿈 데이터베이스에 추가 리스트 보여 주기
MultipulColumn – (4) • 정보보기를 선택하였을 때 보여지는 화면