Study/Java

[Java] 파일 입출력 정리

개발개발개발 2021. 9. 8. 23:58

업무를 보던 중 특정 기간내에 몇 천 건의 DB 자료들을 뽑아야하는 일이 있었다. 하지만 내가쓰고 있는 DB Tool인 MySql workbench 로는 부하가 많이 가서 쿼리 실행중에 계속 오류가 발생하였다. 이를 해결하기 위해 임시로 로컬에서 DB를 접속하여 자바 코드를 통해 데이터를 뽑아 냈다.

 

파일 입출력은 자주 쓰지 않아서인지 사용할 때 마다 매번 까먹고 다시 찾고를 반복한다.. 그래서 다시 찾아보더라도 내가 정리한 걸 보기위해 이번 기회에 제대로 정리해본다.. 

 

File 클래스 

OutputStream

FileReader 

FileWriter

BufferedWriter

BufferedReader

Scanner

..

..

 

스트림 Stream

파일에서 입력과 출력이라는 동작을 하려면 파일로 데이터를 전달하거나 파일로부터 전달 받는 길을 열어주어야 한다.

그러한 길을 "스트림"이라고 한다.  스트림은 크게 문자 단위 Stream과 Byte 단위 Stream으로 나뉠 수 있다.

바이트 스트림

입력 InputStream -> FileInputStream -> BufferedInputStream

출력 OutputStream -> FileOutputStream -> BufferedOutputStream

문자스트림

입력 Reader -> FileReader -> BufferedReader

출력 Writer -> FileWriter -> BufferedWriter

 

버퍼를 활용한 파일 입출력 

버퍼는 데이터가 쌓이기를 기다렸다가 꽉 차게되면 한 번에 읽는 방식이다. 데이터를 직접 보내는 것이 아니라, 메모리 버퍼로 데이터를 고속 전송하기 때문에 성능이 향상된다. 

 

try {
	con = DBConnector.getConnection();
	//BufferedOutputStream output = new BufferedOutputStream( new FileOutputStream("C:\\Users\\PC-2020\\Desktop\\1\\tmp.txt"));
	FileWriter fw = new FileWriter("C:\\Users\\PC-2020\\Desktop\\tmp.txt"); //출력 스트림
	BufferedWriter bw = new BufferedWriter(fw); //출력 버퍼
	StringBuilder sbQuery = new StringBuilder();

	sbQuery.append("select a.vanno, count(*) from transact a ");
	sbQuery.append("inner join van b on a.vanno = b.vanno ");
	sbQuery.append("where a.vanno in (96, 88, 86) and ");
	sbQuery.append("a.reqdt between '2021-06-30 00:00:00' and '2021-07-01 00:00:00' ");
	sbQuery.append("group by a.vanno ");

	long before = System.currentTimeMillis();
	try (PreparedStatement pstmt = con.prepareStatement(sbQuery.toString())) {
			try (ResultSet rs = pstmt.executeQuery()) {

				while(rs.next()) {
					bw.write(rs.getString("vanno"));
					bw.write(" ");
					bw.write(rs.getString("count(*)"));
					bw.newLine(); //개행
					}
				}
			}
		long after = System.currentTimeMillis();
		System.out.println((after-before)/1000);
		con.close();
	} catch (Exception e) {
	// TODO: handle exception
}

 

파일을 읽고 쓰는 것도 다양한 함수가 있었다. 

나는 FileWriter를 사용하여 출력 스트림을 생성하였고 BufferedWriter를 통해 출력 버퍼를 생성하였다. 

 

 

 

BufferedInputStream   & BufferedOutputStream

바이트 기반 성능 향상 보조 스트림, 최대 8912 바이트

 

BufferedReader & BufferedWriter

문자 기반 성능 향상 스트림, 최대 8912 문자

 

두 클래스의 차이는 파일내용이 텍스트(문자열)라면 char stream을 사용하는 Writer 계열이 byte stream을 사용하는 stream 계열보다 조금 빠르다 라는 점이다. 

 

 

결론 

다양한 스트림의 종류와 입출력 객체들이 있지만 각 기능을 이해하면 필요할 때 원하는 스트림을 사용할 수 있다. 가장 중요한 것은 문자열이냐, 바이트 형식이냐에 따라 쓰임새가 다르다. 

'Study > Java' 카테고리의 다른 글

[Java] Servlet(서블릿) 이란?  (0) 2022.03.01
[Java] 직렬화(Serialization)  (0) 2021.10.25
[Java] 멀티 쓰레드(Multi Thread)  (0) 2021.09.14
자바 2차원 배열 정렬하기  (0) 2020.09.01