김갱환
맨땅에 코딩
김갱환
전체 방문자
오늘
어제
  • 분류 전체보기 (239)
    • ⁂ 맨땅에 코딩 (11)
      • : Story (3)
      • : MiniProject 'MyWeb' (1)
      • : Final Project (5)
      • : Josa-Moa 한국어 조사 처리 프로젝트 (1)
    • —————Frontend——————————————.. (0)
    • ⁂ HTML (10)
      • : 기본 익히기 (10)
    • ⁂ CSS (15)
      • : 기본 익히기 (15)
    • ⁂ Java Script (32)
      • : 기본 익히기 (28)
      • : 자바스크립트 라이브러리 (1)
      • : 연습 문제 (3)
    • ⁂ jQuery (11)
      • : 기본 익히기 (11)
    • ⁂ Bootstrap (3)
      • : 기본 익히기 (3)
    • ⁂ TailWind CSS (1)
    • ⁂ AJAX (5)
      • : 기본 익히기 (5)
    • ⁂ Vue.js (3)
      • : 기본 익히기 (3)
    • —————DB : Data Base————————.. (0)
    • ⁂ Oracle DB (27)
      • : 기본 익히기 (24)
      • : 연습 문제 (3)
    • ⁂ MyBatis Framework (15)
      • : 기본 익히기 (15)
    • —————Backend———————————————.. (0)
    • ⁂ Java (62)
      • : 기본 익히기 (42)
      • : JDBC - Java DataBase Conn.. (4)
      • : Crawling (2)
      • : 독학으로 공부하기(과거) (11)
      • : 연습문제 (3)
    • ——————Web————————————————— (0)
    • ⁂ JSP (28)
      • : 기본 익히기 (28)
    • ⁂ Spring FrameWork (15)
      • : Legacy Project (1)
      • : 기본 익히기(Boot 기반) (14)
    • ——————————————————————— (0)
    • ⁂ Error Note (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코딩 #코딩공부 #프론트앤드 #백앤드 #풀스택개발자
  • 코딩공부 #코딩 #자바 #자바독학 #자바공부 #개발자 #프론트앤드 #백앤드 #풀스택
  • HTML공부
  • ErrorPage
  • 개발자
  • 코딩 #코딩공부 #상수 #리터럴 #형변환 #개발자 #자바 #자바공부 #자바독학
  • 자바
  • 객체지향프로그래밍
  • httperror
  • 자바공부
  • 코딩공부
  • 코딩
  • 백앤드
  • http에러메세지
  • 코딩공부 #자바공부
  • 비트연산자 #코딩공부 #자바공부 #코딩 #자바 #프로그래밍 #개발자
  • 풀스택
  • web.xml수정
  • 프론트앤드
  • 연산자 #기본연산자 #코딩 #자바 #독학 #자바공부 #자바연산자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김갱환
⁂ Java/: 기본 익히기

[JAVA] #10-1 입출력스트림 : 입력(Input) - byte형과 char형

⁂ Java/: 기본 익히기

[JAVA] #10-1 입출력스트림 : 입력(Input) - byte형과 char형

2022. 9. 20. 11:00

1. 입출력 스트림

 

 프로그램은 데이터를 읽고 출력하는 작업을 계속해서 수행한다.

 데이터는 개발자들의 키보드로도 입력될 수도 있지만 파일이나 네트워크에서도 입력될 수 있다.

 반대로 모니터로 출력이 될 수 있지만 파일이나 네트워크 상으로 출력될 수 있다.

 

 자바에서도 HTML이나 CSS처럼 버튼을 만들 수도 있고 프레임을 짤 수도 있다.

 이런 패키지들은 java.awt.* 이나 javax.swing.* 에 대부분 포함되어있다.

 

 하지만 웹에서 출력을 건드릴 때는 HTML이나 XML에서 작업하는 것이 훨씬 용이한 편이다.

 그렇기에 이번 게시글에서는 자바에서 데이터를 파일로 입출력하는 것에 대해 집중하여 알아보려 한다.

 (java.io.* 패키지를 활용할 예정이다. 여기서 io란 input과 output을 의미한다)

 

 

2. 어떤 파일에 출력할거야?

 

 파일들은 다양한 확장자를 가지고 있다.

 - .java / .class / .html / .css / .js / .txt / .pdf / .xls / .jpg / .gif / .png 등등등

 그래서 자바에서 파일에 무언가를 출력할 때는 어떤 확장자에 출력시킬 건지를 결정하여야 하고 그것과 관련된 클래스들이 수없이 존재한다.

 

 이러한 클래스들은 크게 두 종류로 구분이 된다.

구분 입력 출력
바이트(byte) 기반 스트림(1바이트) :
그림, 멀티미디어 등의 바이너리 데이터를 입출력
InputStream OutputStream
문자(character) 기반 스트림(2바이트) :
문자 데이터를 입출력
Reader Writer

 

 이정도의 개념을 이해한 뒤 이제 파일로 입출력을 해보려한다.

 이 게시글에서는 메모장 파일(.txt)에 출력을 시키는 것로 연습해보려한다.

 

 

3. 메모장 파일에 입출력시키기

 

 메모장 파일에 입출력을 시키기 위해선 우선 출력될 메모장 파일을 만들어야 할 것이다.

 이클립스에서도 아래와 같이 메모장 파일을 손쉽게 만들 수 있다.

 

파일을 선택하고

 

확장명까지 입력해주면 생성된다(이미 만들어둔게 있어서 오류가 났다)

 

 만들어진 메모장에는 아래와 같은 내용을 입력해두었다.

 

 

 이제 이 data.txt파일을 byte형과 char형으로 불러보려 한다.

 (한글은 1바이트를 할당하는 byte형에선 아마 깨질 것이다, 깨질 것을 염두에 두고 불러와보자)

 

1) byte 기반으로 입력 시키기(InputStream / OutputStream)

 byte 기반으로 입출력 시키는 것은 인풋스트림과 아웃풋스트림을 활용한다.

