[JAVA][패스트캠퍼스]자바 입출력 스트림

김주현·2021년 5월 8일
0

입출력 스트림이란?

  • 네트웍에서 자료의 흐름이 물과 같다는 의미에서 유래
  • 다양한 입출력 장치에 독립적으로 일관성 있는 입출력 방식 제공
  • 입출력이 구현 되는 곳에서는 모두 I/O 스트림을 사용 : 키보드,파일디스크,메모리 등

입출력 스트림 구분

  • I/O 대상 기준 : 입력 스트림, 출력 스트림
    - 자바에는 입출력을 동시에 하는 스트림이 없음
  • 자료의 종류 : 바이트 스트림, 문자 스트림
  • 스트림의 기능 : 기반 스트림, 보조 스트림

입출력 스트림과 출력 스트림

  • 입력 스트림 : 대상으로부터 자료를 읽어들이는 스트림
  • 출력 스트림 : 대상으로 자료를 출력하는 스트림

바이트 단위 스트림과 문자 단위 스트림

  • 바이트 단위 스트림 : 바이트 단위로 자료를 읽고 씀 (동영상, 음악파일 등)
  • 문자 단위 스트림 : 문자는 2바이트씩 처리해야 함

기반 스트림과 보조 스트림

  • 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
  • 보조 스트림 : 직접 읽고 쓰는 기능은 없고 추가적인 기능을 제공해 주는 스트림, 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개변수로 포함함

바이트 단위 스트림

  • InputStream : 바이트 단위 입력 스트림 최상위 클래스
  • OutputStream : 바이트 단위 출력 스트림 최상위 클래스
  • 추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용
  • 주요 하위 클래스

FileInputStream과 FileOutputStream 사용하기

  • 파일에 한 바이트씩 자료를 읽고 쓰는데 사용
  • 입력 스트림은 파일이 없는 경우 예외 발생
  • 출력 스트림은 파일이 없는 경우 파일 생성하여 출력

FileInputTest1.java

public class FileInputTest1 {

