자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민
File Class File 클래스 파일의읽고쓰기를제외하고파일과디렉토리에대한필요한많은기능등을제공 파일과디렉토리의정보를조사하고, 이들을생성및삭제하는메소드등이 File 클래스에포함 File 클래스의생성자 File(File parent, String child) File(String pathname) File(String parent, String child) File(URI uri) 2
File 클래스의메소드 boolean exists() : 지정한파일또는디렉토리가존재하는지여부를리턴합니다. boolean isdirectory() : 지정한경로가디렉토리인지의여부를리턴합니다. boolean isfile() : 지정한경로가파일인지의여부를리턴합니다. boolean canread() : 지정한파일이읽기가능한지의여부를리턴합니다. boolean canwrite() : 지정한파일이쓰기가능한지의여부를리턴합니다. long length() : 파일의길이를리턴합니다. String[] list() : 해당경로에있는파일과디렉토리의목록을 String 배열로리턴합니다. File[] listfiles() : 해당경로에있는파일의목록을 File 배열로리턴합니다. String getname() : 해당경로에있는파일이나디렉토리의이름을리턴합니다. String getparent() : 해당경로의상위디렉토리의경로명을리턴합니다. String getpath() : 인스턴스가가지고있는경로명을문자열로리턴합니다. 3
File 클래스의메소드 boolean createnewfile() : 인스턴스가가리키고있는이름대로파일을생성합니다. boolean delete() : 인스턴스가가리키고있는파일또는디렉토리를삭제합니다. void deleteonexit() : delete 와같은일을하지만 Vitrual Machine 이종료될때삭제가일어납니다. boolean mkdir() : 인스턴스가가리키고있는경로대로디렉토리를만듭니다. boolean mkdirs() : mkdir 과같은일을하지만, 디렉토리구조전체를만들어줍니다. boolean renameto(file) : 기존파일의이름을바꿉니다. boolean setreadonly() : 해당파일을읽기전용파일로만듭니다. 4
[NOTE] File 클래스에관한 OCJP 문제출제경향 ( 가장빈도가높은것 ) 메소드의이름과기능을정확하게알고있는가에관한문제 함정문제가많이출제되므로 API 문서를참고하시고특히메소드의이름을잘숙지. 5
File 의사용 인스턴스의생성 File file = new File("scjp.txt"); 파일의존재유무확인 File file = new File("scjp.txt"); if(!file.exists()) { System.out.println(file.getName() + " is not exists!"); System.exit(0); } 6
파일 / 디렉토리판정 File file = new File("c:\windows"); if(file.isdirectory()) System.out.println(file.getName() + " is a directory."); if(file.isfile()) System.out.println(file.getName() + " is a file."); 7
파일의경로정보 File 클래스의주된기능 지정된파일또는디렉토리에관한정보를알려주는기능 특히, File 클래스를통해파일의경로 (path) 에관한정보를다양한형식으로알아낼수있음. 주요메소드 getpath() 메소드는인스턴스를만들때생성자로입력된경로명을리턴 (abstract pathname 이라고합니다 ) getabsolutepath() 메소드는생성자로입력된경로명을절대경로로바꾸어서리턴 즉, 생성자로입력된경로명이상대경로일경우에는프로그램이실행된디렉토리를기준으로하여절대경로로바꾸는작업 8
파일의경로정보 메소드는얻어진절대경로를시스템에서사용하는형식의 getcanonicalpath() 메소드는좀더정규화된형태의절대경로를리턴하는메소드 getcanonicalpath() 절대경로로바꾸어줌, 예를들어유닉스시스템의경우심볼릭링크로연결된파일을실제의경로로바꾸는작업 윈도우시스템의경우드라이브문자를대문자로바꾸어주고실제존재하는파일의경우대소문자까지원래의파일명과같이맞추어줌 ( 윈도우시스템은대소문자를구별하기는하지만대소문자를틀리게입력해도같은파일 / 폴더로간주 ) 따라서 getabsolutepath() 보다정확한경로명을리턴하는 getcanonicalpath() 를사용하기를추천 9
파일의경로정보 다만, getcanonicalpath() 메소드를사용할때에는한가지주의할점 경로를알아내는다른명령어와는달리이메소드는시스템에파일시스템정보를요청하기때문에 IOException 을발생시킬수있도록설계되었다는점 따라서 getcanonicalpath() 를사용할때에는반드시 IOException 을처리 (try-catch) 하도록해야함. 10
파일및디렉토리의생성과삭제, 변경 File 클래스를사용하여파일이나디렉토리를생성 우선생성할파일이나디렉토리의경로명으로 File 클래스인스턴스를생성 File file = new File( 생성할파일또는디렉토리의경로 ); 파일을만들기위해서는 createnewfile(), 디렉토리를만들기위해서는 mkdir() 이나 mkdirs() 메소드를사용 이들메소드는이미파일객체가경로명을가지고있기때문에아무런파라미터도전달하지않아도됨. 11
파일및디렉토리의생성과삭제, 변경 mkdir() 메소드와 mkdirs() 메소드의차이해당디렉토리의상위디렉토리구조가없을경우, 이를만들어주느냐의차이입니다. mkdirs() 메소드는주어진경로명에포함된모든디렉토리구조를만들어줌 File dir = new File("language/java/scjp"); dir.mkdir(); dir.mkdirs(); 위의예에서아직 language 나 java 디렉토리가아직없는경우 mkdir() 메소드는디렉토리를만들지못했음을뜻하는 false 를리턴 mkdirs() 메소드는 language 나 java 디렉토리까지전부만들어줌 12
파일및디렉토리의생성과삭제, 변경 createtempfile() 이라는메소드 createnewfile() 메소드와성격은약간다르지만, 파일을만드는기능은동일한메소드 static 메소드임 ( 따라서, 아래예제와같이사용가능 ) 프로그램에서사용하기위한임시파일을생성 File file = File.createTempFile( 파일명, 확장자 ); File file = File.createTempFile( 파일명, 확장자, 디렉토리명 ); 13
파일및디렉토리의생성과삭제, 변경 import java.io.*; public class Test { public static void main(string[] args) throws IOException { File file = new File("scjp"); System.out.println("the file exists : " + file.exists()); file.createnewfile(); System.out.println("File created."); System.out.println("the file exists : " + file.exists()); if(file.isfile()) { System.out.println("this object is file."); } else if(file.isdirectory()) { System.out.println("this object is directory."); } } } 14
import java.io.*; public class Test { public static void main(string[] args) throws IOException { } } File file = new File("abc/../pds/java"); System.out.println(file.getPath()); System.out.println(file.getAbsolutePath()); System.out.println(file.getCanonicalPath()); 15
Which one gets the name of the parent directory of file "file.txt"? a. String name = File.getParentName("file.txt") b. String name = (new File ("file.txt").getparent()); c. String name = (new File ("file.txt").getparentname()); d. String name = (new File ("file.txt").getparentfile()); e. Directory dir = (new File ("file.txt").getparentdir()); f. String name = dir.getname(); 16
스트림 Stream 데이터의입출력을데이터의흐름 (stream) 처럼취급하는방법 자바에서입출력의핵심 자바에서는이 stream 을추상화하여 InputStream 과 OutputStream 두개의클래스를제공 Stream 과추상화 (abstraction) Stream 을사용하면 local machine 에있는파일이나네트웍을통해전달되는데이터등을모두같은방법으로처리할수있다는장점 사용자는실제데이터가있는정확한위치에대한정보를조사하거나데이터의입출력방법을따로정의하거나할필요없이 stream 을제어하는방법만알면됨 17
InputStream 의하위클래스상속관계 자바에서는제공하는 Stream 클래스 입력을위한 InputStream 추상클래스와출력을위한 OutputStream 추상클래스 용도에따라많은클래스들이이들의하위클래스로정의됨 자바에서제공하는대표적인입출력 stream 클래스들의계층구조는다음슬라이드와같음 18
OutputStream 의하위클래스상속관계 InputStream - FileInputStream - FileterInputStream - BufferedInputStream - DataInputStream - ObjectInputStream - ByteArrayInputStream - PipedInputStream OutputStream - FileOutputStream - FilterOutputStream - BufferedOutputStream - DataOutputStream - ObjectOutputStream - ByteArrayOutputStream - PipedOutputStream 19
FileOutputStream 을이용해서파일을생성 import java.io.*; public class Test { public static void main(string[] args) throws IOException { File file = new File("scjp.txt"); FileOutputStream fos = new FileOutputStream(file); for(int i=0;i<5;i++) { } fos.write(i); fos.close(); if(file.exists()) System.out.println("File length : " + file.length()); } } 20
자바 Stream 의 2 가지분류 자바에서스트림은그용도에따라두가지로나눌수있는데, 하나는데이터를제공하는소스로부터직접데이터를읽어오는일을하는스트림 File 스트림이 스스로데이터를읽어오는기능을가지고있지는않지만, 다른스트림으로부터데이터를입력받아좀더발전된형태로가공하는스트림. 즉, 스트림을거르는스트림 filter 스트림 filter 스트림의최상위클래스는 InputStream /OutputStream 의서브클래스인 FilterInputStream 과 FilterOutputStream 클래스임 21
자바 Stream 의 2 가지분류 FilterInputStream 과 FilterOutputStream 은실제로자주사용되지는않지만, 다른스트림으로부터데이터를받아가공하기위한중요한기능하위클래스들을위해제공 Fileter 스트림에는여러가지가있는데, Data 스트림과 Buffered 스트림에대해살펴보도록함. 22
자바 Stream 의 2 가지분류 Data 스트림도입필요성 기본적인 InputStream 과 OutputStream 은 byte 단위의이진데이터의읽고쓰기만을지원 따라서좀더데이터를융통성있게다루기위해만들어진 filter 스트림이 Data 스트림입니다. Data 스트림 자바의기본데이터타입을스트림을통해읽고쓸수있도록지원 즉 byte 나 int 등의수치형, char 형, char 의집합이라고할수있는 String, 그리고마지막으로 UTF(Unicode Text Format) 방식으로인코딩된문자열을읽고쓸수있도록함 23
import java.io.*; public class Test { public static void main(string[] args) throws IOException { File file = new File("scjp.txt"); FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); int value[] = new int[10]; for(int i=0;i<10;i++) { value[i] = dis.readint(); } } } 24