Java BufferedReader로 입력받기 + System.setIn(), StringTokenizer
🧑‍💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴/Java

Java BufferedReader로 입력받기 + System.setIn(), StringTokenizer

BufferedReader 까먹는 것도 이제 지친다..

안까먹기 위해서 쓰는 포스팅 !


 

 

 

 System.setIn() 으로 파일에서 입력 받기 

import java.io.FileInputStream;


public class Test {
	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
	}
}

보통 알고리즘을 풀 때, 일일이 복붙해서 입력을 하는 게 아니라 파일에 집어넣고 읽어들이는 경우가 많습니다.

그럴때 사용하는 함수입니다. 이렇게 System.setIn() 을 이용하면 파일에서 입력을 받을 수 있습니다.

new FileInputStream() 과 함께 선언을 해줘야 합니다.

해당 루트 경로에 input.txt 파일을 두면 저런 식으로 경로를 찾아 파일을 읽어들일 수 있습니다.

만약 패키지 안에 input.txt 파일을 넣었다면 src/package1/input.txt 이런식으로 할 수 있습니다.

주의하실 점은 예외를 날리셔야 한다는 점입니다.

구체적인 예외처리 필요없이 그냥 제일 큰 예외인 Exception 을 날리시면 경고창이 사라집니다.

2022.07.07 - [🧑‍💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴/Java] - Java input 파일 입력받기 (파일 입출력)

 

Java input 파일 입력받기 (파일 입출력)

알고리즘을 풀 때 보통 입력 파일을 두고 테스트 케이스를 돌며 풉니다. 그럴 때 사용할 수 있는 방법에 대해서 알아보겠습니다. 간단한 java 파일 입력에 관한 포스팅입니다.  파일 입력받기 inpu

yeomss.tistory.com

위 포스팅을 참고하셔도 됩니다.

 

 

 

 BufferedReader 입력받기 

input.txt

1 2 3
4 5 6
7 8 9

만약 위와 같은 input.txt 파일이 있다고 가정합시다.

 

br.readLine()

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;


public class Test {
	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		System.out.println(br.readLine());

	}
}

BufferedReader의 br.readLint() 을 통해서 문자를 라인 단위로 읽어들일 수 있습니다.

첫째줄 라인만 읽어오신 것을 확인할 수 있습니다.

여러 줄의 라인을 읽어들일려면 반복문을 사용하면 됩니다.

 

In general, each read request made of a Reader causes a corresponding read request to be made of the underlying character or byte stream. It is therefore advisable to wrap a BufferedReader around any Reader whose read() operations may be costly, such as FileReaders and InputStreamReaders.

For example,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));

구글 번역:
일반적으로 Reader의 각 읽기 요청은 해당 읽기 요청이 기본 문자 또는 바이트 스트림으로 이루어지도록 합니다. 따라서 FileReader 및 InputStreamReader와 같이 read() 작업에 비용이 많이 들 수 있는 모든 Reader 주위에 BufferedReader를 래핑하는 것이 좋습니다.

new InputStreamReader 와 같이 래핑해서 사용을 합니다.

사용을 하는 이유는 위 긁어온 api 도큐먼트를 보면, 읽기 요청이 기본 문자 혹은 바이트 스트림으로 이루어지도록 하기 때문이랍니다.

정말.. setIn(new FileInputStream) 이랑 BufferedReader(new InputStreamReader) 랑 너무 헷갈려요 !

여러분들은 헷갈리지 말고 잘 사용하시길 바랍니다.

InputStream을 두고 하나는 앞에 File, 하나는 뒤에 Reader.. BufferedReader 니까 Reader... 주저리 이렇게 외워야겠어요.

 

br.readLine().charAt(0)

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;


public class Test {
	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		System.out.println(br.readLine().charAt(0));
		System.out.println(br.readLine().charAt(0));

	}
}

한 라인을 읽어서 그 중에 하나의 문자만 가지고 오고 싶으시다면 .charAt(index) 를 이용해서 가져올 수 있습니다.

첫번째 라인의 첫번째 문자인 1과, 두번째 라인 첫번째 문자인 4를 가져왔습니다.

 

 

 

 StringTokenizer 사용해서 공백 기준으로 입력받기 

input.txt

10
0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0 1
0 0 1 0 1 0 1 0 1 0
0 0 0 1 0 1 0 1 0 1
0 1 0 0 0 1 0 0 0 1
0 0 1 0 0 0 0 0 1 0
0 1 0 0 0 1 0 0 0 0
0 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0

 

StringTokenizer

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;


public class Demo3_4 {
	public static int N;
	public static int[][] map;


	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		N = Integer.parseInt(br.readLine());
		map = new int[N][N];
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}

			System.out.println(Arrays.toString(map[i]));

		}

	}
}

그렇다면 한 줄에 있는 값을 어떻게 쪼개는가가 궁금하실 겁니다.

그때는 StringTokenizer 나 Split 를 이용하시면 됩니다.

StringTokenizer 를 선언하시고 그 안에 br.readLine() 을 넣어줍니다.

그러면 디폴트로 공백을 기준으로 문자열들이 하나하하나 쪼개집니다.

이를 2차원 배열에 넣고 출력을 해보면 다음과 같은 결과가 나옵니다.

 

 

 

 

 

 

# java bufferedreader # java 파일 입출력 # java br.readLine() # java br.readLine().charAt # java StringTokenizer


 

 

 

 

728x90