	public static void main(String[] args) {
		FileInputStream fis=null;
		try {
			fis= new FileInputStream("input.txt");
			
			int i;
			//-1이 아닐때까지 계속 읽음
			while((i=fis.read()) != -1) {
			System.out.println((char)i);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				fis.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("end");
		
	}
}

FileInputTest2.java

public class FileInputTest2 {

	public static void main(String[] args) {
		try(FileInputStream fis=new FileInputStream("input.txt")) {
		
			int i;
			//-1이 아닐때까지 계속 읽음
			while((i=fis.read()) != -1) {
			System.out.println((char)i);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("end");
		
	}
}

FileInputTest3.java

public class FileInputTest3 {

	public static void main(String[] args) {
		try(FileInputStream fis=new FileInputStream("input2.txt")) {
			int i;
			//byte단위의 10개의 배열을 만듬 
			byte[] bs=new byte[10];
			//-1이 아닐때까지 계속 읽음
			while((i=fis.read(bs)) != -1) {
				//버퍼를 읽을때는 garbage가 남기 때문에 모두다 출력됨
//				for(byte b : bs) {
//					System.out.print((char)b);
//				}
				for(int k=0;k<i;k++) {
					System.out.print((char)bs[k]);
				}
				System.out.println();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		System.out.println("end");
		
	}
}

FileOutputTest1.java

public class FileOutputTest1 {

	public static void main(String[] args) {
		//true로 하면 txt파일에 계속 문자가 남게됨
		try(FileOutputStream fos= new FileOutputStream("output.txt",true)){
			fos.write(65);
			fos.write(66);
			fos.write(67);
			
		}catch(IOException e) {
		System.out.println(e);
	}
	}
}

FileOutputTest2.java

public class FileOutputTest2 {

	public static void main(String[] args) {
		
		byte[] bs=new byte[26];
		//아스키코드 숫자65는 A
		byte data=65;
		for(int i=0;i<bs.length;i++) {
			bs[i]=data;
			data++;
		}
		try(FileOutputStream fos= new FileOutputStream("alpha.txt",true);
			FileInputStream fis=new FileInputStream("alpha.txt")){
			fos.write(bs);
			int ch;
			while((ch=fis.read()) != -1) {
				System.out.print((char)ch);
			}
		}catch(IOException e) {
		System.out.println(e);
	}
	}
}

문자 단위 입출력 스트림

  • Reader : 문자 단위로 읽는 최상위 스트림
  • Writer : 문자 단위로 쓰는 최상위 스트림
  • 추상 메서드를 포함한 추상 클래스로 하위 클래스가 상속받아 구현
  • 하위클래스

FileReader와 FileWriter

  • 파일에 문자를 읽고 쓸때 가장 많이 사용하는 클래스
  • 문자의 인코딩 방식을 지정할 수 있음

FileReaderTest1.java

public class FileReaderTest1 {

	public static void main(String[] args) throws IOException {
		//FileInputStream은 바이트단위로 읽을 때 사용
		//InputStreamReader를 사용하면 바이트단위로 읽은 자료를 문자로 변환해줌
		FileInputStream fis=new FileInputStream("reader.txt");
		InputStreamReader isr=new InputStreamReader(fis); 
		int i;
		while((i=isr.read()) != -1) {
			System.out.print((char)i);
		}
		fis.close();
	}
}

FileReaderTest2.java

public class FileReaderTest2 {

	public static void main(String[] args) throws IOException {
		//FileReader는 문자를 그대로 가져옴
		FileReader fis=new FileReader("reader.txt");
		int i;
		while((i=fis.read()) != -1) {
			System.out.print((char)i);
		}
		fis.close();
	}
}

FileWriterTest1.java

public class FileWriterTest1 {

	public static void main(String[] args) throws IOException {
		FileWriter fw=new FileWriter("writer.txt");
		fw.write('A');
		char[] buf= {'B','C','D','E','F'};
		fw.write(buf);
		fw.write("안녕하세요");
		//2번째'D'에서 2개만큼
		fw.write(buf,2,2);
		fw.close();
		
		System.out.println("end");
	}
}

writer.txt

ABCDEF안녕하세요DE

보조스트림

  • 실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림
  • FilterInputStream과 FilterOutputStream이 보조스트림의 상위클래스

여러가지 보조 스트림 사용하기

  • Buffered 스트림 : 내부에 8192 바이트 배열을 가지고 있음, 읽거나 쓸때 속도가 빠름
  • DataInputStream / DataOutputStream : 자료가 저장된 상태 그대로 자료형을 유지하며 읽거나 쓰는 기능을 제공하는 스트림

FileCopy.java

public class FileCopy {

	public static void main(String[] args) throws IOException {
		long milliseconds=0;
		
		try(FileInputStream fis=new FileInputStream("a.zip");
				FileOutputStream fos=new FileOutputStream("copy.zip");
				//버퍼를 이용하면 복사하는 속도가 훨씬 빠름
				BufferedInputStream bis= new BufferedInputStream(fis);
				BufferedOutputStream bos= new BufferedOutputStream(fos)){
			milliseconds=System.currentTimeMillis();
			
			int i;
			while((i=fis.read()) != -1 ) {
				fos.write(i);
			}
			milliseconds=System.currentTimeMillis()-milliseconds;
				
		} catch (IOException e) {
			System.out.println(e);
		}
		Socket socket=new Socket();
		//inputstreamreader로 문자변환해주고 bufferedreader로 속도변환해줌
		BufferedReader isr=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		isr.readLine();
		System.out.println("시간 : " + milliseconds);
	}
}

DataStreamTest.java

public class DataStreamTest {

	public static void main(String[] args) {
		try(FileOutputStream fos=new FileOutputStream("data.txt");
				DataOutputStream dos=new DataOutputStream(fos);
				FileInputStream fis=new FileInputStream("data.txt");
				DataInputStream dis=new DataInputStream(fis)){
			dos.writeByte(100);
			dos.write(100);
			dos.writeChar('A');
			dos.writeUTF("안녕하세요");
			
			System.out.println(dis.readByte());
			System.out.println(dis.read());
			System.out.println(dis.readChar());
			System.out.println(dis.readUTF());
			
		}catch(IOException e) {
			
		}
		
	}
}

0개의 댓글

관련 채용 정보