happy coding

[java] 입출력 본문

self study/언어의 기본부터

[java] 입출력

yeoonii 2023. 7. 21. 18:54

자바에서 모든 I/O는 Stream을 통해 이루어진다.

 

Stream이란 Byte 형태로 데이터를 운반하는 데 사용되는 연결통로 라고 할 수 있으며, 단방향 통신만 가능하기 때문에, 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 또한 먼저 보낸 데이터를 먼저 받게 되어있으며 연속적으로 데이터를 주고 받는다는 점에서 큐의 FIFO 구조로 되어 있다.

 

데이터의 스트림 근원지(시작점)을 Source, 데이터 종착점을 Sink, 연결한 것을 Stream 이라고 표현한다.

따라서 입력과 출력을 동시에 수행하려면 입력을 위한 입력 스트림, 출력을 위한 출력 스트림 모두 2개의 스트림이 필요하다.

 

  • InputStream / OutStream을 사용하려면 반드시 해당 패키지를 import해야 한다. > import java.io.*
  • InputStream로 받아오는 경우 여러 개의 값을 입력해도 단 1개의 문자 밖에 못 가져오며 기본형은 int로 받아온다.
  • 출력을 위해서는 out.write() 후 flush()와 close() 를 모두 사용해주어야 한다.
    • flush 는 write에 저장된 값을 출력함과 동시에 비워주는 역할
    • close() 는 끝마무리해주는 역할
Scanner sc = new Scanner(System.in)	//scanner 에서 입력 스트림이 사용된다.

여러 개의 값을 출력하기 위한 방법 >> InputStreamReader, OutputStreamReader 사용

InputStreamReader를 통해 2개 이상의 값을 받아오기 위해서는 배열을 사용해야 한다.

>> 고정적인 값 밖에 받아올 수 없다. >> 공간의 낭비

import java.io.*;


//배열을 어떻게 주느냐에 따라 2개 이상의 값을 받을 수 있음
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);

OutputStream out = System.out;
OutputStreamWriter writer = new OutputStreamWriter(out);

char cdata[] = new char[2];
reader.reader(cdata);

int IcData = cdata[0] = '0';	//char로 받은 값을 int로 변환해 계산하고 싶은 경우 > 배열이니까

writer.write(cdata);	//입력받은 값
writer.write(Icdata + 10 + "\n");	//입력받은 첫번째 값 + 10

writer.flush();	//이 메서드를 통해 출력
writer.close();

버퍼 Buffer

고정값이 아니라 가변적인 값을 받는다.

입력받은 값은 버퍼에 저장해두었다가 버퍼가 가득차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 전송하게 된다

장점은 속도가 빠른것

단점은 1. 엔터만 경계로 인식하기 때문에 중간에 띄어쓰기를 하는 경우 데이터를 가공해야 하고, 2. 입력받는 기본 타입은 String이기 때문에 이외의 경우 형변환은 필수적이다.

 

Buffer 객체 생성시 InputStream과 InputStreamReader의 합쳐진 형태를 사용한다.

Buffer 사용 시에는 java.io.Buffered를 import해주고, 메인 메소드 뒤에 public static void main(String[] args) throws IOException {} 하거나 try ~ catch 문을 사용해야 한다.

BufferWriter를 사용해서 입력되었던 것들을 출력한 후 flush()를 사용하게 된다. (꽉 차지 않아도 buffer 내용을 강제적으로 출력 후 버퍼를 비운다.)

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public static void main(String[] args) throws IOException {
    
    //선언
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    //파일에서 입력받을 경우에는 new BufferedReader(new FileReader("ex.java"));
    
    //라인단위로 입력받기(Enter를 경계로)
    String str = bf.readLine();
    
    //정수형 입력이라면, 형변환 필수
    int i = Integer.parseInt(bf.readLine());
    
    //Space를 경계로 끊어야 할 때
    String arr[] = str.split(" ");
    //또는 StringTokenizer 클래스 이용
    
    //선언
	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	String str = "Print str";
 
	//출력
	bw.writer(str);
 
	//개행
	bw.newLine();
 
	//남아있는 데이터 모두 출력
	bw.flush();
 
	//스트림 닫기
	bw.close();
    
}

StringTokenizer

토큰은 분리된 문자열 조각으로, 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스

java.util.StringTokenizer를 import함으로써 사용할 수 있다.

 

String클래스의 메소드인 split 메소드를 사용하여 StringTokenizer 흉내내기

public static void main(String[] ar){
	String str="this string includes default delims";
	System.out.println(str);
	System.out.println();
		
	System.out.println("==========using split method============");
	String []tokens=str.split(" ");	// 띄어쓰기 단위로 쪼개
		
	for(int i=0;i<tokens.length;i++){	//쪼갠걸 배열에 저장한 후 개행하며 출력
		System.out.println(tokens[i]);
	}
}

특정 delim를 쪼개는 단위로 설정하기

public static void main(String[] ar){
	String str="this-=string-includes=delims";
	StringTokenizer stk=new StringTokenizer(str," ");	//띄어쓰기로 쪼개
	System.out.println(str);
	System.out.println();
		
	System.out.println("total tokens:"+stk.countTokens());
	System.out.println("================tokens==================");
	while(stk.hasMoreTokens()){
		System.out.println(stk.nextToken());
	}
	System.out.println("total tokens:"+stk.countTokens());
}
//띄어쓰기 기준으로 문자열 분리
StringTokenizer st = new StringTokenizer(문자열);

//구분자를 기준으로 문자열 분리
StringTokenizer st = new StringTokenizer(문자열, 구분자);

//구분자를 기준으로 문자열 분리할 때 구분자도 토큰으로 넣을지(true) 아닐지(false), 디폴트는 false
StringTokenizer st = new StringTokenizer(문자열, 구분자, true/false);

'self study > 언어의 기본부터' 카테고리의 다른 글

[type script] 인터페이스  (0) 2024.05.01
[type script] 기본 타입  (1) 2024.05.01
[python] 입출력함수와 주석  (1) 2022.12.24
[python] python에 대해  (0) 2022.12.24
[c] 실수의 표현  (1) 2022.11.30
Comments