본문 바로가기
BackEnd/Java

[Java] IO Stream

by summer_light 2021. 7. 26.

입출력 스트림 IO Stream

자바에서 데이터는 스트림(stream)을 통해 입출력된다.
스트림은 단방향으로 연속적으로 흘러가는 것을 말한다.
물이 높은 곳에서 낮은 곳으로 흐르듯, 데이터도 출발지에서 나와 도착지로 들어간다.
프로그램이 데이터를 입력받을 때는 입력스트림, 데이터를 내보낼 때는 출력스트림이라고 한다.
실제 프로그램에서는 데이터의 입력은 키보드, 파일, 네트워크로부터 입력될 수 있다.
데이터의 출력은 모니터 화면이나 파일로 출력될 수 있다. 

EX01. ByteArrayInput(Output)Stream

package IO;

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

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;
		
		//인풋 통로 생성
		ByteArrayInputStream bais = null;
		bais = new ByteArrayInputStream(input);
		
		//아웃풋 통로 생성
		ByteArrayOutputStream baos = null;
		baos = new ByteArrayOutputStream();
		
		//읽거나 쓰는 바이트를 담을 변수
		int data = 0;
		
		
		//읽은 data를 검사해서 -1이면 read()중지하기
		//-1은 더이상 읽을 값이 없을 때의 반환값
		//read() : 읽은 바이트의 값을 정수(int)로 리턴
		//스트림에서 하나의 바이트를 읽는 대표적 메소드
		while (true) {
			//.read(): 괄호 안에 숫자 없으면 하나씩
			data = bais.read();//하나하나 읽어오기 //Array 처음부터 순서대로 
			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("두개 비교하기");
		
	}
}

 

EX02. ByteArrayInput(Output)Stream - 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));

	}
}

EX03. ByteArrayInput(Output)Stream - 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));
		
	}
}

 

EX04. 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();
		}
		
	}
}

 

EX05. FileInput(Output)Stream

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();
			}
		}
		
	}
}

 

EX06. FileInputStream 없이 FileOutputStream에 직접 쓰기

※ close: 열린 파일 객체를 닫아주는 메소드
자바가 종료될 때 열린 파일의 경우 자동으로 닫아주기는 하지만 직접 닫아주는 것이 좋은데,

열었던 파일을 닫지 않고 다시 사용하려고 하면 에러가 나는 경우가 있기 때문이다.

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();
				}
				
			}
		}	
	}
}

 

EX07. 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();
		}
		
	}
}

 

EX08. 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();
		}
		
		
	}
}

 

EX09. 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 = 0; i < 10; i++) {
				String data = i + "번째 줄을 씁니다.\r\n";
				fw2.write(data);
			}
			fw2.close();
			
			
			System.out.println("이어쓰기 완료");
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
}

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

[Java] 자바로 Excel 파일 만들기  (0) 2021.07.27
[Java] 아파치 POI 설치 및 사용법  (0) 2021.07.26
[Java] 내부 클래스 Inner Class  (0) 2021.07.22
[Java] 예외 Exception  (0) 2021.07.19
[Java] 2진트리 Binary Tree  (0) 2021.07.19

댓글