1 / 33

위피 입출력

위피 입출력. Introduction. Java.io org.kwis.msp.io org.kwis.msp.db. Overview – (1). 휴대폰 같은 무선 단말기도 입출력이 필요 무선 단말기에는 보조 기억장치가 없기 때문에 메모리를 파일 처럼 사용 두 가지 메모리 프로그램 수행시 할당되어 사용되는 힙과 스택등을 위해 사용되는 메모리 프로그램이 종료된 후에도 계속 단말기에 존재하여 이후 계속해서 필요할 때마다 사용될 수 있는 메모리. Overview – (2).

chana
Télécharger la présentation

위피 입출력

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 위피 입출력

  2. Introduction • Java.io • org.kwis.msp.io • org.kwis.msp.db

  3. Overview – (1) • 휴대폰 같은 무선 단말기도 입출력이 필요 • 무선 단말기에는 보조 기억장치가 없기 때문에 메모리를 파일 처럼 사용 • 두 가지 메모리 • 프로그램 수행시 할당되어 사용되는 힙과 스택등을 위해 사용되는 메모리 • 프로그램이 종료된 후에도 계속 단말기에 존재하여 이후 계속해서 필요할 때마다 사용될 수 있는 메모리

  4. Overview – (2) • 입출력과 관계되는 메모리는 플래시 메모리 영역 • 두 가지 타입으로 존재 • 파일 형태 • 데이터베이스 형태 • 입출력의 기본이 되는 클래스 들은 java.io 패키지에 존재 • File에 대한 클래스 들은 org.kwis.msp.io 패키지에 존재 • Database에 관한 클래스들은 org.kwis.msp.db 에 존재

  5. Java.io – (1) • 위피가 제공하는 입출력 스트림을 설명

  6. Object InputStream DataInput ByteArrayInputStream ByteArrayOutputStream OutputStream DataInput ByteArrayOutputStream DataOutputStream PrintStream Reader InputStreamReader Writer InputStreamWriter Java.io – (2) • java.io 패키지의 상속도

  7. 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의 부모 클래스

  8. org.kwis.msp.io– (1) • 모바일 표준 규격 문서에서는 “Addional IO”라고 분류 • org.kwis.msp.io • File • FileSystem

  9. 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

  10. 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 영역에 각각 생성하는 프로그램

  11. 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 영역에 각각 생성하는 프로그램

  12. 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 영역에 각각 생성하는 프로그램

  13. FileSystem– (1) • 이미 존재하는 파일의 이름바꾸기, 파일리스트 등 좀 더 편리한 기능을 FileSystem 클래스를 통하여 제공 • FileSystem 클래스에서 제공하는 메소드 들은 모두 static으로 선언되어 있어 프로그램 어디에서나 사용 가능 • FileSystem 클래스의 메소드 • 디렉토리관련메소드 • 파일 관련메소드 • 파일/디렉토리 공통관련 메소드 • 기타 유용한 메소드 • 메소드들의 사용법을 보면 • if (exists("test", PRIVATE_ACCESS)) • { • System.err.println("test exists"); • };

  14. 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

  15. FileSystem– (3) • dir에 “/”가 사용되었고 접근권한 에는 FileSystem.PRIVAT_ACCESSE가 사용 파일리스트 (“/”)

  16. 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

  17. FileSystem– (5) • “선택” 을 선택 하였을 때 의 수행을 보여줌 선택 파일 내용 보기

  18. FileSystem– (6) • 폴더를 추가 하는 화면 폴더 만들기 선택 LabelComponent와 TextFieldComponent를 출력 폴더 이름 입력 받음 FileSystme.mkdir() 메소드를 이용하여 폴더를 생성 디렉토리 만들기 리스트 보여주기

  19. FileSystem– (7) • 폴더를 추가 하는 화면 파일 만들기 선택 파일이름을 입력 받는 TextFieldComponent 와 파일 내용을 입력받는 TextBoxComponent를 추가 file = new File(filename, File.WRITE) 로 파일을 생성 file.write()메소드를 사용하여 파일에 입력받은 내용을 추가 Card를 Display의 Card 스택에 다시 추가 파일 만들기

  20. 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 ; } 디렉토리 & 파일 삭제하기

  21. 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(); 이름 바꾸기

  22. org.kwis.msp.db • 위피-java에서는 영속적인 데이터를 저장하고, 찾으며, 관리하기 위하여 org.kwis.msp.db 패키지를 제공 • J2ME에서 Record Management System(RMS)와 비슷한 것

  23. 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)

  24. 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)

  25. DataBase – (3) • DataBase 클래스의 메소드 • 데이터 관리 메소드 • DataBase 관리 메소드 • 데이터를 추가 하기 위해서 메소드 • int insertRecord(byte[] data) • int insertRecord(byte[] data, int offset, int numBytes) • InsertDBTest.java수행 • p_id.db 와 p_id.idx 파일

  26. DataBase DataComparator DataComparatorInteger DataComparatorString Filter DataFilterInteger DataBase – (4) • 클래스 상속관계 • org.kwis.msp.db 패키지에는 DataBase 클래스와 DataComparator , Filter 인터페이스를 바탕으로 이루어짐

  27. 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

  28. 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 비교하기

  29. 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

  30. 10byte 11byte 49 byte 30byte 100 byte MultipulColumn – (1) • 데이터베이스 클래스는 복수개의 컬럼을 지원하지 않는다. • 레코드의 데이터 타입이 byte 배열이기 때문에 우리가 원하는 만큼 크게 사용하여 여러 개의 컬럼을 하나의 레코드에 저장하는 방법을 사용할 수 있다. • 일정한 크기 별로 저장하는 방법 • 컬럼과 컬럼 사이에 DELIMETER를 두어 구별하는 방법 • 컬럼의 크기와 컬럼의 내용을 같이 사용하는 방법 • 무선 단말기에서 전화번호를 관리하는 프로그램 • 컬럼이 이름, 전화번호, 주소, 이메일 인 데이터를 갖는 데이터 베이스가 필요 자료구조를 저장하고 사용하기 위하여 이를 대표하는 클래스 AddressBookData를 선언 AddressBookData.java page. 306

  31. 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(); …

  32. MultipulColumn – (3) • 프로그램이 시작한 후 사용자로부터 입력을 받아 들이는 화면 • ShellComponent에 FirmComponent를 추가한 후 TextFieldcomponent 4개를 사용하여 사용자로부터 이름, 전화번호, 주소, 이메일을 받아 들인다. “DB에 추가” 버튼이 눌려지면 AddressBookData data를 생성 컬럼들은 하나의 byte 배열로 바꿈 데이터베이스에 추가 리스트 보여 주기

  33. MultipulColumn – (4) • 정보보기를 선택하였을 때 보여지는 화면

More Related