Published 2020. 4. 14. 22:23
728x90
반응형

입출력을 위한 인터페이스와 클래스들

 

자바 IO는 크게 byte단위 입출력과 문자 단위 입출력클래스로 나뉨
    - byte단위 입출력클래스는 모두 InputStream과 OutputStream이라는 추상클래스를 상속받아 만들어짐
    - 문자(char)단위 입출력클래스는 모두 Reader와 Writer라는 추상클래스를 상속받아 만들어집니다.
4가지 추상클래스(InputStream,OutputStreamReader,Reader,Writer)를 받아들이는 생성자가 있다면, 다양한 입출력방법을 제공하는 클래스임
4가지 클래스를 받아들이는 생성자가 없다면, 어디로부터 입력받을 것인지, 어디에 쓸것인지를 나타내는 클래스


파일로 부터 입력받고 쓰기 위한 클래스 : FileInputStream, FileOutputStream, FileReader, FileWriter
배열로 부터 입력받고 쓰기 위한 클래스 : ByteArrayInputStream, ByteArrayOutputStream, CharReader, CharWriter
    - 해당 클래스들은 어디로부터, 어디에라는 대상을 지정할 수 있는 IO클래스입니다. 이런 클래스를 장식대상 클래스라고 함


DataInputStream, DataOutputStream같은 클래스를 보면 다양한 데이터 형을 입력받고 출력함
PrintWriter는 다양하게 한줄 출력하는 pintln()메소드를 가지고있음
BufferedReader는 한줄 입력받는 readLine()메소드를 가짐
    - 이런 클래스들은 다양한 방식으로 입력하고, 출력하는 기능을 제공(장식 클래스)

 


Byte 단위 입출력


Byte단위 입출력 클래스는 클래스의 이름이 InputStream이나 OutputStream으로 끝남
파일로 부터 1byte씩 읽어들여 파일에 1byte씩 저장하는 프로그램을 작성
    - 파일로 부터 읽어오기 위한 객체 - FileInputStream
    - 파일에 쓸수 있게 해주는 객체 - FileOutputStream .
read()메소드가
    - byte를 리턴한다면 끝을 나타내는 값을 표현할 수가 없기 때문에, byte가 아닌 int를 리턴
    - 음수의 경우 맨 좌측 비트가 1이 됨. 읽어들일 것이 있다면 항상 양수를 리턴한다고 볼 수 있음.
FileInputStream과 FileOutputStream을 이용하여, 1바이트씩 읽어들여 1바이트씩 저장
    - read()메소드가 리턴하는 타입은 정수인데, 정수 4바이트중 마지막 바이트에 읽어들인 1바이트를 저장한다.
    - read()메소드는 더이상 읽어들일 것이 없을때 -1을 리턴한다.

public class ByteIOExam1 { 
    public static void main(String[] args){      
        FileInputStream fis = null;  
        FileOutputStream fos = null;         
        try { 
            fis = new FileInputStream("src/javaIO/exam/ByteExam1.java"); 
            fos = new FileOutputStream("byte.txt"); 

            int readData = -1;  
            while((readData = fis.read())!= -1){ 
                fos.write(readData); 
            }            
        } catch (Exception e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        }finally{ 
            try { 
                fos.close(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            try { 
                fis.close(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
    } 
} 

 


Byte 단위 입출력 심화


Byte단위 입출력 클래스는 클래스의 이름이 InputStream이나 OutputStream으로 끝남

파일로 부터 512byte씩 읽어들여 파일에 512byte씩 저장하는 프로그램을 작성
    - byte[] buffer = new byte[512];
    - 512byte만큼 읽어 들이기 위해 byte배열을 사용

public class ByteIOExam1 { 
    public static void main(String[] args){      
        //메소드가 시작된 시간을 구하기 위함 
        long startTime = System.currentTimeMillis();         
        FileInputStream fis = null;  
        FileOutputStream fos = null;         
        try { 
            fis = new FileInputStream("src/javaIO/exam/ByteExam1.java"); 
            fos = new FileOutputStream("byte.txt"); 

            int readCount = -1;  
            byte[] buffer = new byte[512]; 
            while((readCount = fis.read(buffer))!= -1){ 
                fos.write(buffer,0,readCount); 
            } 
        } catch (Exception e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        }finally{ 
            try { 
                fos.close(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            try { 
                fis.close(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
    //메소드가 끝났을때 시간을 구하기 위함.  
    long endTime = System.currentTimeMillis(); 
    //메소드를 수행하는데 걸린 시간을 구할 수 있음.  
    System.out.println(endTime-startTime);  
    } 
} 

- System.currentTimeMillis();System.currentTimeMillis();  //현재 시간을 롱타입으로 반환 

 

다양한 타입의 출력


try-with-resources 블럭 선언(사용한 자원을 자동으로 종료 시켜주는 기능)
    - java io객체는 인스턴스를 만들고, 모두 사용하면 close()메소드를 호출해야 함
    - close()메소드를 사용자가 호출하지 않더라도, Exception이 발생하지 않았다면 자동으로 close()가 되게 할 수 있는 방법

try( 
      //io객체 선언 
    ){ 
      //io객체 사용 
    }catch(Exception ex){ 
        ex.printStackTrace(); 
    } 


다양한 타입으로 저장 할 수 있는 DataOutputStream

    - wirteInt() - 정수값으로 저장
    - wirteBoolean() - boolean값으로 저장
    - writeDouble() - double 값으로 저장

import java.io.DataOutputStream; 
import java.io.FileOutputStream;    
 
public class ByteExam {     
    public static void main(String[] args) { 
        try( 
                DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt")); 
        ){ 
            out.writeInt(100); 
            out.writeBoolean(true); 
            out.writeDouble(50.5); 
        }catch (Exception e) { 
            e.printStackTrace(); 
        } 
    }    
}

 

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

04.16(자바 IO 예제)  (0) 2020.04.16
04.15(자바 IO - System.in.read();)  (0) 2020.04.15
04.13(객체)  (0) 2020.04.13
04.12(제어문-조건문, 반복문, 분기문 / 배열의 복사)  (0) 2020.04.12
04.10(error 알아보기)  (0) 2020.04.11
복사했습니다!