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

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

알고리즘을 풀 때 보통 입력 파일을 두고 테스트 케이스를 돌며 풉니다.

그럴 때 사용할 수 있는 방법에 대해서 알아보겠습니다. 간단한 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


 

728x90