Archive

Java Day 18 IO - File

|

Java Day 18 IO - File


  1. 스트림

    • 데이터를 목적지로 입출력하기 위한 방법 * 스트림에서 데이터를 쓰고 읽을 수 있다
    • 연결하고자 하는 Device에 따라 다양한 스트림이 존재 * FIFO(First In First Out) 데이터 구조로 데이터의 순서가 바뀌지 않는다
    • 읽기, 쓰기 동시에 못한다 * 스트림은 넣어진 데이터가 처리되기 전까지는 스레드가 지연상태에 빠진다. 즉, 네트워크 내에서 데이터가 모두 전송되기 전까지는 네트워크 스레드가 지연상태가 됨
    • 용도에 따른 분류 * 1차 스트림 : Device에 직접적으로 연결되는 스트림
      • 2차 스트림 : Device와 직접 연결하지 않고 1차 스트림과 연결을 통해서 Device에 접근, 부가적인 기능들을 가지고 있음
        • 데이터 전송 방향에 따른 분류
      • 입력 스트림 : Device로부터 데이터를 읽어오는 스트림
      • 출력 스트림 : Device에 데이터를 기록하는 스트림
    • 데이터 전송 단위에 따른 분류
      • 바이트 스트림 : 한 byte 단위로 읽고 쓰는 스트림
      • 문자 스트림 : 한 문자(2 byte) 단위로 읽고 쓰는 스트림


  2. File 클래스

    • File 클래스는 파일 혹은 디렉토리의 등록정보를 표현하는 클래스
    • File 클래스는 실제 파일의 내용을 포함하지 않는다
    • File 객체는 실제 파일의 존재여부와 상관없이 생성됨
    /*
    * 생성자
    * File(String path-name) : 문자열 path-name을 경로로 File 객체 생성
    * File(String parent, String child) : parent와 child를 연결한 경로로 File 객체 생성
    * File(File parent, String child) : parent 객체 경로와 child를 연결해서 객체 생성
    *
    * 메소드
    * exists() : 파일,디렉토리가 존재하면 true, 아니면 false
    * isFile() : 파일이면 true, 아니면 false
    * isDirectory() : 디렉토리면 true, 아니면 false
    * getPath() : 상대경로 반환, getAbsolutePath() : 절대경로 반환
    * getName() : 파일 혹은 디렉토리의 이름 반환
    * length() : 파일의 길이를 바이트로 반환
    * lastModified() : 파일의 마지막 수정날짜 반환(1970/01/01부터 현재까지의 밀리초)
    * createNewFile() : 파일을 생성하면 true, 못하면 false
    * mkdir() : 디렉토리 생성하면 true, 생성하지 못하면 false
    * delete() : 파일을 지우면 true, 못지우면 false
    * list() : 모든 파일과 디렉토리를 String 배열로 반환
    * renameTo(File dest) : dest 파일 객체로 이름을 바꾸면 true, 아니면 false
    */
       
    //Main 메소드 생략
    File directory = new File("c:/");
    if(directory.isDirectory()) {
        String[] fileNameList = directory.list(); //list 배열로 전달
        for(String fileName : fileNameList) { //향상된 for문으로 요소 출력
            System.out.println("이름 : " + fileName);
        }
    }//C드라이브의 모든 파일과 폴더가 출력된다 (숨김파일,폴더도)
       
    File f1 = new File("c:/newFile.txt");
    f1.createNewFile(); //파일 생성
       
    File f2 = new File("c:/newDirectory/dest.txt");
    f1.renameTo(f2); //f1의 파일이 f2로 이름이 바뀌어 이동된다
    


  3. Byte Stream

    • InputStream과 OutputStream의 상속관계

    인풋

    아웃풋


    • InputStream과 OutputStream의 주요 메소드

    메소드


  4. FileInputStream과 FileOutputStream

    • 생성자

    생성자

    • 메소드는 부모 클래스인 Input,OutputStream의 메소드를 주로 사용함


    //메인 메소드 생략
    byte read[] = new byte[100];
    byte console[] = new byte[100];
       	
    System.out.println("파일경로 : ");
    System.in.read(console); // c:/new/test.txt 텍스트 폴더로 가정
    String file = new String(console).trim();
    FileInputStream fis = new FileInputStream(file);
    fis.read(read,0,read.length); //0~100바이트 만큼 읽어옴
    System.out.println(new String(read).trim());
       
    if(fis != null) fis.close(); //사용 후 반드시 닫아줘야함
       
    // c:/new/test.txt의 내용을 100바이트만큼 console창에 출력
    


    // 메인 메소드 생략
    FileOutputStream fos = new FileOutputStream("c:/myProject/123.txt");
       
    String msg = "안녕?";
    fos.write(msg.getBytes()); //문자열을 바이트코드로 변환해야한다
       
    if(fos != null) fos.close();
       
    // 123.txt 텍스트 파일에 '안녕?' 이라고 작성되어 있다
    
    • FileInputStream과 FileOutputStream으로 파일 복사도 가능하나 byte 배열의 길이를 [1024*8] = 8kb만큼 지정해주고 파일을 옮겨쓰기 하면 속도면에서 훨씬 차이가 난다.


  5. DataInputStream과 DataOutputStream

    • 특정 데이터 타입과 포맷을 유지한 채 데이터를 읽고 쓸 수 있는 스트림
    • 특정 데이터 타입과 포맷에 맞는 메소드 제공
    // 메인 메소드 생략
    DataOutputStream dos = new FileOutputStream("c:/myProject/123.txt");
    FileOutputStream fos = new DataOutputStream(fos);
    int i = 10;
    double d = 3.14;
    String s = "안녕?";
    dos.writeInt(i);	// 데이터 타입에 맞는 메소드
    dos.writeDouble(d);
    dos.writeUTF(s);
               
    if(fos != null) fos.close();
    if(dos != null) dos.close();
       
    // 123.txt에 인코딩된 언어로 적혀있다
       
    FileInputStream fis = new FileInputStream("c:/myProject/123.txt");
    DataInputStream dis = new DataInputStream(fis);
    int i = dis.readInt();		// * 기록한 순서대로 읽어야한다
    double d = dis.readDouble();
    String s = dis.readUTF();
    System.out.println("i : " + i); 
    System.out.println("d : " + d);
    System.out.println("s : " + s);
       
    // 기록한 순서대로 10, 3.14, 안녕? 이 출력
    


  6. 문자 스트림

    • 바이트 스트림에 추가로 Reader, Writer 클래스를 제공하는데 2byte를 입출력 할 수 있는 문자기반 스트림이다.
    • 1 byte를 입출력하는 바이트 스트림은 영어로 구성된 파일, 동영상, 음악 파일 등이 적합
    • 2 byte를 입출력하는 문자 스트림은 영어 이외의 세계 모든 언어로 된 파일 입출력이 적합
    • 문자 스트림의 상속관계

    Reader

    Writer


    • Reader 클래스의 주요 메소드

    Reader메소드

    • Writer 클래스의 주요 메소드

    Writer메소드


  7. FileReader와 FileWriter

    • Reader, Writer 계열의 스트림은 버퍼를 내장하고 있다. 버퍼가 가득 채워지면 스트림으로 내보내는데 flush()는 버퍼가 가득차지 않아도 내보낸다.
    // 메인 메소드 생략
    FileWriter writer = new FileWriter("c:/myProject/123.txt");
    String s = "안녕하세요?";
    writer.write(s); //한 글자 단위로 기록
    writer.flush(); //내장된 버퍼가 가득 
       
    if(writer != null) writer.close();
    //123.txt에 '안녕하세요?'가 작성되어 있다
       
    FileReader reader = new FileReader("c:/myProject/123.txt");
    int value = 0; //read()를 저장할 저장소
    while((value = reader.read()) != -1) {
        System.out.print((char)value);
    }//'안녕하세요?'가 출력된다
    


  8. BufferedWriter와 BufferedReader

    • 스트림의 읽고 쓰는 성능을 개선하기 위해 내부에 버퍼를 가지고 있는 스트림
    // 메인 메소드 생략
    FileWriter fw = new FileWriter("c:/myProject/123.txt");
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write("테스트");
    bw.newLine(); //한 줄 띄우기
    bw.write("입니다" + System.getProperty("line.separator")); ////한 줄 띄우기
    bw.write("안녕?");
    bw.flush(); //버퍼 비우기
    //123.txt에 한 줄씩 입력
       
    FileInputStream fis = new FileInputStream("c:/myProject/123.txt");
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader br = new BufferedReader(isr);
    String str = null;
    while((str = br.readLine()) != null) { //한 줄씩 읽어오기
        System.out.println(str);
    }
    //테스트
    //입니다
    //인녕?
    //한 줄씩 출력된다
    


  9. PrintStream과 PrintWriter

    • 모든 자료형을 출력 할 수 있는 print(), println() 메소드가 있다
    • 다른 스트림과 다르게 생성자로 Auto Flush 기능을 사용 할 수 있다




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료