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 파일 입력받기 (파일 입출력)
위 포스팅을 참고하셔도 됩니다.
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
'🧑💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴 > Java' 카테고리의 다른 글
Java 기본 클래스를 찾거나 로드할 수 없습니다 + java.lang.UnsupportedClassVersionError 오류 해결 (0) | 2022.07.25 |
---|---|
Java Eclipse 프로젝트 빨간 느낌표 뜨는 오류 해결 (0) | 2022.07.25 |
Java 배열 뒤집기 + swap (0) | 2022.07.19 |
Java 문자 아스키 코드로 변환하기 (문자 to 아스키) (0) | 2022.07.19 |
Java 2차원 배열 접근 + 별찍기 응용 (0) | 2022.07.18 |