[혼자공부하는JAVA] 입출력 스트림 완강!

Hailey·2025년 2월 18일

JAVA

목록 보기
2/8

바이트 입력 스트림 : InputStream

1. read() 메소드

// 바이트 스트림이므로 읽는건 1바이트다!!
// 저장은 int형이더라도...
입력 스트림으로부터 1byte 읽고 int(4byte)타입으로 리턴
리턴된 4byte 중 끝 1 byte에만 데이터 들어 있음
더 이상 입력 스트림으로부터 바이트 읽을수 없게 되면 -1리턴

public class ReadExample{
	public static void main(String[] args) throws Exception{
    InputStream is = new FileInputStream("C:/Temp/test1.db");
    
    while(true) {
    	int data = is.read();
        if(data == -1) break;
        System.out.println(data);
    	}   
        is.close();
    }
}

2. read(byte[] b) 메소드

매개값으로 주어진 배열의 길이만큼 입력스트림으로부터 바이트를 읽고 해당 배열에 저장,
그리고 읽은 바이트 수를 리턴.

public class ReadExample{
	public static void main(String[] args) throws Exception{
    InputStream is = new FileInputStream("C:/Temp/test2.db");
   	
    byte[] buffer = new byte[100]; //byte배열 생성
    
    while(true){
    	int readByteNum = is.read(buffer); //파일에서 읽어서 byte배열에 저장
        if(readByteNum == -1) break;
        for( int i=0; i<readByteNum; i++){
        	System.out.println(buffer[i]);
        }
    }
    	is.close();
   	}
  }

3. read(byte[] b, int off, int len) 메소드

public class ReadExample{
	public static void main(String[] args) throws Exception{
    InputStream is = new FileInputStream("C:/Temp/test3.db");
    
    byte[] buffer = new byte[5];
    
    int readByteNum = is.read(buffer,2,3);
    if(readBtyeNum != -1){
    	for(int i=0; i<buffer.length; i++){
        		Systme.out.println(buffer[i]);
        		}
            }
           is.close();
    	}
    }

바이트 출력 스트림 : OutputStream

1. write(int b)메소드

이거 바이트 스트림인데 어떻게 int를 출력하지??는 바로....
매개변수로 주어지는 int(4 byte)에서 끝 1byte만 출력 스트림으로 보냄

public class WriteExample{
	public static void main(String[] args) throws Exception{
   	OutputStream os = new FileOutputStream("C:/Temp/test1.db");
       
       byte a =10;
       byte b =20;
       byte c =30;
       
       os.write(a);
       os.write(b);
       os.write(c);
       
       os.flush();
   	os.close();
   
   }
}

2. write(byte[] b) 바이트 배열 출력

public class WriteExample{
	public static void main(String [] args) throws Exception {
    	OutputStream os = new FileOutputStream(" C:/Temp/test1.db");//이 파일 안에 출력
        
            byte[] array = {10,20,30};
        
        os.write(array);
        
        os.flush();
        os.close();
    }
}

// write를 쓰고 나면, 항상 flush를 해야한다.
// flush는 출력스트림이 가지고 있는 버퍼에 쌓여있는 데이터를 다 내보내는 역할을 한다!
// 출력스트림은 출력버퍼를 통해서 출력하기 때문이다! 그래서 출력버퍼에 잔류하는 모든 바이트를 없애줘야 이후에 다른 것도 출력된다.
//write 쓰고나면 flush후에 close하기.

3. write(byte[] b, int off, int len) 메소드

배열 b에서 b[off]에서부터 len개의 바이트만 출력 스트림으로 보냄

public class WriteExample{
	public static void main(String[] args) throws Exception{
    	OutputStream os = new FileOutputStream("C:/Temp/test3.db")
        	byte[] array = {10,20,30,40,50};
            
        	os.write(array,1,3);
            
            os.flush();
            os.close();
        }   
     };
 

문자 출력 스트림 : Writer

문자기반 출력 스트림의 최상위 클래스
모든 문자 기반 입력 스트림은 Writer 클래스 상속받아만들어짐

writer(int c) 메소드

매개변수로 주어지는 int(4byte)에서 끝 2byte(1개 문자)면 출력 스트림을 보냄

