알고리즘을 풀 때 보통 입력 파일을 두고 테스트 케이스를 돌며 풉니다.
그럴 때 사용할 수 있는 방법에 대해서 알아보겠습니다. 간단한 java 파일 입력에 관한 포스팅입니다.
파일 입력받기
input.txt 파일 내용
10
1 2 3
4 5 6
안녕하세요!
예를 들어서 다음과 같은 입력 파일이 있다고 합시다.
해당 라인마다 입력을 받고 싶습니다. 그러면 우선 input.txt 파일을 읽어야겠죠?
public class Test {
public static void main(String[] args) throws FileNotFoundException {
System.setIn(new FileInputStream("src/sw/expert/academy/input.txt"));
}
}
java.lang.System.setIn 함수는 Java의 표준 입출력을 재할당합니다.
즉, 키보드 입력 대신 해당 경로에 있는 파일을 이용하여 바이트 파일을 읽어오겠다는 뜻입니다.
어떻게 읽어오냐면 FileInputStream 을 이용하여 파일을 읽어들입니다.
여기서 또 주의하실 점은 System.setIn() 을 단독으로 쓰시면 에러가 나옵니다.
이를 사용하기 위해서는 FileNotFoundException 을 던져주거나 혹은 try-catch 문을 사용해야 합니다.
현재 경로 확인하기
그런데 지금 현재 파일이 어디에 있는지, 어느 경로에 위치해 있는지 헷갈리 때가 있습니다.
Path curPath = Paths.get("");
String path = curPath.toAbsolutePath().toString();
System.out.println(path);
그럴 때는 위와 같은 코드로 현재 경로를 확인할 수 있습니다.
따라서 해당 input 파일이 패키지 안에 들어있다면 현재 경로/src/패키지/input.txt 에 있는 것이죠.
Scanner 이용하기
nextInt()
public class Test {
public static void main(String[] args) throws FileNotFoundException {
System.setIn(new FileInputStream("src/sw/expert/academy/input.txt"));
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
sc.nextLine();
System.out.println(T);
}
}
// 출력
10
nextInt() 를 이용하여 int 타입을 하나 입력 받을 수 있습니다.
nextInt() 는 마지막 개행문자(\n)를 제거하지 않는다는 점을 주의해야 합니다.
이는 밑에서 설명하겠습니다.
int T = sc.nextInt();
System.out.println(T);
String first = sc.nextLine();
System.out.println(first);
// 출력
10
// 기대하는 바는
// 10
// 1 2 3 인데 달리 나옴
출력을 보니 이상합니다.
분명 기대했던 출력 결과는 10 다음에 1 2 3 이 오는 것 입니다.
하지만 그게 오지 않고 공백이 옵니다.
이는 아까전에 설명해드렸던 nextInt() 가 개행문자를 삭제하지 않아서 생기는 문제입니다.
따라서 nextInt() 다음에 만약 nextLine() 을 사용하신다면 개행문자를 삭제하고 사용해야 합니다.
(nexInt() -> nex() 는 옳게 나옴)
int T = sc.nextInt();
System.out.println(T);
sc.nextLine(); // 해당 코드를 추가해주면 된다.
String first = sc.nextLine();
System.out.println(first);
// 출력
10
1 2 3
해결하는 방법은 쉽습니다.
한번 더 sc.nextLine() 을 추가하여 개행문자를 읽어들이고 다음 입력값으로 건너뛰면 됩니다.
nextLine()
System.setIn(new FileInputStream("src/sw/expert/academy/input.txt"));
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
sc.nextLine();
String first = sc.nextLine();
String second = sc.nextLine();
String third = sc.nextLine();
System.out.println(T);
System.out.println(first);
System.out.println(second);
System.out.println(third);
// 출력
10
1 2 3
4 5 6
안녕하세요!
nextLine() 을 사용해서 파일의 각 라인을 읽어들입니다. 뭉텅이로 들어옵니다.
그래서 만약 배열로 사용하고 싶다면 split() 나 Tokenizer 를 사용해야 합니다.
next()
System.setIn(new FileInputStream("src/sw/expert/academy/input.txt"));
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
sc.nextLine();
System.out.println(T);
String a1 = sc.next();
String a2 = sc.next();
String a3 = sc.next();
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
// 출력
10
1
2
3
next() 는 공백을 기준으로 문자를 하나씩 읽어들입니다.
즉 1 2 3 이라는 라인이 있다면 이를 공백을 기준으로 1, 2, 3 이렇게 각각 읽어들일 수 있습니다.
# java Scanner # java 파일입출력 # java next() # java nextLine() # java nextInt() # nextInt() 공백
# java nextInt() nextLine() 오류 # 자바 scanner
'🧑💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴 > Java' 카테고리의 다른 글
Java 라이브러리, jar 파일 추가하기 (0) | 2022.07.16 |
---|---|
Java 배열 요소 한번에 출력하기 + Arrays.toString() (0) | 2022.07.12 |
Java 문자열 숫자형으로 변환(str to int), 숫자형 문자열로 변환(int to str) (0) | 2022.07.07 |
Java 이클립스 Formatter 설정 + Save Actions (0) | 2022.07.05 |
Java 이클립스(Eclipse) 설치 with MAC (1) | 2022.07.04 |