Presentation is loading. Please wait.

Presentation is loading. Please wait.

제9장 입출력과 JNI.

Similar presentations


Presentation on theme: "제9장 입출력과 JNI."— Presentation transcript:

1 제9장 입출력과 JNI

2 입출력

3 스트림(stream) 순서가 있고 길이가 정해져 있지 않은 데이터의 흐름 java.io 패키지 스트림(stream)
바이트 스트림 - 바이트의 연속 InputStream - 입력 OutputStream - 출력 문자 스트림 - 문자의 연속 Reader - 입력 Writer - 출력 System 클래스 out - PrintStream in - InputStream

4 바이트 스트림 상속 관계 출력 스트림 클래스 상속 관계 입력 스트림 클래스 상속 관계

5 문자 스트림 상속 관계 Reader 클래스 상속 관계 Writer 클래스 상속 관계

6 InputStream 클래스 메소드들 System 클래스의 in 멤버필드는 대표적인 InputStream 타입
int read() 바이트 값을 읽어온다. 만약, 파일의 끝인 경우에는 -1을 리턴 int read(byte[]) 읽은 내용을 바이트 배열에 채우고, 읽은 바이트의 수를 리턴 int read(byte[], int, int) 바이트 배열에서 시작 위치와 끝 위치를 지정한 뒤에 내용을 읽어오고, 읽은 바이트의 수를 리턴 System 클래스의 in 멤버필드는 대표적인 InputStream 타입