public class WriteExample{
	public static void main(String[] args) throws Exception{
		Writer writer = new FileWriter("C:/Temp/test7.txt");
        
        char a = 'A'; //char은 2byte....
    	char b ='B';
        char c = 'C';
        
        writer.write(a);
        writer.write(b);
        writer.write(c);
        
        writer.flush();
        writer.close();
    }
 }

writer(char[] cbuf) 메소드

매개값으로 주어진 char[]배열의 모든 문자를 출력 스트림으로 보냄

public class WriteExample{
	public static void main(String[] args) throws Exception{
		Writer writer = new FileWriter("C:/Temp/test8.txt");
        
        char[] array = {'A','B','C'};
        
        writer.write(array);
        
        writer.flush();
        writer.close();
        }
    }

writer(char[] cbuf, int off, int len) 메소드

c[off]부터 len개의 문자를 출력스트림으로 보냄

public class WriteExample{
	public static void main(String[] args) throws Exception{
		Writer writer = new FileWriter("C:/Temp/test8.txt");
        
        char[] array = {'A','B','C','D','E'};
        
        writer.write(array,1,3);
        
        writer.flush();
        writer.close();
        }
    }

write(String str)와 write(String str,int off,int len) 메소드

Reader

reader()

입력 스트림으로부터 1개의 문자(2byte) 읽고, int(4byte)타입으로 리턴. 리턴된 4byte중 끝 2 byte에 문자 데이터 들어있음.

public class WriteExample{
	public static void main(String[] args) throws Exception{
    Reader reader = new FileReader();
    
    while(true){
    	int data = reader.read();
    	int(data ==-1) break;
    	System.out.println((char)data);
    }
    reader.close();
    }
   }

reader(char[]] cbuf) 메소드

매개값으로 주어진 문자 배열의 길이만큼 입력 스트림으로부터 문자를 읽고 배열에 저장 그리고 읽은 문자 수를 리턴.

public class ReadExample{
	public static void main(String[] args) throws 		Exception{
    
    Reader reader = new FileReader();
    
    char[] buffer = new char[100];
    
    while(true){
    	int readCharNum = reader.read(buffer);
      	if(readCharNum == -1) break;
        for(int i==0; i<readCharNum; i++){
        	System.out.println(buffer[i]):
        }
    }
    reader.close();
}

reader(char[]] cbuf, int off, int len) 메소드

보조 스트림

: 보조스트림이 연결될 스트림을 생성자의 매개값으로 제공

보조스트림 변수 = new 보조스트림(연결스트림)