파일에 접근할 때는 늘 파일이 존재하지 않는 때도 염두에 두어야 하기에 예외처리가 꼭 필요하다.

 

① 파일 경로 가져오기

 우선 파일의 경로를 String 타입의 변수에 담았다.

String filename = "C:/java202207/workspace/basic01_java/src/oop0920/data.txt";

 

② 파일 경로를 InputStream 클래스에 담기

 그리고 InputStream의 하위 클래스인 FileInputStream 클래스로 새로운 인스턴스를 만든 뒤 파일을 담으려 한다.

 이렇게 하지 않으면 filename은 그저 긴 문자열에 불과할 뿐이다.

FileInputStream fis = null;

 

③ 예외처리하기

 이 후 예외처리를 시작한다!

// 예외처리(파일이 없어도 프로그램이 정상적으로 종료되도록)
// 파일을 열면 파일을 닫아야 다른 페이지에서 같은 파일을 사용할 때 오류가 나지 않는다
try {

} catch (Exception e) {
    System.out.println("파일 읽기 실패 : " + e);
} finally {
    // 자원 반납
    try {
        if(fis!=null) { fis.close(); }
    } catch (Exception e) {	}
} // end

 

④ 결과 확인하기

 이제 fis에 filename을 담고 이클립스에서 결과를 확인해보자.

 출력을 시킬 땐 InputStream의 read() 메서드를 활용한다.

 read() 메서드는 출력할 파일에서 1바이트씩을 계속 가져오는 기능을 한다.

 이것을 while문의 무한 루프 안에 넣고 바이트값이 -1이 되는 때까지(파일이 끝나서 아무런 내용이 없을 때까지) 반복시킨다.

fis = new FileInputStream(filename);
while(true) {
    int data = fis.read();	// 1바이트 읽기
    if(data==-1){	// 파일의 끝(End Of File)인지? * BOF도 있음
        break;
    } // if end
    System.out.println(data);
} // while end

 read() 메서드는 바이트값이기 때문에 data를 int 형으로 담았다.

 그래서 이것을 문자열형으로 가져와야한다.

 printf 메서드를 활용하여 문자열형으로 가져와보자.

fis = new FileInputStream(filename);
while(true) {
    int data = fis.read();	// 1바이트 읽기
    if(data==-1){	// 파일의 끝(End Of File)인지? * BOF도 있음
        break;
    } // if end
    System.out.printf("%c", data);
} // while end

출력은 잘 이루어졌지만 한글이 다 깨졌다

 

 이렇게 data.txt 파일을 잘 가져왔지만(Input) 한글이 다 깨진 것을 확인할 수 있다.

 이처럼 우리가 byte형을 쓸 것인지, char형을 쓸 것인지는 파일의 내용을 보고 개발자가 판단해야한다.

 

 

2) char 기반으로 입력 시키기(Reader / Writer)

 char 기반으로 입출력 시키는 것은 Reader과 Writer을 활용한다.

 방식은 byte 기반의 입력 방식과 동일하며 클래스는 Reader 클래스의 하위 클래스인 FileReader 클래스를 활용한다.

 전체 코드만 아래에 실어두었다.

 

package oop0920;

import java.io.FileReader;

public class Test02_input {

	public static void main(String[] args) {
		// 2) char형 기반 -> 한글 안깨짐
		
		String filename = "C:/java202207/workspace/basic01_java/src/oop0920/data.txt";		
		FileReader fr = null;
		
		// 예외처리(파일이 없어도 프로그램이 정상적으로 종료되도록)
		// 파일을 열면 파일을 닫아야 다른 페이지에서 같은 파일을 사용할 때 오류가 나지 않는다
		try {
			
			fr = new FileReader(filename);
			while(true) {
				int data = fr.read();	// 2바이트 읽기
				if(data==-1){	// 파일의 끝(End Of File)인지? * BOF도 있음
					break;
				} // if end
				System.out.printf("%c", data);
			} // while end
			
		} catch (Exception e) {
			System.out.println("파일 읽기 실패 : " + e);
		} finally {
			// 자원 반납
			try {
				if(fr!=null) { fr.close(); }
			} catch (Exception e) {	}
		} // end

	} // main() end
} // class end

 

저작자표시 비영리 동일조건 (새창열림)

'⁂ Java > : 기본 익히기' 카테고리의 다른 글

[JAVA] #10-3 입출력스트림 : 출력(Output)  (0) 2022.09.20
[JAVA] #10-2 입출력스트림 : 입력(Input) - BufferedReader  (0) 2022.09.20
[JAVA] #9-6 File 클래스  (0) 2022.09.19
[JAVA] #9-5 스레드(Thread)  (0) 2022.09.19
[JAVA] #9-4 제네릭(Generic) 이해하기 2 - 제네릭  (0) 2022.09.16
    '⁂ Java/: 기본 익히기' 카테고리의 다른 글
    • [JAVA] #10-3 입출력스트림 : 출력(Output)
    • [JAVA] #10-2 입출력스트림 : 입력(Input) - BufferedReader
    • [JAVA] #9-6 File 클래스
    • [JAVA] #9-5 스레드(Thread)
    김갱환
    김갱환
    코딩의 코자도 모르는 이의 공부 기록장

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.