본문 바로가기

자바

31. Java 입출력(I/O)

입출력(I/O)란 입력(Input)과 출력(Output)을 의미한다. 컴퓨터에 정보를 입력하는 행위는 input, 정보를 얻어 출력하는 행위는 output이라고 한다. 예를 들어 input은 파일 데이터를 읽고, 키보드의 데이터를 읽고, 네트워크상의 데이터를 읽는 일을 한다. 반면 output은 파일 데이터를 쓰고, 모티터에 데이터를 쓰고, 네트워크상에 데이터를 쓰는 일을 한다. 

 

java는 입출력 API로 inputStream, Reader & OutputStream, Writer 클래스를 지원한다. InputStream과 OutputStream은 1byte 단위를 지원하며 주로 이미지나 동영상 데이터를 처리할 때 사용한다. Reader와 Writer는 2byte 단위를 지원하고 주로 문자열처리에 사용한다. 

 

InputStream은 추상 클래스로 이것을 이용하여 여러 객체를 만들어야 한다. 또는 다른 클래스의 함수에서 반환되는 타입 객체를 얻는다. read() 메소드를 이용하여 데이터를 읽는다(read()와 read(byte[])를 이용).

package com.inputoutput;

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

public class HowToUseInputStream {
	public static void main(String[] args) {
		//I/O를 사용시 항상 try-catch문을 이용해야 한다.
		try {
			InputStream is = new FileInputStream("C:\\Users\\ASUS\\Desktop\\java_text.txt"); //해당 경로에 있는 문서를 불러온다.
			while(true) {
				int i = is.read(); //해당 문서에 있는 내용을 바이트로 변환하여 읽는다.
				System.out.println("데이터 : " + i);
				if(i == -1) {
					break;
				}
			}
		}
		catch(Exception e) {
			System.out.println(e.getMessage());
		}
		
	}
}

 

 

OutputStream은 추상 클래스로 이것을 이용하여 객체를 만든다. 또는 다른 클래스의 함수에서 반환되는 타입 객체를 얻는다. Write()메소드를 이용해서 데이터를 읽는다(Write()와 Write(byte[]), Write(byte[], int, int)를 이용).

package com.inputoutput;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class HowToUseOutputStream {
	public static void main(String[] args) {
		try {
			OutputStream os = new FileOutputStream("‪‪‪new_text.txt"); //경로에 맞게 해당파일을 생성하여 저장
			String str = "The weather is hot."; //입력할 내용
			byte[] bs= str.getBytes(); //str을 바이트 배열에 바이트로 변환하여 저장
			os.write(bs); //만들고 싶은 파일에 바이트 단위로 내용을 입력 
		} 
		catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

 

 

I/O 작업 시 반드시 해야 하는 예외처리는 IOException이다. I/O작업은 반드시 close()로 외부연결을 끝내야 한다.

package com.inputoutput;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class HowToUseClose {
	public static void main(String[] args) {
		OutputStream os = null;
		try {
			os = new FileOutputStream("close.txt");
			String str = "abc def ghi jkl mno";
			byte[] bs = str.getBytes();
			os.write(bs);
		} 
		catch (Exception e) {
			System.out.println(e.getMessage());
		}
		finally {
			try {
				if(os!=null) { //파일을 전부 다 읽었으면
					os.close(); //외부로부터 연결을 끊는다.
				}
			} 
			catch (Exception e2) {}
		}
	}
}

 

 

 

다음은 I/O를 이용한 파일 복사하기 예제이다.

package com.inputoutput;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class HowToUseCopy {
	public static void main(String[] args) {
		InputStream is = null;
		OutputStream os = null;
		
		try {
			is = new FileInputStream("close.txt");
			os = new FileOutputStream("close_copy.txt");
			
			byte[] bs = new byte[5]; //바이트 배열의 크기가 5인 것을 선언
			
			while(true) {
				int cnt = is.read(bs); //5바이트씩 한번에 넣어준다.
				if(cnt == -1) {
					break;
				}
				os.write(bs, 0, cnt); //bs에서 0부터 cnt까지의 바이트를 사용해라
			}
		} 
		catch (Exception e) {
			System.out.println(e.getMessage());
		}
		finally {
			if(is != null) {
				try {
					is.close();
				} 
				catch (Exception e2) {
					System.out.println(e2.getMessage());
				}
			}
			if(os != null) {
				try {
					os.close();
				} 
				catch (Exception e2) {
					System.out.println(e2.getMessage());
				}
			}
		}
	}
}

'자바' 카테고리의 다른 글

33. 싱크로나이즈  (0) 2019.08.21
32. 쓰레드  (0) 2019.08.21
30. Java Collection2  (0) 2019.08.14
29. Java collection1  (0) 2019.08.12
28. 예외 처리  (0) 2019.08.11