본문 바로가기
코리아 IT아카데미/Java

20일차 | 문자 단위 입출력 스트림

by Sharon kim 2021. 11. 12.

자바의 입출력을 위한 I/O 스트림


                      Input/Output


입출력 스트림의 구분
ㄴ 한방향으로 입력이 되거나 출력이 된다.

● 자료의 종류 : 바이트 스트림 / 문자 스트림
● 기능 : 기반 스트림 / 보조 스트림 
                                 ㄴ 데코레이션 스트림( 기반 스트림에 기능을 더함, 읽고쓰는기능 X )
              ㄴ입력하는 스트림만 주가 되는 스트림

스트림의 종류
인풋- 바이트 , 리더-문자 , 버퍼드 인풋, 리더 - 보조


바이트 입력 스트림1

package ch01;

import java.io.IOException;

public class SysteminTest1 {

	public static void main(String[] args) {
		
		System.out.println("알파벳 하나를 쓰고 Enter를 누르세요");
		
		int i;
		
		try {
			i = System.in.read(); //여러분의 입력을 기다리는 명령어
			
			//출력
			System.out.println("입력 받은 값 : " + i);
			//문제1.
			//화면에 i값을 A로 다시 출력해주세요.
			
			System.out.println((char)i);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

바이트 입력 스트림2

package ch01;

import java.io.IOException;
import java.io.InputStreamReader;

public class SysteminTest2 {

	public static void main(String[] args) {
		
		System.out.println("알파벳 여러개 쓰고 Enter를 누르세요");
		
		int i;
		
		try {
			//바이트를 문자로 변경해주는 녀석
			//바이트 단위로 읽은 녀석을 문자단위로 읽어 들이게 하는 녀석
			//-->보조스트림
			
			InputStreamReader irs = new InputStreamReader(System.in);
			
			while((i = irs.read())!= '\n') {
				//화면에 출력
				System.out.print((char)i);
			}
//			while( (i = System.in.read() ) != '\n' ) {
//				System.out.print((char)i);
//			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

InputStream1

자바프로젝트파일명 > 소스 폴더assets(만들기) > 우클릭 > new > other > General > File 로 txt파일 만들기

package ch02;

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest1 {

	public static void main(String[] args) {
		
		FileInputStream fis = null;
		
		try {
			fis = new FileInputStream("assets/input.txt");
//			int first = fis.read();
//			System.out.println("first : " + first);
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
			System.out.println((char)fis.read());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("파일이 없습니다.");
		} finally {
			try {
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("프로그래밍이 종료 되지 않았습니다.");
		
	}

}

InputStream2

package ch02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamTest2 {

	public static void main(String[] args) {
		
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("assets/input1.txt");
			int i;
			//while 문으로 처리를 합니다.
			//fis.read() --> -1
			while((i = fis.read()) != -1 ) {
				System.out.print((char)i);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		//finally 잊지 말것	
		}finally {
			try {
				fis.close(); //close()잊지 말것
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

InputStream3 : 자동 닫아주기 (결과 위와 동일)

package ch02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamTest3 {

	public static void main(String[] args) {
		
//		try {
//			
//		} catch (Exception e) {
//			// TODO: handle exception
//		}
		//자바 jdk 9버전 이후 부터 사용 가능 _ close자동 닫아주기
		try(FileInputStream fis = new FileInputStream("assets/input1.txt")) {
			
			int i;
			while((i = fis.read())!= -1) {
				System.out.println((char)i);
			}
			
		} catch (FileNotFoundException e) {
			System.out.println("파일이 없습니다.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

InputStream4

package ch02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamTest4 {

	public static void main(String[] args) {
		
		try(FileInputStream fis = new FileInputStream("assets/input1.txt")){
			
			byte [] bs = new byte[30];
			int i;
			while((i = fis.read(bs)) != -1) {
				
				for(int j = 0; j < i; j ++) {
					System.out.print((char)bs[j]);
				}
				System.out.println(" : " + i + "바이트 읽음");
			}
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

InputStream5

package ch02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamTest5 {

	public static void main(String[] args) {
		
		try(FileInputStream fis = new FileInputStream("assets/input1.txt")){
			
			byte[] bs = new byte[10];
			fis.read(bs, 0, 5);
			for (byte b : bs) {
				System.out.print((char)b);
			}
		}catch(FileNotFoundException e){
			System.out.println("no File");
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

OutputStream1_문자 출력하기

output.txt 파일을 만들고 코드를 입력해서 문자 적기

package ch03;

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

public class FileOutPutStreamTest1 {

	public static void main(String[] args) {
		
		try(FileOutputStream fos = new FileOutputStream("output.txt")){
			
			fos.write(65);
			fos.write(66);
			fos.write(67);
			
		}catch(IOException e) {
			System.out.println(e);
		}

	}

}

OutputStream2 : 배열 안에 있는 데이터를 한번에 출력하기

package ch03;

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

public class FileOutPutStreamTest2 {

	public static void main(String[] args) throws FileNotFoundException {
		
		FileOutputStream fos = new FileOutputStream("output2.txt", true);
		                                                           //true 는 + 
		try(fos) {//java 9버전 이상부터 
			
			byte[] bs = new byte[26];
			byte data = 65; // 'A'의 아스키 값
			
			//A - Z까지 
			for(int i = 0; i <bs.length; i++) {
				bs[i] = data;
				data++;
			}
			fos.write(bs); // 배열 안에 있는 데이터를 한번에 출력하기
						
		} catch (IOException e) {
			// TODO: handle exception
		}
	}

}

OutputStream3 : 배열 2번째 부터 10개 바이트 출력하기

package ch03;

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

public class FileOutPutStreamTest3 {

	public static void main(String[] args) {
		
		//문자를 입력 받아서 output3.txt 에 넣기
//		System.out.println("output3에 입력할 문자를 입력하세요 : ");
//		Scanner sc = new Scanner(System.in);
//		String output3txt = sc.nextLine();
		
		try(FileOutputStream fos = new FileOutputStream("output3.txt")){
			
			byte[] bs = new byte[26];
			byte data = 65;//'A'
			for (int i = 0; i < bs.length; i++) {
				bs[i] = data;
				data++;
			}
			fos.write(bs,2,10); //배열 2번째 부터 10개 바이트 출력하기

		} catch (FileNotFoundException e) {
			System.out.println(e);
		} catch (IOException e) {
			System.out.println(e);
		}

		System.out.println("출력이 완료되었습니다.");
	}///end of main

}

문자를 읽어주는 스트림

package ch04;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {

	public static void main(String[] args) {
		
		//Reader -> 문자를 읽어 드리는 스트림
		try(FileReader fr = new FileReader("assets/article.txt")){
			
			int i; 
			while((i = fr.read()) != -1) {
				System.out.print((char)i);
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

문자를 써주는 스트림

package ch04;

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

public class FileWriterTest {

	public static void main(String[] args) {
		
		try(FileWriter fw = new FileWriter("writer.txt", false)){
                                                       //덮어쓰기
//			fw.write('A');
			char buf[] = {'B','C','D','E','X','Y','Z'};
//			fw.write(buf);
			fw.write(buf, 1, 5);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

버퍼드 스트림 

알집 파일 해당 자바 프로젝트에 넣고 실행

package ch05;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedStreamTest {

	public static void main(String[] args) {
		
		long millisecond = 0;
		try(FileInputStream fis = new FileInputStream("a.zip")){
			FileOutputStream fos = new FileOutputStream("copy2.zip");
			//보조 스트림 사용해 보기
			//input 스트림 - 보조
			BufferedInputStream bis = new BufferedInputStream(fis);
			//output 스트림 - 보조
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			
			millisecond = System.currentTimeMillis();
			int i ;
			
			//기반 스트림 사용 코드
//			while((i = fis.read()) != -1) {
//				fos.write(i);
//			}
			
			while((i = bis.read()) != -1 ) {
				bos.write(i);
				
			}//기반 스트림에서 버퍼드를 사용해서 훨씬 더 빠르게 처리할 수 있다.
		
			
			millisecond = System.currentTimeMillis() - millisecond;
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("파일을 복사하는 데 " + millisecond + "초 소요 되었습니다.");
	}

}

데이터 스트림

package ch05;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStreamTest {

	public static void main(String[] args) {
		
		try(FileOutputStream fos = new FileOutputStream("data.txt")){
			
			DataOutputStream dos = new DataOutputStream(fos);	
			dos.writeByte(100);
			dos.writeChar('A');
			dos.writeInt(10);
			dos.writeFloat(3.14f);
			dos.writeUTF("TEST");
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		try(FileInputStream fis = new FileInputStream("data.txt")){
			DataInputStream dis = new DataInputStream(fis);
			
			System.out.println(dis.readByte());
			System.out.println(dis.readChar());
			System.out.println(dis.readInt());
			System.out.println(dis.readFloat());
			System.out.println(dis.readUTF());
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}//end of main

}

Serializable

package ch06;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Person implements Serializable{
	
	String name;
	String job;
	
	public Person(String name, String job) {
		this.name = name;
		this.job = job;
	}
	
	@Override
	public String toString() {
		
		return name + ", " + job;
	}
	
}

public class SerializationTest {

	public static void main(String[] args) {
		
		Person person1 = new Person("이순신", "CEO");
		Person person2 = new Person("김유신", "CTO");
		
		try(FileOutputStream fos = new FileOutputStream("serial.out")){
			
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			
			oos.writeObject(person1);
			oos.writeObject(person2);
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//-----------------------------------------------------------
		
		try(FileInputStream fis = new FileInputStream("serial.out")){
			
			ObjectInputStream ois = new ObjectInputStream(fis);
			try {
				Person p1 = (Person)ois.readObject();
				Person p2 = (Person)ois.readObject();
				System.out.println(p1);
				System.out.println(p2);
			
				} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
				}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}