명품 JAVA Programming
스트림 자바의 스트림 입출력 스트림 기본 단위 : 바이트 자바 입출력 스트림 특징 자바 스트림은 입출력 장치와 자바 응용 프로그램 연결 입출력 장치와 프로그램 사이의 데이타 흐름을 표현 입력 스트림 입력 장치로부터 자바 프로그램으로의 데이터 흐름 출력 스트림 자바 프로그램에서 출력 장치로의 데이터 흐름 입출력 스트림 기본 단위 : 바이트 자바 입출력 스트림 특징 단방향 스트림, 선입선출 구조
자바의 입출력 스트림 종류 바이트 입출력 스트림과 문자 입출력 스트림 JDK는 입출력 스트림을 구현한 다양한 클래스 제공 입출력되는 데이터를 단순 바이트의 스트림으로 처리 예) 바이너리 파일을 읽는 입력 스트림 문자 입출력 스트림 문자만 입출력하는 스트림 예) 텍스트 파일을 읽는 입력 스트림 JDK는 입출력 스트림을 구현한 다양한 클래스 제공 p.14~15
Formatter, Scanner 클래스를 이용한 파일 입출력
Formatter 생성자 메쏘드 Formatter( String filename ) Formatter( File file ) Formatter( OutputStream output ) 메쏘드 format( String format, … args ) 형식문자열을 이용하여, printf() 처럼 출력 close()
Formatter을 이용한 파일 쓰기 import java.util.Formatter; public class FormatterTest { public static void main( String[] args ) Formatter output = new Formatter( "numbers.txt" ); for(int i=0; i<10; i++) output.format( "%d\n", i); output.close(); }
FormatterTest.java import java.util.Formatter; public class FormatterTest { public static void main( String[] args ) { try { Formatter output = new Formatter( "numbers.txt" ); for(int i=0; i<10; i++) output.format( "%d\n", i); output.close(); } catch( Exception e ) { System.err.println( "Error" ); System.exit(1); $ java FormatterTest $ cat numbers.txt 1 2 …
Example_1.java Formatter 클래스를 이용하여 다음의 작업을 하 는 프로그램을 작성하시오 파일 konkuk.txt을 생성한다. konkuk.txt에 아래와 같이 문자열을 저장한다. Computer Engineering Konkuk University
Example_2.java Formatter 클래스를 이용하여 다음의 작업을 하는 프로그램을 작성하시오 파일 mtable.txt을 생성한다. mtable.txt에 아래와 같이 구구단을 저장한다 2 x 1 = 2 2 x 2 = 4 … 2 x 9 = 18 3 x 1 = 3 3 x 2 = 6
Scanner 생성자 메쏘드 Scanner( String source ) Scanner( File file ) Scanner( InputStream input ) 메쏘드 nextInt() nextDouble() nextLine() next() hasNext()
ScannerTest.java $ java ScannerTest 1 2 … import java.util.Scanner; import java.io.File; public class ScannerTest { public static void main( String[] args ) { int n; try { Scanner input = new Scanner( new File( "numbers.txt" ) ); while( input.hasNext() ) { n = input.nextInt(); System.out.println( n ); } input.close(); catch( Exception e ) { System.err.println( "Error" ); $ java ScannerTest 1 2 …
Example_3.java Scanner 클래스를 이용하여 다음의 작업을 하는 프로그램을 작성하시오 konkuk.txt 파일의 내용을 읽어, 각 행을 거꾸로 화면에 출력한다. $ java Example_3 gnireenignE retupmoC ytisrevinU kuknoK
Example_4.java Scanner 클래스를 이용하여 다음의 작업을 하는 프로그램을 작성하시오 mtable.txt 파일의 내용을 읽어, 문자의 수와 행의 수를 화면에 출력한다 $ java Example_4 Number of chars: 786 Number of lines: 80
JDK의 문자 스트림 클래스 계층 구조 클래스 이름이 공통적으로 Reader/Writer로 끝남
JDK의 바이트 스트림 클래스 계층 구조 클래스 이름이 공통적으로 Stream으로 끝남
문자 스트림 문자 스트림 문자 스트림을 다루는 클래스 유니 코드로 된 문자를 입출력 하는 스트림 Reader/Writer 문자로 표현되지 않는 데이터는 다루지 않음 문자 스트림은 이미지, 동영상과 같은 바이너리 데이터는 입출력 할 수 없 음 - 문자 스트림은 문자 데이터만 입출력 가능 문자 스트림을 다루는 클래스 Reader/Writer java.io 패키지에 포함 추상 클래스. 문자 스트림을 다루는 모든 클래스의 슈퍼 클래스 InputStreamReader/OutputStreamWriter 바이트 스트림과 문자 스트림을 연결시켜주는 다리 역할 지정된 문자집합 이용 InputStreamReader : 바이트를 읽어 문자로 인코딩 OutputStreamWriter : 문자를 바이트로 디코딩하여 출력 FileReader/FileWriter 텍스트 파일에서 문자 데이터 입출력
FileReader, FileWriter 클래스를 이용한 파일 입출력
FileReader 생성자 메쏘드 FileReader( File file ) FileReader( String filename ) 메쏘드 int read( ) 한 문자를 읽어 정수형으로 리턴, -1 (if EOF) int read( char[ ] cbuf, int off, int len ) 최대 len 개의 문자를 읽어 cbuf의 off부터 저장, 읽은 문자의 수 리턴, -1 (if EOF) void close( )
예제 8-3 : FileReader를 이용한 텍스트파일 읽기 FileReader를 이용하여 사용자 홈디렉터리에 있는 mtable.txt 파일을 읽고 화 면에 출력하라. import java.io.*; public class FileReaderTest { public static void main( String[] args ) { FileReader in = null; try { // 파일로부터 문자 입력 스트림 생성 in = new FileReader( “mtable.txt“ ); int c; while ( (c = in.read()) != -1 ) // 한 문자씩 읽는다. System.out.print( (char) c ); in.close(); } catch ( IOException e ) { System.err.println( “IO eror“ ); 파일의 끝을 만나면 read()는 -1 리턴
WordCountUsingFileReader.java import java.io.FileReader; import java.io.IOException; public class WordCountUsingFileReader { public static void main( String[] args ) { FileReader textIn = null; try { textIn = new FileReader( args[0] ); int c; int nChars = 0; int nLines = 0; $ java WordCountUsingFileReader mtable.txt Number of chars: 786 Number of lines: 80 명령행 인자
while( (c = textIn. read( )) while( (c = textIn.read( )) != -1 ) { nChars++; if ( (char)c == '\n' ) nLines++; } System.out.println("Number of chars: " + nChars); System.out.println("Number of lines: " + nLines); textIn.close(); } catch( IOException e ) { System.err.println("IO Error."); System.exit(1); } } }
Example_5.java FileReader 클래스를 이용하여 다음의 작업을 하 는 프로그램을 작성하시오 명령행 인자로 파일이름을 입력 받는다. 파일의 내용을 읽어, 각 알파벳 문자를 시저 암호화(3 칸)하여 화면에 출력한다. 숫자와 특수문자는 그대로 출력한다. $ java Example_5 konkuk.txt Frpsxwhu Hqjlqhhulqj Nrqnxn Xqlyhuvlwb
FileWriter 생성자 메쏘드 FileWriter( File file ) FileWriter( String filename ) 메쏘드 void write( int c ) 한 문자를 char로 변환하여 출력 void write( char[ ] cbuf, int off, int len ) void write( String str, int off, int len) 인덱스 off부터 len 개의 문자를 출력 void close( )
FileWriter 사용 예 test.txt 파일에 문자 출력 스트림을 생성하는 코드 파일에 문자 출력 FileWriter fout = new FileWriter( "test.txt“ ); FileWriter fout = new FileWriter( "test.txt“ ); fout.write(‘A’); // 문자 ‘A’ 출력 fout.close();
예제 8-6 : 10개의 정수를 파일에 저장하기 0부터 10까지의 정수를 test.txt 파일에 저장하는 코드를 작성하라. import java.io.*; public class FileWriterTest { public static void main( String[] args ) { try { FileWriter fout = new FileWriter( "test.txt“ ); for( int i=0; i<10; i++) fout.write( ‘0’+1 ); fout.close(); } catch (IOException e) { System.err.println( “IO error“ ); $ java FileWriterTest $ cat test.txt 0123456789 실행 결과 test.txt 파일 생성
TextCopy. java import java. io. FileReader; import java. io TextCopy.java import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class TextCopy { public static void main( String[] args ) { FileReader textIn = null; FileWriter textOut = null; try { textIn = new FileReader( args[0] ); textOut = new FileWriter( args[1] ); int c; $ java TextCopy mtable.txt m.txt $ cat m.txt 2 x 1 = 2 …
while( (c = textIn. read( )). = -1 ) textOut. write( c ); textIn while( (c = textIn.read( )) != -1 ) textOut.write( c ); textIn.close(); textOut.close(); } catch( IOException e ) { System.err.println("IO Error."); System.exit(1); } } }
Example_6.java FileReader, Filewriter 클래스를 이용하여 다음의 작업을 하는 프로그램을 작성하시오 명령행 인자로 두 개 파일의 이름을 입력 받는다. 첫 번째 파일의 내용을 읽어, 각 알파벳 문자를 시저 암호화(3칸)하여 두 번째 파일의 내용으로 저장한다. 숫자와 특수문자는 그대로 출력한다. $ java Example_6 konkuk.txt konkuk2.txt $ cat konkuk2.txt Frpsxwhu Hqjlqhhulqj Nrqnxn Xqlyhuvlwb
바이트 스트림 클래스 바이트 스트림 바이트 스트림 클래스 바이트 단위의 바이너리 값을 읽고 쓰는 스트림 java.io 패키지에 포함 InputStream/OutputStream 추상 클래스 바이트 스트림을 다루는 모든 클래스의 슈퍼 클래스 FileInputStream/FileOutputStream 파일로부터 바이트 단위로 읽거나 저장하는 클래스 바이너리 파일의 입출력 용도
FileOutputStream을 이용한 파일 쓰기 바이너리 값을 파일에 저장하는 코드 FileOutputStream fout = new FileOutputStream("test.out"); int num[]={1,4,-1,88,50}; byte b[]={7,51,3,4,1,24}; for(int i=0; i<num.length; i++) fout.write(num[i]); fout.write(b); fout.close(); c:\test.out 파일을 열고, 출력 바이트 스트림인 객체와 연결 파일에 배열 num[i]의 정수 값(바이너리)을 그대로 기록 파일에 바이트 배열(바이너리) 값을 그대로 기록 스트림을 닫음. 파일도 닫힘. 더 이상 스트림으로부터 읽을 수 없음 파일에 있는 각 바이너리 값들은 문자 정보가 아님. 바이너리 값에 대응하는 그래픽 심볼들 test.out 파일의 내부
예제 8-2 : FileOutputStream을 이용한 파일 쓰기 정수(int) 타입의 결과 값을 FileOutputStream을 이용하여 파일에 저장한다. import java.io.*; public class FileOutputStreamEx { public static void main(String[] args) { try { FileOutputStream fout = new FileOutputStream(“test.out"); for (int i=0; i<10; i++) { int n = 10-i; // 계산의 결과를 저장 fout.write(n); // 파일에 결과값을 바이너리로 저장 } fout.close(); //스트림을 닫는다. } catch (IOException e) { System.out.println(“IO error");
예제 8-2-1 : FileInputStream을 이용한 파일 읽기 앞 슬라이드(예제 8-2)에서 생성한 파일(test.out)에 저장된 10개의 정수를 읽어 화면에 출력하는 프로그램을 작성하시오.
객체 읽기/쓰기 객체 직렬화(object serialization) 객체를 파일에 저장하기 위해서 객체를 일련의 바이트들로 표현 저장할 객체는 Serializable 인터페이스를 구현한 클래스이어야 함 Serializable 인터페이스는 tagging 인터페이스임 메쏘드를 포함하지 않음 단지 직렬화를 할 클래스임을 나타낼 뿐 ObjectInputStream( InputStream in ) 지정한 InputStream으로부터 객체를 읽어옴 readObject() 직렬화된 객체를 파일에서 읽어와 deserialize함. 객체를 생성하여 리턴 ObjectOutputStream( OutputStream out ) 지정한 OutputStream에 객체를 저장함 writeObject() 객체를 직렬화 하여 파일에 저장
스트림은 연결될 수 있다 InputStreamReader rd = new InputStreamReader(System.in); * 별 모양의 쿠키를 굽는 스트림 * 표준 입력 스트림 System.in에 InputStreamReader 스트림을 연결하는 사례 InputStreamReader rd = new InputStreamReader(System.in); int c = rd.read(); // 키보드에서 문자 읽음
예제 8-7 : 객체 직렬화 Employee.java import java.io.Serializable; 예제 8-7 : 객체 직렬화 Employee.java import java.io.Serializable; public class Employee implements Serializable { private String name; private String ssn; public Employee(String name, String ssn) { this.name = name; this.ssn = ssn; } @Override public String toString() { return String.format( "Employee: %s (%s)", name, ssn );
예제 8-7 : 객체 직렬화 ObjectOutputStreamTest.java import java.io.*; 예제 8-7 : 객체 직렬화 ObjectOutputStreamTest.java import java.io.*; public class ObjectOutputStreamTest { public static void main( String[] args ) { Employee e1 = new Employee( "John", "111-111" ); Employee e2 = new Employee( "Susan", "222-222" ); Employee e3 = new Employee( "Bob", "333-333" ); int[] arr = { 100, 200, 300, 400 }; try { ObjectOutputStream output = new ObjectOutputStream( new FileOutputStream("employees.out") ); output.writeObject( e1 ); output.writeObject( e2 ); output.writeObject( e3 ); output.writeObject( arr ); output.close(); } catch( IOException e ) { System.err.println( "IO error" ); $ java ObjectOutputStreamTest $ ls employees.out employees.out
예제 8-7 : 객체 직렬화 ObjectInputStreamTest.java 예제 8-7 : 객체 직렬화 ObjectInputStreamTest.java import java.io.*; public class ObjectInputStreamTest { public static void main( String[] args ) { try { ObjectInputStream input = new ObjectInputStream( new FileInputStream("employees.out") ); Employee e1 = (Employee) input.readObject(); Employee e2 = (Employee) input.readObject(); Employee e3 = (Employee) input.readObject(); int[ ] arr = (int[ ]) input.readObject(); input.close(); System.out.println( e1 ); System.out.println( e2 ); System.out.println( e3 ); for( int n : arr ) System.out.printf( "%d ", n ); } catch( Exception e ) { System.err.println( "Error" ); $ java ObjectInputStreamTest Employee: John (111-111) Employee: Susan (222-222) Employee: Bob (333-333) 100 200 300 400
File 클래스 File 클래스 파일의 경로명을 저장하는 클래스 파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리 java.io.File 파일과 디렉터리 경로명의 추상적 표현 파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리 File 객체는 파일 읽고 쓰기 기능 없음 파일 입출력은 파일 입출력 스트림 이용
File 클래스 생성자와 주요 메소드
예제 8-8 : File 클래스 활용 File 클래스를 이용하여 현재 디렉토리에 있는 파일들의 이름을 나열한다. import java.io.File; import java.util.Date; public class FileClassEx { public static void main( String[] args ) { File f = new File( “.” ); if ( f.exists() && f.isDirectory() ) { System.out.println( f.getPath() + " is a directory" ); String[] dir = f.list(); for( String name : dir ) System.out.printf( " %s\n", name ); } $ java FileClassEx . is a directory FileClassEx.class Employee.class FileClassEx.java …
MyLs.java File 클래스를 이용하여 현재 디렉터리( . )에 있는 파일들에 대해 아래와 같이 정보를 출력한다. 파일크기 파일이름 $ java MyLs . is a directory -RW- 1740 Sat Nov 04 20:01:23 KST 2017 FileClassEx.class -RW- 572 Sat Nov 04 19:03:11 KST 2017 Employee.class DRWX 810 Sat Nov 04 20:01:20 KST 2017 examples … 마지막 수정일시 (lastModified() 메쏘드와 Date 클래스 활용) D / - : 디렉터리 여부 R / - : 읽기 권한 여부 (canRead() 메쏘드 활용) W/ - : 쓰기 권한 여부 (canWrite() 메쏘드 활용) X / - : 실행 권한 여부 (canExecute() 메쏘드 활용)
MyLs.java import java.io.File; import java.util.Date; public class MyLs { public static void main( String[] args ) File f = new File( "." ); if ( f.exists() && f.isDirectory() ) System.out.println( f.getPath() + " is a directory" ); String[] dir = f.list();
MyLs.java for( String name : dir ) { File file = new File( f, name ); System.out.print( file.isDirectory() ? 'D' : '-' ); System.out.print( file.canRead() ? 'R' : '-' ); System.out.print( file.canWrite() ? 'W' : '-' ); System.out.print( file.canExecute() ? 'X' : '-' ); System.out.printf( "%8d", file.length() ); System.out.printf( " %s", new Date(file.lastModified()) ); System.out.printf( " %s\n", name ); }