제9장 입출력과 JNI.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

2013학년도 3-1 정보컴퓨터공학부 컴퓨터 소프트웨어 설계 및 실험
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
I/O 프로그래밍 컴퓨터 공학실험(I) 인공지능 연구실.
Vision System Lab, Sang-Hun Han
어서와 Java는 처음이지! 제17장 파일입출력.
캡스톤 프로젝트(자바) 입출력.
네트워크 프로그래밍 및 실습.
입출력 14.1 java.io 패키지의 개요 14.2 파일과 디렉토리
28강 JAVA 입출력(I/O) 알아보기 - 입출력(I/O) 이란? - JAVA 입출력 API(Input~, Output~)
Java Socket 통신 이개혁 정대준.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
객체지향 프로그래밍.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
어서와 Java는 처음이지! 제4장 배열.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
4부 클래스 라이브러리 “4부에서는 자바 언어의 API인 클래스 라이브러리에 관해 설명합니다
명품 JAVA Programming.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
파일 입출력에 사용되는 자바 클래스들 JDK 라이브러리의 파일을 다루는 클래스들 파일의 내용을 읽고 쓰는 클래스들
2강. JAVA 프로그래밍이란?-II & 변수 JAVA 프로그램 환경설정과 실행 방법 변수란?
명품 JAVA Essential.
Java 12장. 입출력 public class SumTest {
8장 자바 입출력.
7장 파일과 데이터베이스.
14.3 문자(character) 스트림과 바이트(byte) 스트림
Lesson 3. 입출력과 제어문.
Chapter 14. 입출력 스트림.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
Java Programming Language (4)
JAVA ADVANCED File IO IT 아카데미.
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
명품 JAVA Programming 제 8 장 입출력 스트림과 파일 입출력.
명품 JAVA Essential.
명품 JAVA Programming 제 16 장 네트워크.
Chapter 15 실전 프로젝트 01 친구 연락처 관리 프로그램 02 사진 처리 프로그램 예제 모음 요약 연습문제.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
명품 Java Programming.
Hadoop 김연왕
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
주소록 프로그램.
Network Programming(1)
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
정보컴퓨터공학부 컴퓨터 소프트웨어 설계 및 실험
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
명품 JAVA Programming.
입출력 CHAPTER 12 Section 1 java.io 패키지 개요 Section 2 파일과 디렉터리
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
프로그래밍 개론 Ⅰ 제 1장 . 서론 ①.
컴퓨터공학실습(I) 3주 인공지능연구실.
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
자바 5.0 프로그래밍.
Stream의 이해 : System Bufferring
컴퓨터 프로그래밍: 실습 1 제 1장 . 서론.
C.
Choi Younghwan CSE HUFS
Presentation transcript:

제9장 입출력과 JNI

입출력

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

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

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

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

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

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

예제 15 b = System.in.read(); 16 while(b != 10) { 14 System.out.print("Put characters:"); 15 b = System.in.read(); 16 while(b != 10) { 17 msg[len++] = (byte)b; 18 b = System.in.read(); 19 } 20 write(msg); 21 System.out.println("Total "+ len + " bytes."); 22 } 23 24 public void write(byte[] m) throws IOException 25 for(int i=0; i < len; i++) { 26 fout.write(m[i]); 27 } 28 } 29 30 public void close() 31 try { 32 fout.close(); 33 } catch(IOException ex) 34 } ………..

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

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

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)

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

예제 : DataInOutStream.java 26 System.out.println("Available: " + din.available()); 27 char h; 28 byte b; 29 boolean bool; 30 String abc; 31 byte[] bar = new byte[3]; 32 33 b = din.readByte(); 34 din.read(bar, 0, bar.length); 35 bool = din.readBoolean(); 36 h = din.readChar(); 37 abc = din.readUTF(); 38 ……….

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

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

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)

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

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

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 값을 기록한다.

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

네이티브 메쏘드

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

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

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

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

네이티브 메소드: 예제 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

네이티브 메소드: 예제 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){ 6 printf("Hello world!"); 7 return; 8 }

네이티브 메소드: 예제 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 라이브러리를 만든다.

네이티브 메소드: 예제 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!

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

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

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