Java IO
자바입출력구조 자바입출력 파일 기본입출력 필터입출력 문자입출력 비순차접근파일 객체입출력 파일입출력 바이트배열입출력 파이프입출력 연결형입력 스트링버퍼입력 스트림 ( 순차접근 ) 자바입출력구조
스트림이란? 일차원적인데이터의흐름 흐름의방향에따른분류 - 입력스트림 (input stream) - 출력스트림 (output stream) 데이터의형태에따른분류 - 문자스트림 (character stream) - 바이트스트림 (byte stream)
자바입출력방식 바이너리입출력문자입출력기본데이터형입출력객체입출력스트림토큰화
자바입출력구조 스트림을다루는클래스들 파일입출력스트림을다루는클래스들 java.io 선택 java.io 패키지에대한개략적인 설명이있는홈페이지 파일입출력 클래스들
입출력스트림관련클래스 입출력종류바이트스트림파일스트림바이트배열스트림데이터스트림객체스트림문자스트림파일문자스트림문자배열스트림문자열스트림파이프입출력 클래스파일 InputStream, OutputStream FileInputStream, FileOutputStream ByteArrayInputStream, ByteArrayOutputStream DataInputStream, DataOutputStream ObjecInputStream, ObjectOutputStream Reader, Writer FileReader, FileWriter CharArrayReader, CharArrayWriter StringBufferedInputStream, StringReader, StringWriter PipedInputStream, PipedOutputStream, PipedReader, PipedWriter
입출력스트림관련클래스 입출력종류스트림필터버퍼스트림반환형스트림기타스트림비순차입출력스트림토큰화 클래스파일 FilteredInputStream, FilteredOutputStream, FilteredReader, FileterdWriter BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter PushbackInputStream, PushbackReader SequencedInputStream RandomAcessFile StreamTokenizer
파일입출력 파일입출력의과정 A) 파일로부터데이터를읽는 3 단계 B) 파일에데이터를쓰는 3 단계 파일을연다 파일을연다 필요한만큼 필요한만큼 파일의데이터를읽는다 반복 파일에데이터를쓴다 반복 파일을닫는다 파일을닫는다
파일입출력의과정 파일열기 FileReader reader = new FileReader( poem.txt ); 생성자안에서현재디렉토리의 poem.txt 파일을엽니다. 데이터읽기 Data = reader.read(); 이메서드는파일에있는 문자하나를읽어서리턴합니다. 파일닫기 reader.close(); 파일을닫는메소드
파일 파일관련오류를줄이는방법 FileInputStream 객체를생성하기전에인자값인 File 객체를통해서파일이실제로존재하는것인지확인한다. File 객체의 isfile( ) 메소드는파일이디렉토리인지파일인지확인하는메소드다. 파일을읽기전에 canread( ) 메소드를이용하면파일이읽기속성을가지고있는지확인할수있다. 파일을쓰기전에 canwrite( ) 메소드를이용하면파일이쓰기속성을가지고있는지확인할수있다.
파일 File 클래스 ( 파일의내용이아니라 ) 파일자체를관리하는클래스메소드제공파일정보를가져오는메소드파일정보를수정하는메소드파일을생성 / 삭제하는메소드 디렉토리관리에도사용됨 디렉토리 : 특수한형태의파일이라고할수있음
파일 파일 / 디렉토리정보가져오기 다음과같은방법으로 File 객체를생성합니다. File file = new File( poem.txt ); 현재디렉토리에있는 poem.txt. 에대한 File 객체를생성합니다. File file = new File( C:\\work\\chap10 ); C 드라이브의 work 디레토리아래에있는 Chap10 에대한 File 객체를생성합니다.
파일 / 디렉토리정보를가져오는메소드를호출합니다. Boolean isthere = file.exists(); 파일또는디렉토리가있으면 true, 없으면 false 를리턴 Boolean isfile= file.isfile(); 파일이있으면 true, 아니면 false 를리턴 Boolean isdir= file.isdirectory(); 디렉토리면 true, 아니면 false 를리턴
파일 파일관리 파일을생성하고삭제하는메소드 File file1 = new File( poem.txt ); file1.createnewfile(); 현재디렉토리에 poem.txt 라는이름의파일을생성한다. File file2 = new File( C:\\doc\\ 회의록.hwp ); file2.delete(); C:\doc\ 회의록.hwp 파일을삭제한다.
파일 파일관리 디렉토리를생성하고삭제하는메소드 File file1 = new File( C:\\ 올빼미 ); file1.mkdir(); C 드라이브의루트디렉토리에 올빼미 라는디렉토리를생성한다. File file2 = new File( 두루미 ); file2.delete(); 현재디렉토리에있는 두루미 라는디렉토리를삭제한다.
파일 파일관리 임시파일을생성하는메소드 File tmpfile = file.createtempfile( tmp,.txt,tmpdir); tmp로시작하고.txt로끝나는 임시파일을 이디렉토리에생성한다.
File 객체관련예제 : import java.io.*; public class test0 { public static void main(string[] args) { File f0 = new File("Name.class"); File f1 = new File(".."); File f2 = new File(f1, "test.java"); System.out.println("f0.getName() = " + f0.getname()); // 파일이름 System.out.println("f1.getPath() = " + f1.getpath()); // 파일경로 System.out.println("f2.getAbsolutePath() = " + f2.getabsolutepath()); // 파일의절대경로 System.out.println("f1.getParent() = " + f1.getparent()); // 파일의상위디렉토리 System.out.println("f0.exists() = " + f0.exists()); // 파일의존재여부 System.out.println("f0.canWrite() = " + f0.canwrite()); // 쓰기가능여부 System.out.println("f0.canRead() = " + f0.canread()); // 읽기가능여부
File 객체관련예제 : System.out.println("f1.isDirectory() = " + f1.isdirectory()); // 디렉토리인지여부 System.out.println("f0.lastModified() = " + f0.lastmodified()); // 파일이수정된시간 (long형) System.out.println("f0.length() = " + f0.length()); // 파일의길이 String[] list = f1.list(); // 파일목록 ( 디렉토리의경우 ) System.out.println("f1.list() = {"); for(int i = 0; i < list.length; i++) System.out.println("," + list[i]); try { System.out.println("f1.getCanonicalPath() = " + f1.getcanonicalpath()); } catch(exception e){e.printstacktrace();} } }
바이트입출력스트림구조 입력스트림 바이트기반스트림 출력스트림 바이트배열 파일 바이트배열 파일 객체 파이프 객체 파이프 문자열버퍼 시퀀스 필터 필터 버퍼 반환형 버퍼 데이터 라인 데이터 프린트 바이트입출력스트림구조
문자입출력스트림 문자스트링 입력 Reader 출력 Writer 버퍼 스트링 버퍼 스트링 라인 파일 문자배열 파일 문자배열 필터 파이프 필터 파이프 변환형 프린트 문자열 문자열 문자입출력스트림구조
입출력스트림계층구조 Object InputStream * ByteArrayInputStream FileInputStream FilterInputStream BufferedInputStrea DataInputStream LineNumberInputStream PushbackInputStream ObjectInputStream PipedInputStream SequencedInputStream StringBufferedInputStream * abstract class OutputStream * ByteArrayOutputStream FileOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream PushbackOutputStream ObjectOutputStream PipedOutputStream 바이트입출력클래스구성도
파일입출력스트림관련예제 : FileInputStream 과 FileOutputStream 클래스를이용한예제 import java.io.*; public class test0 { public static void main(string[] args) { String filename = " 예문.txt"; File file = new File(filename); // File 객체생성 try { // File 객체로부터 FileOutputStream 객체생성 FileOutputStream out = new FileOutputStream(file); // 문자열로부터 getbytes() 로바이트배열얻기 out.write("java Programming\n".getBytes()); out.write("fileinputstream/fileoutputstream\ntest File\n".getBytes()); // 1 부터 30 까지 byte 단위로출력 for(int i = 1; i < 30; i++) out.write((byte)i); out.close(); // 파일닫기를위해 close() 메소드호출 // 문자열로부터 FileInputStream 객체생성
파일입출력스트림관련예제 : FileInputStrea 과 FileOutputStream 클래스를이용한예제 } } FileInputStream in = new FileInputStream(filename); int b; // 입력이끝날때까지바이트단위로반복적으로읽기 while((b = in.read()) > -1) { System.out.print((char)b); } in.close(); // 파일닫기를위해 close() 메소드호출 } catch (Exception e) {e.printstacktrace();}
버퍼입출력 필터스트림의일종 입출력속도를향상하는주요한클래스에해당 여러메소드중에서 flush() 메소드버퍼에남아있는데이터를실제로입출력 close() 메소드보다앞서실행되어야함. 버퍼입출력 VS 비버퍼입출력속도파일입출력의경우 10 배이상속도가빠르다
필터입출력스트림 다른종류의입출력스트림을하나로연결해서처리 관련클래스 버퍼입출력 : BufferedInputStream/BufferedOutputStream 데이터입출력 : DataInputStream/DataOutputStream 라인스트림 : LineNumberInputStream/PrintStream 반환형입력스트림 : PushbackInputStream
기타바이트입출력스트림 PipedInputStream/PipedOutputStream 클래스 : 파이프스트림은자바프로그램안에서객체와객체간의스트림입출력을위한스트림 SequenceInputStream 클래스 : SequenceInputStream 클래스는둘이상의 InputStream 객체를하나의스트림으로묶어서사용하는스트림 ByteArrayInputStream/ByteArrayOutputStream 클래스 : ByteArrayInputStream 객체는단순히바이트배열로부터 InputStream 객체를생성하는스트림 StringBufferedInputStream 클래스
문자입출력스트림구조 지역코드파일 바이트배열 유니코드문자배열 InputStream Reader byte[ ] char[ ] 유니코드문자열 지역코드파일 바이트배열 유니코드문자배열 OutputStream Writer byte[ ] char[ ] 유니코드문자열 바이트입출력스트림과문자입출력스트림의연결
문자입출력스트림구조 Object * abstract class Reader * BufferedReader Writer * BufferedWriter LineNumberReader CharArrayReader FilterReader * CharArrayWriter FilterWriter * PushbackReader InputStreamReader FileReader OutputStreamWriter FileWriter PrintWriter PipedReader PipedWriter StringReader StringWriter 문자입출력 Reader/Writer 클래스구조도
유니코드와지역코드 유니코드 16비트기반의다국적문자체계동일한 16비트문자세트를이용전세계대부분의문자를수용다국어처리에효과 지역코드 8 비트코드체계인 ASCII 를바탕으로개별국가가지역특성에맞게확장한코드 국가정보기관등이표준화한것으로보통 8 비트또는 16 비트체계를가짐
유니코드와지역코드 지역코드파일 바이트배열 InputStream 유니코드문자배열 Reader byte[ ] char[ ] ByteToChar 변환기 유니코드문자열 지역코드파일 바이트배열 OutputStream 유니코드문자배열 Writer byte[ ] char[ ] CharToByte 변환기 유니코드문자열 문자스트림에서코드변환기의동작
바이트스트림, 문자스트림연결, 버퍼문자입출력 바이트스트림과문자스트림연결 : InputStreamReader/InputStreamWriter 클래스 바이트스트림객체를이용하여 Reader/Writer 객체를클래스 내부적으로는앞에서언급한지역코드와유니코드간의동작 생성하는 변환기가 버퍼문자입출력 : BufferedReader/BufferedWriter 클래스 문자배열을통하여문자를입출력할때문자버퍼를이용 바이트버퍼스트림과같이속도를향상시킬목적으로사용
버퍼문자입출력 버퍼를이용해서입출력성능을향상시키는클래스들 클래스이름 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter 설명바이트입력스트림을버퍼링하는클래스바이트출력스트림을버퍼링하는클래스문자입력스트림을버퍼링하는클래스문자출력스트림을버퍼링하는클래스
표준입출력 표준입출력 초기유닉스계열운영체제에서사용하는개념 프로그램이시작되면기본적으로입출력파일이하나씩생성이되며이것은실제파일이라기보다는파일형식으로키보드입력과모니터출력이가능하도록한것 해당객체 : System.in, System.out 관련메소드 : System.setIn(), System.setOut(), System.setErr()
InOutStreamReader 의활용 import java.io.*; public class test0 { public static String input(string input)throws IOException{ System.out.println(input+":"); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String message = br.readline(); return message; } public static void main(string[] args) throws IOException { String id = input("id"); OutputStreamWriter out = new OutputStreamWriter(System.out); out.write("id:"+id); out.close(); } }
라인문자입출력 LineNumberReader/PrintWriter LineNumberReader 클래스 문자열입력을한행씩끊어서입력받음 행단위로문자열을입력받기때문에텍스트문서를입력받을때자주사용되는클래스 PrintWriter 클래스 PrintStream 과유사 모든기본형데이터및객체데이터를문자열로출력할수있도록하기때문에화면출력에자주사용 System.out.println() 메소드와같은형태로동작하며, 대부분의데이터를문자열로출력하는데사용 보통텍스트문서출력은 PrintWriter 객체를이용하고, 출력된문서를줄단위로입력받을때는 LineNumberReader 객체를이용한다.
라인문자입출력 LineNumberReader/PrintWriter 우리는민족중흥의역사적사명을띠고이땅에태어났다. 조상의빛난얼을오늘에되살려, 안으로자주독립의자세를확립하고, 밖으로인류공영에이바지할때다. 이에, 우리의나아갈바를발혀교육의지표로삼는다. LineNumberReader 객체의동작 LineNumberReader 국민교육헌장.txt readline() 이에, 우리의나아갈바를발혀교육의지표로삼는다. readline() 조상의빛난얼을오늘에되살려, 안으로자주독립의자세를확립하고, 밖으로인류공영에이바지할때다.. readline() 우리는민족중흥의역사적사명을띠고이땅에태어났다.
기타문자입출력 PushbackReader, PipedReader/PipedReader 클래스 자바프로그램내부에서스트림객체를공유할때사용하는문자파이프클래스 StringReader/StringWriter 클래스 문자열객체를소스로하는 Reader 클래스 문자열객체를싱크로하는 Writer 클래스 객체변수로접근가능 CharArrayReader/CharArrayWriter 클래스 문자배열객체를소스로하는 Reader 클래스 문자배열객체를싱크로하는 Writer 클래스 객체변수로접근가능
객체직렬화 객체직렬화 (object serialization) 객체자체를입출력하는방법 = 객체스트림방식객체를바이트단위로나누어입출력이가능하도록하는과정 ObjectOutputStream File Object ObjectInputStream header Class Information Short Field Values Object Handle Long Field Values Serializable (interface) 객체직렬화와객체스트림의구조
객체입출력스트림 객체입출력클래스 ObjectInputStream 와 ObjectOutputStream ObjectInputStream 객체를입력바이트스트림객체를생성자의인자값으로하여생성하며 readobject() 메소드를통하여객체를읽어올수있다. 다른기본데이터형의입출력도가능하다. ObjectOutputStream 출력바이트스트림객체를생성자의인자값으로하여생성하며 writeobject() 메소드를통하여객체를출력할수있다. 다른기본데이터형의입출력도가능하다.
객체직렬화 import java.io.*; class Customer implements java.io.serializable{ private String name; private int age; public Customer(String name,int age){this.name = name;this.age = age;} public String tostring(){ return " 이름 :"+name+", 나이 :"+age; } } public class test0 { public static void main(string[] args) throws IOException { try{ FileOutputStream fos = new FileOutputStream("c:\\test.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeint(2); oos.writeobject(new Customer(" 김동오 ",19)); oos.writeobject(new Customer(" 홍길동 ",29)); FileInputStream fis = new FileInputStream("c:\\test.ser"); ObjectInputStream ois = new ObjectInputStream(fis); int a = ois.readint();
객체직렬화 } for(int i=0; i<2; i++){ Customer c = (Customer) ois.readobject(); System.out.println(c); } }catch(exception e){e.printstacktrace();} }
비순차접근파일 (RandomAccessFile) RandomAccessFile 파일내용을직접읽고쓸수있음. cf. File 객체는파일을직접읽고쓸수없음 비순차적접근가능 cf. 스트림객체는순차적접근만가능 레코드기반의데이터를관리하는데효과적 접근이필요한위치에직접파일포인터를이동시킬수있기때문에큰크기의파일접근이유리하다. 생성자는문자열인 String 객체또는 File 객체를인자값으로하고, 파일접근속성을읽기전용 r 또는읽기쓰기 rw 로지정할수있다.
스트림토큰화 StreamTokenizer 클래스 파일에서데이터를읽을때각항목, 즉토큰단위로나누어읽도록해주는클래스 StreamTokenizer 클래스를사용하는순서 1 Reader 객체를인자값으로하여 StreamTokenizer 객체를생성한다. 2 설정메소드를이용해서필요한설정을한다. 3 nexttoken() 메소드를호출하여다음토큰을얻는다. 4 토큰을처리합니다. 5 nexttoken() 메소드를호출하여 StreamTokenizer.TT_EOF 를반환할때까지반복한다.
스트림토큰화 import java.io.*; public class test0 { public static void main(string[] args) throws IOException { try{ BufferedWriter bw = new BufferedWriter(new FileWriter("c:\\test.txt")); PrintWriter pw = new PrintWriter(bw,true); pw.println(123123); pw.println(" 하이 "+123352); pw.println("dokim@db.konkuk.ac.kr"); BufferedReader br = new BufferedReader(new FileReader("c:\\test.txt")); StreamTokenizer st = new StreamTokenizer(br); while(st.nexttoken()!=streamtokenizer.tt_eof){
}} 스트림토큰화 switch(st.ttype){ case StreamTokenizer.TT_WORD: System.out.println("Word:"+st.sval); break; case StreamTokenizer.TT_NUMBER: System.out.println("Number:"+(int)st.nval); break; default: System.out.println("etc:"+(char)st.ttype); break; } } bw.close(); br.close(); }catch(exception e){e.printstacktrace();}