7 예제 : inOut.java 1 import java.io.*; 결 과 2 class inOut {
public static void main (String args[]) throws IOException { int b, count = 0; while (( b = System.in.read() ) != -1) { count++; System.out.print((char)b); } System.out.println(); System.err.println("total bytes = " + count); ……... 결 과 % java inOut Hello 한글 ??+? ^D total bytes = 11

8 FileOutputStream 클래스 FileOutputStream 예제 : FileOut.java
파일에 내용을 기록할 때 사용되는 출력 스트림 예제 : FileOut.java 1 import java.io.*; 2 3 public class FileOut { …….. FileOut(String fname) throws IOException { msg = new byte[1024]; len = 0; fout = new FileOutputStream(fname); int b =0; ……...

9 예제 15 b = System.in.read(); 16 while(b != 10) {
System.out.print("Put characters:"); b = System.in.read(); while(b != 10) { msg[len++] = (byte)b; b = System.in.read(); } write(msg); System.out.println("Total "+ len + " bytes."); } 23 public void write(byte[] m) throws IOException for(int i=0; i < len; i++) { fout.write(m[i]); } } 29 public void close() try { fout.close(); } catch(IOException ex) } ………..

10 Data Sink Stream/ Data Processing Stream
데이터를 근원지에서 직접 읽거나, 목적지에 직접 기록하는 클래스들 InputStream, OutputStream FileInputStream, FileOutputStream FileReader, FileWriter Data Processing Stream 다른 스트림을 이용해서 중간에서 어떤 작업을 수행하는 클래스들 BufferedInputStream, BufferedOutputStream DataInputStream, DataOutputStream InputStreamReader, OutputStreamReader

11 DataInputStream/ DataOutputStream 클래스
자료형(data type)에 따라 값을 읽고 기록할 수 있는 스트림 클래스 DataInputStream은 다음 생성자를 이용해서 생성 DataInputStream(InputStream in) DataOutputStream은 다음 생성자를 이용해서 생성 DataOutputStream(OutputStream out)

12 DataInputStream/ DataOutputStream 클래스
int read(byte[] b, int off, int len) int read(byte[] b) boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() void readFully(byte[] b, int off, int len) void readFully(byte[] b) int readInt() String readLine() long readLong() short readShort() int readUnsignedByte() String readUTF() int skipBytes(int n) DataOutputStream 메소드 void flush() int size() void write(byte[] b, int off, int len) void write(int b) void writeBoolean(boolean v) void writeByte(int v) void writeBytes(String s) void writeChar(int v) void writeChars(String s) void writeDouble(double v) void writeFloat(float v) void writeInt(int v) void writeLong(long v) void writeShort(int v) void writeUTF(String str)

13 예제 : DataInOutStream.java
……….. 3 class DataInOutStream { 4 public static void main(String args[]) { try { DataOutputStream dout = new DataOutputStream(new FileOutputStream(args[0])); DataInputStream din = new DataInputStream(new FileInputStream(args[0])); char han = '한'; byte yi = 2; String str = "ABC"; byte[] ba = 65, 66, 67 ; 17 dout.write(yi); dout.write(ba, 0, ba.length); dout.writeBoolean(true); dout.writeChar(han); dout.writeUTF(str); dout.flush(); dout.close(); ……...

14 예제 : DataInOutStream.java
System.out.println("Available: " + din.available()); char h; byte b; boolean bool; String abc; byte[] bar = new byte[3]; 32 b = din.readByte(); din.read(bar, 0, bar.length); bool = din.readBoolean(); h = din.readChar(); abc = din.readUTF(); 38 ……….

15 Reader/Writer 클래스 Reader 클래스 메소드 int read() int read(char[])
int read(char[], int, int) InputStreamReader 클래스 InputStream -> Reader 로 변환 BufferedReader 클래스 메소드 int read() : 한 문자를 읽어서 리턴 String readLine() : 한 줄을 읽어서 문자열을 리턴

16 예제 : CharInput.java 1 import java.io.*; 2 3 public class CharInput { 4
public static void main(String args[]) { String s; BufferedReader in; in = new BufferedReader(new InputStreamReader(System.in)); 9 try { System.out.print("Put characters:"); while((s = in.readLine()) != null) { System.out.println("\tCharacters from console :" + s); System.out.print("Put characters:"); } } catch (IOException ex) {} ………..

17 BufferedReader/ BufferedWriter 클래스
버퍼링 방법을 통해 입출력을 수행한다. BufferredReader 클래스 BufferedReader(Reader in, int sz) BufferedReader(Reader in) BufferedReader 클래스의 메소드 void close() void mark(int readAheadLimit) int read() int read(char[] cbuf, int off, int len) String readLine() long skip(long n) BufferredWriter 클래스 BufferedWriter(Writer out, int sz) BufferedWriter(Writer out) BufferedWriter 클래스의 메소드 void close() void flush() void newLine() void write(char[] cbuf, int off, int len) void write(int c) void write(String s, int off, int len)

18 예제: BufferedReaderWriter.java
1 import java.io.*; 2 3 class BufferedReaderWriter { ………. try { BufferedReader in = new BufferedReader(new FileReader(args[0])); BufferedWriter out = new BufferedWriter(new FileWriter(args[1])); String line; int count = 0; while((line = in.readLine()) != null) { String msg = ++count + " " + line + ""; out.write(msg, 0, msg.length()); } in.close(); out.close(); } catch(IOException e) { System.err.println(e); ………..

19 RandomAccessFile 클래스 seek() 메소드를 이용 가능 RandomAccessFile 클래스의 생성자
입출력 포인터의 위치를 이동할 수 있다. 포인터를 이동 후에 원하는 위치에서 read 혹은 write RandomAccessFile 클래스의 생성자 RandomAccessFile(String filename, String openmode) Filename: 파일의 이름 Openmode: "r", "rw"

20 RandomAccessFile 메소드 long length() - 파일의 크기를 리턴한다.
boolean readBoolean() - boolean 값을 하나 읽는다. byte readByte() - byte 값을 하나 읽는다. short readShort() - short 값을 하나 읽는다. char readChar() - char 값을 하나 읽는다. double readDouble() - double 값을 하나 읽는다. float readFloat() - float 값을 하나 읽는다. int readInt() - int 값을 하나 읽는다. long readLong() - long 값을 하나 읽는다. void seek(long pos) - 파일의 처음부터 pos로 포인터 이동 void writeBoolean(boolean v) - 파일에 boolean 값을 기록한다. void writeByte(byte v) - 파일에 byte 값을 기록한다. void writeBytes(String v) - 파일에 String 값을 기록한다. void writeChar(char v) - 파일에 char 값을 기록한다. void writeChars(String v) - 파일에 String 값을 기록한다. void writeFloat(float v) - 파일에 float 값을 기록한다. void writeInt(int v) - 파일에 int 값을 기록한다.

21 예제 : EmployeeDB.java RandomAccessFile을 실제적으로 이용하는 프로그램
RandomAccessFile의 사용법 및 자바에서 C의 레코드의 사용법 자바는 레코드가 없기 때문에 클래스를 레코드로 사용 Record 클래스는 레코드를 표현하기 위해 사용된 클래스 Table 클래스는 레코드를 처리하기 위해 사용된 클래스 Table 클래스에서 레코드를 읽거나 기록하기 위한 루틴들을 포함 EmployeeDB 클래스는 주로 GUI를 위한 코드 포함 자료가 저장되는 employee.dat 파일 첫 4바이트에는 총 저장된 레코드의 수 그 후에는 레코드의 값들이 저장된다.

22 네이티브 메쏘드

23 네이티브 메소드 소개 JNI(Java Native Interface) 단점
자바 언어에서 C/C++ 언어로 작성된 함수를 호출 JNI는 주로 하드웨어를 제어하기 위해서 기존의 C/C++ 라이브러리를 이용하기 위해서 단점 플랫폼간에 호환성이 떨어짐. 애플릿에서 사용할 수 없음. 자바언어의 장점을 가지고 하드웨어에 접근하기 위한 방법으로 JNI는 매우 중요한 위치를 차지한다.

24 JNI 프로그램 작성 단계 1. 자바 클래스를 작성한다. 2. 자바 클래스를 컴파일한다.
3. C 언어의 헤더 파일을 생성한다. 4. 네이티브 메소드를 작성한다. 5. 라이브러리를 만든다. 6. 프로그램을 실행시킨다.

25 네이티브 메소드: 예제 1. 자바 클래스 작성 native 메소드 선언
[ access_modifier ] native return_type function_name( arguments ); 라이브러리 로드 - System.loadLibrary() 라이브러리 이름 예: hello 유닉스 - libhello.so Win32 - hello.dll

26 네이티브 메소드: 예제 예제 : NativeHello.java 1 class NativeHello {
public native void greet(); 3 static { System.loadLibrary("hello"); } 7 } 예제 : UseNative.java 1 class UseNative { public static void main(String[] args) { new NativeHello().greet(); } 5 }

27 네이티브 메소드: 예제 2. 컴파일하기 3. C 헤더 파일 생성하기 자바 클래스를 javac를 이용해서 컴파일한다. javah
% javac NativeHello.java % javac UseNative.java 3. C 헤더 파일 생성하기 javah % javah -jni NativeHello % ls NativeHello.class NativeHello.java UseNative.java NativeHello.h UseNative.class

28 네이티브 메소드: 예제 4. 네이티브 메소드 만들기
네이티브 메소드를 구현하기 위해서는 jni.h 헤더 파일과 javah로 생성된 헤더 파일을 include해야 한다. 예제 : HelloWorldImpl.c 1 #include <jni.h> 2 #include "NativeHello.h" 3 #include <stdio.h> 4 5 JNIEXPORT void JNICALL Java_NativeHello_greet (JNIEnv * env, jobject obj){ printf("Hello world!"); return; 8 }

29 네이티브 메소드: 예제 5. 라이브러리 만들기 UNIX나 Win32 환경에서 동적 라이브러리를 작성한다. UNIX Win32
% cc -G -I$JAVA_HOME/include -I$JAVA_HOME/include/solaris HelloWorldImpl.c -o libhello.so % ls HelloWorldImpl.c NativeHello.h UseNative.class NativeHello.class NativeHello.java UseNative.java libhello.so Win32 Turbo C나 Visual C++를 이용해서 hello.dll 라이브러리를 만든다.

30 네이티브 메소드: 예제 6. 실행하기 라이브러리 패스 맞추기 % java UseNative
유닉스 - LD_LIBRARY_PATH 환경변수에 생성된 라이브러리를 포함하도록 설정 Win32 - 자바 클래스가 있는 디렉토리에 라이브러리를 복사한다. % java UseNative java.lang.UnsatisfiedLinkError: no hello in shared library path at java.lang.Runtime.loadLibrary0(Runtime.java:429) at java.lang.System.loadLibrary(System.java:640) at … % setenv LD_LIBRARY_PATH .:$LD_LIBRARY_PATH Hello world!

31 자바 메소드를 C 언어로 구현 자바 메소드의 이름이 C 에서는 다음과 같이 변경된다. "Java_" 가 접두어로 붙는다.
패키지 이름과 클래스 이름이 붙는다. "_"가 분리자 역할을 한다. 메소드 이름이 붙는다. 중복정의된 메소드는 "_"뒤에 아규먼트가 기술된다. 중복정의된 메소드가 없으면 이 부분은 생략된다. java_package_class_method_arguments(argument_list)

32 자바 메소드를 C 언어로 구현 2) 중복정의된 메소드들을 구별

33 자바와 네이티브 메소드의 데이터 타입 매칭


Download ppt "제9장 입출력과 JNI."

Similar presentations


Ads by Google