InputStream is = ''';
InputStreamReader reader = new InputStreamReader(is);

보조 스트림을 연속적으로 연결할 수도 있음

InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader); //성능향상

문자 변환 보조 스트림

소스 스트림이 바이트 기반 스트림(InputStream,OutputStream)이면서 입출력데이터가 문자일 경우, Reader와 Writer로 변환해서 사용하는 것이 편리함.

OutputStreamWriter
문제집 설명잘못됨;; writer로 변환x...

(OutputStreamWriter는 바이트 기반 스트림(OutputStream) 을 문자 기반 스트림(Writer) 으로 다룰 수 있도록 변환해 주는 보조 스트림입니다.)

둘 다 입출력데이터가 문자일 경우!,

소스 스트림이 바이트 기반 스트림(InputStream, OutputStream)이면서 입출력데이터가 문자일 경우, reader와 writer로 변환해서 사용하는 것이 편리하다

OutputStreamWriter는 "입력된 프로그램"의 문자를 바이트로 변환하는 스트림입니다.

OutputStream(출력이바이트)Writer(문자로 출력)

InputStreamReader는 바이트 기반 스트림(InputStream)에서 데이터를 읽고, 이를 문자로 변환하여 "프로그램에 입력하는" 보조 스트림입니다.

InputStream(입력이 바이트)Reader(문자로 입력)


public static void write(String str) throws Exception{
 	FileOutputStream fos = new FileOutputStream(" ");
    Writer writer = new OutputStreamWriter(fos);
    
    writer.write(str);
    //문자를 바이트로 변환해서 저장
    writer.flush();
    writer.close();
 }
 
 public static void read(String str) throws Exception{
 	FileInputStream fis = new FileInputStream(" ");
    Reader reader = new InputStreamReader(fis);
    char[] buffer = new char[100];
    
    int readCharNum = reader.read(buffer);
    //문자로 변환해서 저장
    reader.close();
    String data = new String(buffer,  0, readCharNum);
 	return data;
 }
 
 

성능 향상 보조 스트림

메모리 버퍼를 추가로 제공하여 프로그램의 실행 성능을 향상
+) 바이트 기반 스트림에 연결: BufferinputStream, BufferedOuputStream
+) 문자 기반 스트림에 연결: BufferReader, BufferWriter

출력 성능 향상 보조 스트림

프로그램의 출력 성능은 입출력이 가장 늦은 장치를 따라 감(하드디스크, 느린 네트워크)
중간에 버퍼를 둠으로써 프로그램의 실행 성능을 향상시킬 수 있다.

BufferedOutputStream bos = new BufferedOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferedWriter(문자 기반 출력 스트림);

입력 성능 향상 보조 스트림

프로그램의 입력 성능은 입력이 가장 늦은 장치를 따라 감(하드 디스크, 느린 네트워크)
중간에 버퍼를 둠으로써 데이터를 미리 읽고 버퍼에 저장해 둠(속도 차이 다소 해결)
프로그램은 버퍼에 있는 데이터를 한번에 왕창 읽을 수 있음

BufferedInputStream bis = new BufferedInputStream(바이트 기반 입력 스트림);
BufferedReader br = new BufferedReader(문자 기반 입력 스트림);

BuffferedReader의 readLine() 메소드

BuffferedReader는 라인 단위로 문자열을 읽는 readLine() 메소드를 제공
[Enter]키 이전의 모든 문자열 읽고 리턴
키보드에서 입력한 내용 및 파일 내용을 라인 단위로 읽을 수 있다

public class ReadLineExample{
	public static void main(String[] args) throws Exception{
    	Reader reader = new FileReader{
        	ReadLineExample.class.getResource("launguage.txt").getPath();
        };
        
        BufferedReader br = new BufferedReader(reader);
        
        while(true){
        	String data = br.readLine();
            if(data == null) break;
            System.out.println(data);
        }
        
    	br.close();
    }
}

입출력 보조 스트림

DataInputStream과 DataOutputStream

기본타입인 boolean, char, short, int, long, float, double, UTF-8 문자열을 매우 쉽게 입출력

DataInputStream dis = new DataInputStream(바이트 기반 입력 스트림);
DataOutputStream dos = new DataOutputStream(바이트 기반 출력 스트림);

데이터 타입의 크기가 모두 다르므로 DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어올 때는 출력한 순서와 동일한 순서로 읽어야 함.

FileOutputStream fos = new FileOutputStream("C:/Temp/primitive.db");
DataOutputStream dos = new DataOutputStream(fos);

dos.writeUTF("홍길동");
dos.writeDouble(95.5); 했으면
dos.writeInt(1);

String name = dis.readUTF();
double score = dis.readDouble(); 로 읽어와야 한다.
System.out.println( name + " : " + score );

PrintStream과 PrintWriter

  • 프린터와 유사하게 출력하는 print(), println() 메소드 가진 보조 스트림
    : PrintStream: 바이트 기반 출력스트림과 연결
    : PrintWriter: 문자 기반 출력 스트림과 연결

println()은 개행문자\n 추가해서 줄바꿈이 일어나도록 함.
printf()는 형식에 맞추어 데이터를 출력함

FileOutputStream fos = new FileOutputStream("C:/Temp/printstream.txt");
PrintStream ps = new PrintStream(fos);

ps.println("프린터 보조 스트림");
ps.print(" 마치");
ps.println("프린터가 출력하는 것 처럼");

ps.flush();
ps.close();

ObjectOutputStream과 ObjectInputStream

  • 메모리에 생성된 객체를 파일 또는 네트워크로 출력
  • 객체 직렬화 및 역직렬화
    ObjectOutputStream: 객체 직렬화해서 출력
    ObjectInputStream: 객체 역직렬화해서 복원

ObjectInputStream ois = new ObjectInputStream(바이트 기반 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 기반 출력 스트림);

ObjectOuputStream의 writeObject()는 객체 직렬화하여 바이트를 출력 스트림으로 보냄.

oos.writeObject(객체);

ObjectInputStream의 readObject()는 바이트를 읽고 역직렬화해서 객체로 다시 복원해서 리턴.

객체타입 변수 = (객체타입) ois.readObject();

근데 자바는 java.io.Serializable 인터페이스 구현한 객체만 직렬화함
Serializable는 추상 메소드가 없으므로, 클래스 선언시 implements Serializable 추가하기만 하면 됨.

입출력 관련 API

콘솔 입출력시 사용되는 System.in은 InputStream이고, System.out은 PrintStream이다.
콘솔 입출력 시 보조 스트림을 사용할 수 있다.
파일 및 디렉토리를 생성하거나 부가적인 정보를 제공하는 File 클래스가 있다.

System.in 정적 필드

System.in은 InputStream 타입의 필드이므로 다음과 같이 InputStream 변수로 참조 가능

InputStream is = System.in;

1byte

키보드로부터 어떤 키가 입력되었는지 확인하기 위해 System.in.read() 메소드로 1byte 읽을 수 있다.

int keyCode = is.read();

라인(전체문자열) 단위 - readLine()

엔터치기 전까지 모든 문자열을 출력해준다!!!!

c++로 치면... getline(cin,arr) 이런 느낌?

[Enter]키 입력 후 라인 단위로 전체 문자열 읽기 위해서 보조스트림을 연결할 수 있다.

InputStream is = System.in;
Reader reader = new InputStreamReader(is);
BufferredReader br = new BufferedReader(reader);

while(true){
	System.out.print("입력하세요: ");
    String lineStr = br.readLine();
    if(lineStr.equals("q") || lineStr.equals("quit")) break;
    System.out.print("입력된 내용: " + lineStr);
    System.out.println();

}

br.close(); //입력 스트림 닫기

Scanner로 키보드 행단위 입력받기 - nextLine()

얘도 엔터키 이전까지 입력된 행단위 문자열을 읽음

Scanner  scanner = new Scanner(System.in);
//바이트 기반 입력스트림으로부터 scanner 생성
//scanner 변수선언
//생성된 scanner를 변수에 저장

String intputdata = scanner.nextLine();
//enter 이전까지 입력된 행단위 문자열을 읽음
//string 변수 선언
//읽은 문자열을 string변수에 저장

//제품저장

public class ProductStorage{
	private List<Product> list = new ArrayList<>();
    private Scanner scanner = new Scanner(System.in);
    private int counter;
    
    public void showMenu(){
    	while(true){
        	System.out.println(" 1. 등록 2.목록  3.종료 ");			
            
            System.out.print("선택: ");
            String selectNo = scanner.nextLine();
            switch(selectNo){
            	case "1": registerProduct(); break;
                case "2": showProducts(); break;
                case "3": return;
            }
        }
    }
    
    
    public void registerProduct(){
    	try{
        	Product product = new Product();
            product.setPno(++counter);
            
            System.out.print("상품명: ");
            product.setName(scanner.nextLine());
            
            System.out.print("가격: ");
            product.setPrice(Integer.parseInt(scanner.nextLine()));
            
            System.out.print("재고: ");
            product.setStock(Intger.parseInt(scanner.nextLine()));
            
            list.add(product);
        }catch(Exception e){
        	System.out.println("등록 에러: " + e.getMessage());
        }
    }
    
    public void showProducts(){
    
    }
}

File 클래스

파일 및 디렉토리(폴더)를 생성/삭제하거나 부가적인 정보 제공
File 객체 생성

File file = new File("C:/Temp/file.txt");

파일또는 디렉토리 존재 여부 확인: exists()

boolean isExist = file.exists();

File 객체는 파일 입출력 스트림 객체 생성 시 경로 정보 제공 목적될 수 있음
스트림 생성자에 문자열 경로 대신 File 객체 대입

1.첫번째 방법

FileInputStream fis = new FileInputStream("C:/Temp/image.gif");

2.두번째방법

File file = new File("C:/Temp/image.gif");
FileInputStream fis = new FileInputStream(file);
profile
럭키헤일리

0개의 댓글