Programming/Java

15. JAVA 입출력(I/O)

주죵 2021. 1. 16. 14:28
728x90
반응형

I/O

public Class MainClass{

	public static void main(String[] args){
    
    	try {
    
    }

}

input과 output으로 컴퓨터에 입력하는게 input, 컴퓨터가 출력하는것이 output이다.

앞에서 줄기차게 봤던 System.out.println(); 구문이 output이다.

앞으로 어떤 데이터를 읽는다면 input이라 생각하면 되고, 데이터를 '쓴다'면 output이라 생각하면 된다.

 

입출력 API

InputStream, Reader & OutputStream, Writer

byte 단위로 나뉜다.

- InputStream, OutputStream : 1byte단위로 이미지, 동영상등의 데이터에 주로 사용한다.

- Reader, Writer : 2byte단위로 문자열에 주로 사용한다.

 

InputStream 

1) InputStream 추상클래스를 이용해 객체를 만든다. 또는 inputstream을 상속받은 다른 클래스의 메소드에서 반환되는 타입 객체를 얻는다2) read() 메소드를 이용해 데이터를 읽는다.- read() 메소드 : 1byte씩 읽으며 속도가 좀 느리다.- read(byte[]) 메소드 : Byte[] 만큼씩 읽어서 속도가 빠르다.

 

inputStream를 상속받는 클래스가 매~~ 우 많이있다.

그중 하나가 file을 읽는데 많이 쓰이는 FileinputStream이다. 그 밖의 다양한 클래스들은 API 문서를 참고하자

import java.io.FileInputStream;
import java.io.InputStream;

public class MainClass{

	public static void main(String[] args){
    
    	try {
        	InputStream is = new FileInputStream("경로")
            while(true){
            	int i = is.read();
                System.out.println("데이터 :" + i);
                if(i==-1) break;
            	}
            }catch(Exception e){
            	System.out.println(e.getMessage());
            }           
     
        }
        
    }

}

 

I/O 다룰때 Java에선 예외처리(try~catch / throws)를 강요한다. 참고하도록하자.

 

OutputStream

1) OutputStream 추상클래스를 이용해 객체를 만들거나, 상속받은 클래스의 메소드로 타입객체를 얻어도 된다. inputstream과 동일

2) write() 메소드를 이용 가능하다

- write()

- write(byte[])

- write(byte[],int,int) : 위의 두개는 input과 입력이냐 출력이냐의 차이정도로 보면 되고 이건 from 첫번째int to 두번째int 로 출력한다고 보면된다.

강사님의 설명으론 5byte씩 읽으며 처리하다가 맨 마지막부분에는 그보다 작은 3byte의 데이터만 읽는 경우를 예시로 들었다. 그런 경우에 5byte를 다 처리할것 없이 write(byte[3],0,2) 로 출력시킨다면 더 효율적일것이다

 

	public static void main(String[] args){
    
    	try {
        	OutputStream os = new FileOutputStream("경로")
            String str = "오늘은 날씨가 추워용~~.";
            byte[] bs = str.getByte(); //문자열의 byte를 배열로 반환하는 String의 메소드 getByte 사용
            os.write(bs);
            
          }catch(Exception e){
            	System.out.println(e.getMessage());
            }           
     
        }
        
    }

 

OutputStream도 마찬가지로 예외처리를 해줘야한다.

 

예외처리와 무조건 close()실행

I/O를 하면서 반드시 해야하는 예외처리는 IOException이다. 또한 파일(혹은 데이터)와의 연결을 끊어주지 않으면 계속 연결되어있는 상태가 유지된다. 따라서 close() 메소드를 이용해 연결 종료를 시켜줘야한다.

 

	public static void main(String[] args){
    	OutputStream os = new FileOutputStream("경로")
            
    	try {
        	String str = "오늘은 날씨가 추워용~~.";
            byte[] bs = str.getByte(); //문자열의 byte를 배열로 반환하는 String의 메소드 getByte 사용
            os.write(bs);
            
          }catch(Exception e){
            	System.out.println(e.getMessage());
          
          }finally{
          	try{
            	if(os!=null)os.close()
                }catch (IOException e){
                	System.out.println(e.getMessage());
                    }
                }
            }

위의 예제를 보면 finally를 이용해 close처리를 해주고 오류 발생시 IOException 처리를 하도록 예외처리까지 추가하였다.

 

DataInputStream / DataOutputStream

byte단위로 문자열 처리하던 inputStream Outputstream보다 편리하게 고안된 클래스다

while문이나 배열을 이용해 짜잘하게 데이터를 얻어오는게 아니라 한방에 얻어오는 기능이라고 생각하면 된다.

객체생성을 하고 읽고 쓸때 readUTF / writeUTF 메소드를 써주면 된다. (그외의 기본적 동작은 거의 똑같다고 봐도 된다)

 

 

다음시간은 JAVA 스레드에 대해서 살펴볼것이다.

 

출처 : 신입SW인력을 위한 실전 자바(by 블스)

728x90

'Programming > Java' 카테고리의 다른 글

17. JAVA 그래픽  (0) 2021.01.17
16. 스레드(Thread)  (0) 2021.01.16
14. JAVA Collections  (0) 2021.01.15
13. 예외처리  (0) 2021.01.13
12. API  (0) 2021.01.11