java.io 패키지

    자바의 기본적인 데이터 입출력 API제공

    입력스트림과 출력스트림의 개념

    스트림 : 데이터의 흐름

    입력 스트림 데이터가 들어오는 것

    출력 스트림 데이터가 밖으로 나가는 것

     

    바이트 기반 스트림과 문자 기반 스트림

    바이트 기반 스트림 

    그림 . 멀티미디어 ㅁ누자 등 모든 종류의 데이터를 받고 보낼 수 잇다.

     

    문자 기반 스트림

    문자만 받고 보낼 수 있도록 특화되어 있다,

     

    InputStrim

    바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스

     

    read() 메서드

    데이터를 읽어들이는 기본형

     

    read(byte[] b) 메서드

    byteArray단위 만큼 한번에 읽어올수 있다

     

    read(byte[] b, int off, int len) 메서드

    int off 부터  int len까지 읽어들일수 있다.

     

    close() 메서드

    반납 해준다.


    byte 단위 입력 스트림

    package kr.co.kihd.inputstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.nio.charset.Charset;
    
    public class InputStreamReadTest01 {
    	//일반예외가 발생하는데 그 예외를 JVM에게 던지고 있음.
    	public static void main(String[] args) throws Exception {
    		//다형성이 적용된 코드
    		InputStream iStream = new FileInputStream("C:\\workspace\\test.txt");
    		int readByte;  //읽은 바이트수를 리턴 받는 변수
    		
    		//InputStream read()는 더이상 읽을게 없다면, -1값을 리턴함.
    		//기본적으로 이클립스는 한글을 3바이트로 읽어들인다. (UTF-8)
    		while( (readByte = iStream.read()) != -1) {
    			//아스키코드값을 출력
    			System.out.println("읽은 데이터 (1바이트) : " + readByte);
    			//강제업케스팅 후 문자로 출력
    			System.out.println("읽은 문자 : " + (char)readByte);
    		}
    		//이클립스 디폴트 캐릭터셋
    		System.out.println(Charset.defaultCharset());
    		
    		iStream.close();
    	}
    
    }
    

    읽은 데이터 (1바이트) : 65
    읽은 문자 : A
    읽은 데이터 (1바이트) : 66
    읽은 문자 : B
    읽은 데이터 (1바이트) : 67
    읽은 문자 : C

     

    같은 코드

    package kr.co.kihd.inputstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.nio.charset.Charset;
    
    public class InputStreamReadTest01 {
    	//일반예외가 발생하는데 그 예외를 JVM에게 던지고 있음.
    	public static void main(String[] args) throws Exception {
    		//다형성이 적용된 코드
    		InputStream iStream = new FileInputStream("C:\\workspace\\test2.txt");
    		int readByte;  //읽은 바이트수를 리턴 받는 변수
    		
    		//InputStream read()는 더이상 읽을게 없다면, -1값을 리턴함.
    		//기본적으로 이클립스는 한글을 3바이트로 읽어들인다. (UTF-8)
    		while(true) {
    			readByte = iStream.read();
    			if(readByte == -1)
    				break;			
    			//아스키코드값을 출력
    			System.out.println("읽은 데이터 (1바이트) : " + readByte);
    			//강제업케스팅 후 문자로 출력
    			System.out.println("읽은 문자 : " + (char)readByte);
    		}
    		//이클립스 디폴트 캐릭터셋
    		System.out.println(Charset.defaultCharset());
    		
    		iStream.close();
    	}
    
    }
    

    한글출력

    package kr.co.kihd.inputstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    public class InputStreamReadTest02 {
    
    	public static void main(String[] args) throws Exception {
    		
    		InputStream iStream = new FileInputStream("C:\\workspace\\test3.txt");
    		
    		int readByteNo;
    		byte[] bytes = new byte[3];
    		
    		while( (readByteNo = iStream.read(bytes)) != -1) {
    			System.out.println("읽은 바이트 수 : " + readByteNo);
    			//String 클래스로 반드시 디코딩해야 한들이 출력됨.
    			String str = new String(bytes);
    			System.out.println("읽은 문자열 : " + str);
    		}
    		
    		iStream.close();		
    	}
    
    }
    

    시작인덱스 2이고 3개만 읽어서 저장하는 코드를 작성

    package kr.co.kihd.inputstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    public class InputStreamReadTest03 {
    	
    	public static void main(String[] args) throws Exception {
    		InputStream iStream = new FileInputStream("C:\\workspace\\test4.txt");
    		int count;
    		byte[] readBytes = new byte[10];
    		
    		//시작인덱스 2이고 3개만 읽어서 저장하는 코드를 작성
    		count = iStream.read(readBytes, 2, 5);
    		System.out.println("읽은 바이트 수 : " + count);
    		
    		for(byte b : readBytes) {
    			System.out.println("읽은 바이트 : " + (char)b);
    		}
    		
    		iStream.close();	
    	}
    	
    }
    

    OutputStream

    바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스

    package kr.co.kihd.outputstream;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.Arrays;
    
    public class OutputStreamTest01 {
    
    	public static void main(String[] args) throws Exception {
    		//파일로부터 출력스트림을 생성하여 대입한다.(다형성)
    		OutputStream oStream = new FileOutputStream("C:\\workspace\\write.txt");
    		byte[] data = "ABC".getBytes();
    		System.out.println(Arrays.toString(data)); //아스키코드가 출력됨.
    		
    		//3번 루핑한다. 한 글자씩 보내기 때문임.
    		for(int i = 0; i<data.length; i++) {
    			oStream.write(data[i]);
    		}
    		//write()를 사용하면 무조건 flush()를 호출하며, 반드시 메모리 버퍼를 
    		//비우도록 하자. 물론 main() 종료하면 알아서 버퍼에서 나가지만,
    		//가능한한 flush()를 호출하도록 하는 것을 습관화하도록 한다.
    		oStream.flush();
    		System.out.println("저장이 완료되었습니다.");
    		oStream.close();
    		
    	}
    
    }
    

    [65, 66, 67]
    저장이 완료되었습니다.


    for문 없이 write 효율적

    package kr.co.kihd.outputstream;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    public class OutputStreamTest02 {
    	
    	public static void main(String[] args) throws Exception {
    		// 파일로부터 출력스트림 생성해서 대입하고 있다.
    		OutputStream oStream = new FileOutputStream("C:\\workspace\\write2.txt");
    		
    		//"ABC가나다" 문자열을 통해서 바이트 배열을 얻고 있다.(인코딩)
    		byte[] data = "ABC가나다".getBytes("ISO8859-1");
    		//getBytes()를 사용할때, 매개변수의 값으로 캐릭터셋을 줄수가 있는데
    		//EUC-KR,x-windows-949는 한글을 2바이트 인식,
    		//UTF-8은 한글을 3바이트로 인식한다.
    		//ISO8859-1 캐릭터 셋에서는 한글을 1바이트로 인식한다. 
    		System.out.println("data 바이트배열의 크기 " + data.length);
    		
    		//바이트 배열을 한번에 스트림에 보낸다.
    		//이앞에서 본 write(int b)메서드 비해서 훨씬 효율적이다.
    		oStream.write(data);
    		System.out.println("저장이 완료되었습니다.");
    		oStream.flush();
    		oStream.close();
    	}
    	
    }
    

    data 바이트배열의 크기 6
    저장이 완료되었습니다.


    InputStream 으로 만들기

    package kr.co.kihd.outputstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    public class OutputStreamTest02 {
    	
    	public static void main(String[] args) throws Exception {
    		// 파일로부터 출력스트림 생성해서 대입하고 있다.
    		OutputStream oStream = new FileOutputStream("C:\\workspace\\write2.txt");
    		
    		//"ABC가나다" 문자열을 통해서 바이트 배열을 얻고 있다.(인코딩)
    		byte[] data = "ABC가나다".getBytes();
    		//getBytes()를 사용할때, 매개변수의 값으로 캐릭터셋을 줄수가 있는데
    		//EUC-KR,x-windows-949는 한글을 2바이트 인식,
    		//UTF-8은 한글을 3바이트로 인식한다.
    		//ISO8859-1 캐릭터 셋에서는 한글을 1바이트로 인식한다. 
    		System.out.println("data 바이트배열의 크기 " + data.length);
    		
    		//바이트 배열을 한번에 스트림에 보낸다.
    		//이앞에서 본 write(int b)메서드 비해서 훨씬 효율적이다.
    		oStream.write(data);
    		System.out.println("저장이 완료되었습니다.");
    		oStream.flush();
    		
    		System.out.println();
    		//출력으로 내보낸 파일인 write2.txt파일을 읽어들인다.
    		InputStream iStream = new FileInputStream("C:\\workspace\\write2.txt");
    		int count = 0;
    		
    		//UTF-8 한글이 3바이트이므로 바이트배열을 3바이트 생성함.
    		byte[] readBytes = new byte[3];
    		int i = 0;
    		
    		while( (count = iStream.read(readBytes)) != -1) {
    			i++;
    			String str = new String(readBytes); //디코딩
    			System.out.println("읽은 값 : " + str);
    			System.out.println("읽은 바이트 수 : " + count);
    		}
    		System.out.println("루핑 수 : " + i);
    		
    		iStream.close();
    		oStream.close();
    	}
    	
    }
    

    data 바이트배열의 크기 12
    저장이 완료되었습니다.

    읽은 값 : ABC
    읽은 바이트 수 : 3
    읽은 값 : 가
    읽은 바이트 수 : 3
    읽은 값 : 나
    읽은 바이트 수 : 3
    읽은 값 : 다
    읽은 바이트 수 : 3
    루핑 수 : 4


    시작인덱스가 3이고, 15개의 길이만큼 파일로 내보낸다

    package kr.co.kihd.outputstream;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    public class OutputStreamTest03 {
    
    	public static void main(String[] args) throws Exception {
    		OutputStream oStream = new FileOutputStream("C:\\workspace\\write3.txt");
    		
    		byte[] data = "ABC빅데이터란".getBytes();
    		System.out.println("data바이트 계열의 크기 : " + data.length);
    		
    		//시작인덱스가 3이고, 15개의 길이만큼 파일로 내보낸다.
    		
    		oStream.write(data, 3, 15);
    		oStream.flush();
    		System.out.println("파일이 저장되었습니다.");
    		oStream.close();
    	}
    
    }
    

    복사 - 기본형

    package kr.co.kihd.outputstream;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class FileCopyTest {
    
    	public static void main(String[] args) throws Exception {
    		
    		FileInputStream fInputStream = new FileInputStream("C:\\workspace\\write3.txt");
    		
    		FileOutputStream fOutputStream = 
    				new FileOutputStream("C:\\workspace\\write3_복사본.txt");
    		
    		int data = 0;
    		while( (data = fInputStream.read()) != -1) {
    			fOutputStream.write(data);
    		}
    		fOutputStream.flush();
    		System.out.println("C드라이브에 write3_복사본.txt파일이 생성되었습니다.");
    		
    		fOutputStream.close();
    		fInputStream.close();
    	}
    
    }
    

    복사 - 배열타입

    package kr.co.kihd.outputstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    public class FileCopyTest2 {
    	public static void main(String[] args) throws Exception {
    
    		FileInputStream fInputStream = new FileInputStream("C:\\workspace\\write3.txt");
    		
    		FileOutputStream fOutputStream = 
    				new FileOutputStream("C:\\workspace\\write3_복사본.txt");
    		
    		byte[] readBytes = new byte[1000];
    		int data = 0;
    		while( (data = fInputStream.read(readBytes)) != -1) {
    			fOutputStream.write(readBytes);
    			System.out.println("읽은 바이트 수 : " +data);
    		}
    		fOutputStream.flush();
    		System.out.println("C드라이브에 write3_복사본.txt파일이 생성되었습니다.");
    		
    		fOutputStream.close();
    		fInputStream.close();
    	
    			
    		
    	}
    
    
    }

     

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading