728x90
IO (Input & Output) 

 

IO클래스 : Input & Output의 약자로서, 내외부의 데이터 자료를 사용해야 할 때 유용한 클래스이다.

 

스트림(Stream) : 입출력 장치에서 데이터를 읽고 쓰기 위해서 자바에서 제공하는 클래스로,

데이터가 지나다니는 길이라고 생각하면 된다. 

  • 자바에서 모든 데이터는 스트림을 통해 입출력된다.
  • 모든 스트림은 단방향으로만 통신이 가능하다. (입출력을 동시에 수행할 수 없다)
  • 외부에서 내부로 들어오는 InputStream과, 내부에서 외부로 나가는 OutputStream이 있으며,
    하나의 스트림으로 동시에 두 가지 흐름을 제어할 수는 없다.
  • 실제 프로그램에서 데이터의 입력은 '키보드, 파일 ,네트워크' 로부터 입력될 수 있고,
    데이터의 출력은 '모니터의 화면, 파일' 로 출력될 수 있다.

예제 1.

<ByteArrayIOStream>

public class IOTest01 {
	public static void main(String[] args) {
		//바이트 배열을 만들고 거기 값을 읽어오기
		byte[] input = { 1, 3, 5, 7, 9, 12, -1, 15, 18, 21, 90 };
		byte[] output = null;
		
		//input 통로 생성
		ByteArrayInputStream bais = null;
		bais = new ByteArrayInputStream(input);
		
		//output 통로 생성
		ByteArrayOutputStream baos = null;
		baos = new ByteArrayOutputStream();
		
		//읽거나 쓰는 바이트를 담을 변수
		int data = 0;
		//읽은 data를 검사해서 -1이면 read()중지하기
		//-1은 더이상 읽을 값이 없다는 반환값
		//스트림에서 하나의 바이트를 읽는 대표적 메소드read()
		//read() : 읽은 바이트의 값을 정수(int)로 리턴
		
		while (true) {
			data = bais.read();	//하나하나 읽어오기
			if(data == -1) {
				break;
			}
			baos.write(data);	//옮긴 결과
		}
		
		output = baos.toByteArray();
		
		System.out.println(Arrays.toString(input));
		System.out.println(Arrays.toString(output));
		System.out.println("두개 비교하기");

[실행결과]

[1, 3, 5, 7, 9, 12, -1, 15, 18, 21, 90]
[1, 3, 5, 7, 9, 12, -1, 15, 18, 21, 90]
두개 비교하기

예제 2.

<ByteArrayIOStream 2>

package IO;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

//여러개 읽어오기
public class IOTest02 {
	public static void main(String[] args) {

		byte[] input = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
		byte[] output = null;
		
		//.read 할 때 데이터를 읽을 배열이 필요하므로 미리 선언해두어야 한다. 
		byte[] temp = new byte[3];
		
		ByteArrayInputStream bais = new ByteArrayInputStream(input);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		int data;
		
		try {
			//.read(배열) : 배열의 길이 반환
			//만약 bais에 값이 없다면 -1 반환
			while ((data = bais.read(temp)) != -1) {		
				
				System.out.println("data : " + data);
				//.write(배열, 시작위치, 끝위치);
				baos.write(temp, 0, data);
				
			} 
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		output = baos.toByteArray();
		System.out.println(Arrays.toString(input));
		System.out.println(Arrays.toString(output));

	}
}

[실행결과]

data : 3
data : 3
data : 3
data : 3
data : 1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

예제 3.

<ByteArrayIOStream 3>

package IO;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class IOTest03 {
	public static void main(String[] args) {
		
		byte[] input = {0,1,2,3,4,5,6,7,8,9,-1};
		byte[] output = null;
		byte[] temp = new byte[3];
		
		ByteArrayInputStream bais = new ByteArrayInputStream(input);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		//bais.available() : bais 속에 있는 값 전체의 수
		//bais.read(배열) : 배열의 길이 반환. 
		while (bais.available() > 0) {
			System.out.println(bais.available() + " 길이");
			try {
				int len = bais.read(temp);//temp를 통해 read한 만큼 bais의 길이는 줄어든다. 
				System.out.println(len + " temp속의 길이");
				baos.write(temp, 0, len);//내용, 시작, 끝. (끝 index의 값은 포함되지 않음) 
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		output = baos.toByteArray();
		System.out.println(Arrays.toString(input));
		System.out.println(Arrays.toString(output));
		
	}
}

[실행결과]

11 길이
3 temp속의 길이
8 길이
3 temp속의 길이
5 길이
3 temp속의 길이
2 길이
2 temp속의 길이
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1]

예제 4.

<FileReader>

package IO;

import java.io.BufferedReader;
import java.io.FileReader;

public class IOTest04 {
	public static void main(String[] args) {
		
		FileReader fr = null;//파일 읽어오는 변수
		BufferedReader br = null;//불러온 파일을 보여주는 변수
		
		try {
			//fr = new FileReader("c:\\temp\\temp.txt"); 와 같은 표현
			fr = new FileReader("c:/temp/temp.txt");
			
			//문자열을 이어서 한 객체에 넣어두고 출력하기 위해서 스트링 버퍼를 사용
			StringBuffer sb = new StringBuffer();
			
			//.readLine() : 한 줄 읽기 
			//line에 br의 한 줄을 읽어서 저장
			//더이상 저장할 것이 없으면 반복문 멈추기
			br = new BufferedReader(fr);
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

[실행결과]

c:/temp/temp.txt CONTENT

 

(c:/temp/temp.txt 속의 내용)

예제 5.

<FileIOStream>

package IO;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class IOtest05 {
	public static void main(String[] args) {
		
		//파일 경로를 주고 해당 파일을 읽어오고 파일로 출력하기
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			fis = new FileInputStream("c:\\temp\\temp.txt");
			fos = new FileOutputStream("c:\\temp\\out.txt");
			
			int data = 0;
			byte[] temp = new byte[5];
			
			while ((data = fis.read(temp)) != -1) {
				fos.write(temp, 0, data);
			}
			
			System.out.println("파일 저장 완료");
			
			while ((data = fis.read(temp)) != -1) {
				char c = (char) data;
				fos.write(c);
			}		
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				fos.close();
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}

[실행결과]

파일 저장 완료

 

(c:/temp/temp.txt 속의 내용을 c:/temp/out.txt 에 출력 )

예제 6.

<FileInputStream 없이 FileOutputStream에 직접 쓰기>

package IO;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOTest06 {
	public static void main(String[] args) {
		
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("c:\\temp\\fos.txt");

			for (int i = 0; i < 10; i++) {
				String data = i + "번째 줄 입력 \r\n";//줄바꿈
				fos.write(data.getBytes());//바이트로 파일에 직접쓰기
			}
			System.out.println("저장완료 ");
			/* FileOutStream에 값을 쓸 때는 byte로 변환합니다.
			 * getByte()를 이용했습니다.
			 * FileWriter는 String을 직접 씁니다.
			 * 
			 */
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		}	
	}
}
  • close( ) : 열린 파일 객체를 닫아주는 메소드
    자바가 종료될 때 열린 파일의 경우 자동으로 닫아주기는 하지만 직접 닫아주는 것이 좋은데,열었던 파일을 닫지 않고 다시 사용하려고 하면 에러가 나는 경우가 있기 때문이다.

[실행결과]

저장완료

 

(c:/temp/fos.txt 에 (0 ~ 9번째 줄 입력 \r \n) 출력)

 

예제 7.

<FileWriter>

package IO;

import java.io.FileWriter;
import java.io.IOException;

public class IOTest07 {
	public static void main(String[] args) {
		try {
			FileWriter fw = new FileWriter("c:\\temp\\fileWriter.txt");
			for (int i = 0; i < 10; i++) {
				String data = i + "번째 입니다. \r\n";
				fw.write(data);//String이 그대로 들어갔습니다.
			}
			fw.close();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}
}

[실행결과]

 

(c:/temp/fileWriter.txt 에 (0 ~ 9번째 입니다. \r \n) 출력)

예제 8.

<FileWriter 2>

package IO;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class IOTest08 {
	public static void main(String[] args) {
		//사용자가 -1이라고 입력하면 입력을 멈추고 입력된 내용을 저장하기
		Scanner sc = new Scanner(System.in);
		StringBuffer sb = new StringBuffer();
		String temp = "";

		while (true) {//입력대기 만들기
			System.out.println("입력할 문장을 입력하세요.");
			System.out.println("-1을 입력하면 종료됩니다.");
			temp = sc.next();
			if(temp.equals("-1")){
				break;
			}
			sb.append(temp + "\r\n");//줄바꿈 포함해서 sb에 저장
		}
		
		try {
			FileWriter fw = new FileWriter("c:\\temp\\write.txt");
			fw.write(sb.toString());
			fw.close();
			
			//저장된 내용을 화면에 출력하기
			FileReader fr = new FileReader("c:\\temp\\write.txt");
			BufferedReader br = new BufferedReader(fr);//fr보다 조금 더 큰
			
			//위 두 문장을 합친다면 아래와 같이 
			BufferedReader br2 = 
					new BufferedReader(
							new FileReader("c:\\temp\\write.txt"));
			
			String line = "";
			while ((line = br.readLine()) != null) {//읽을것이 없으면 null			
				System.out.println(line);
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}
}

[실행결과]

입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
1번째 문장
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
2번째_문장
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
3번째문장
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
4번째문장!
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
5..번..째..문..장..
입력할 문장을 입력하세요.
-1을 입력하면 종료됩니다.
-1
1번째
문장
2번째_문장
3번째문장
4번째문장!
5..번..째..문..장..

(c:/temp/write.txt 에 해당 출력값 출력)

예제 9.

<FileWriter 이어쓰기>

  • FileWriter("경로",true)
package IO;

import java.io.FileWriter;
import java.io.IOException;

//FileWriter 이어쓰기
public class IOTest09 {
	public static void main(String[] args) {
		
		try {
			FileWriter fw = new FileWriter("c:\\temp\\write.txt");
		
			for (int i = 0; i < 10; i++) {
				String data = i + "번째 줄을 씁니다.\r\n";
				fw.write(data);
			}
			fw.close();
			
			//이어쓰기 
			FileWriter fw2 = new FileWriter("c:\\temp\\write.txt", true);
			
			for (int i = 10; i < 20; i++) {
				String data = i + "번째 줄을 씁니다.\r\n";
				fw2.write(data);
			}
			fw2.close();
			
			
			System.out.println("이어쓰기 완료");
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
}

[실행결과]

이어쓰기 완료

 

(c:/temp/write.txt 에 (0 ~ 9 번째 줄을 씁니다. \r \n) 출력 후 이어서

(10 ~ 19 번째 줄을 씁니다. \r \n) 출력)

'JAVA' 카테고리의 다른 글

아파치 POI 설치방법  (0) 2021.07.27
VirtualBox 설치방법  (0) 2021.07.27
내부 클래스 (Inner Class)  (0) 2021.07.27
이진 트리 (Binary Tree)  (0) 2021.07.26
예외처리 (Exception)  (0) 2021.07.26

+ Recent posts