본문 바로가기

JAVA

파일 입출력 - 객지설 13주차

스트림

- 순차적인 접근 (순서를 바꿀 순 있으나 자유롭진 않음)

 

입출력스트림

- 자바에서 어떤 장치에 데이터를 쓰려면 장치와 연결된 스트림을 생성한 후, 스트림에 데이터를 쓰면 됨.

- 자바에서 어떤 장치에서 데이터를 읽으려면 장치와 연결된 스트림을 생성한 후, 스트림에서 데이터를 읽으면 됨.

 

입출력스트림 종류

바이트 스트림 (이진 데이터, 8비트)

- binary 파일 : text 파일 외의 내용 (ex. 한글, 파워포인트 등)

* binary 파일은 메모장으로 열면 이상한 문자들이 나온다 -> 글꼴, 여백, 글자 크기 등등의 정보가 있기 때문

- 입력 바이트 스트림(...InputStream)

- 출력 바이트 스트림(...OuputStream)

 

문자 스트림(문자 데이터, 16비트)

- text 파일 : 사람이 보기에 의미 있는 내용 (ex. 메모장)

- 입력 문자 스트림(...Reader)

- 출력 문자 스트림(...Writer)

해당 본문에서는 문자스트림을 집중적으로 다뤄 보겠음.

 

문자 스트림

- 수많은 하위 클래스를 갖고 있음. (* 바이트 스트림에도 수많은 하위클래스가 존재함.)

모든 문자 스트림 클래스는 Reader와 Writer 클래스로부터 상속됨.

-> 파일에서 문자를 읽거나 쓰려면 FileReader와 FileWriter를 사용함.

 

스트림 생성하기

- 파일을 열 때는 예외 발생 가능성이 높음. 따라서 try-catch 문을 이용하여 FileNotFoundException 예외 처리가 필요함.

FileReader fr = new FileReader("text.txt");

 

스트림 닫기

- 사용이 끝나면 반드시 파일을 닫아주어야 함.

fr.close()

 

 

중간 처리 스트림 - 버퍼 스트림

- JAVA는 버퍼링된 스트림을 제공함

- 버퍼 입력 스트림은 입력 장치에서 한 번에 많이 읽어서 버퍼에 저장.

- 프로그램이 입력을 요구하면 버퍼에서 꺼내서 반환함

*버퍼가 비어있을 때는 입력 장치에서 읽음.

* 버퍼가 없는 스트림을 버퍼가 있는 스트림으로 변경하려면 버퍼 스트림 객체를 생성하며 생성자의 인수로 버퍼가 없는 스트림 객체를 전달하면 됨.

- 문자 스트림의 버퍼 스트림 : BufferReader, BufferWriter, PrintWriter

*  만약 익숙한 출력 하무를 사용하려면 PrintWriter을 사용하는 것이 좋음

 

 

PrintWriter

- Writer 클래스의 하위 클래스임

- 파일 입출력 : void print(...), void println(...)

- 파일 닫기 : void close()

 

- 파일에 쓰기

import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        try {
        	PrintWriter pw = new PrintWriter(new FileWriter("out.txt"));
        	
        	pw.print("288" + "\t");
        	pw.println(567.000);
        	
        	if (pw != null) {
        		pw.close();
        	}
        } catch (IOException e) {
        	e.printStackTrace();
        } finally {
        	System.out.println("프로그램 작성이 완료 되었습니다.");
        }
    }
}

 

파일 결과

 

- 파일에서 읽어오기

import java.util.Scanner;
import java.io.FileReader;
import java.io.FileNotFoundException;

class Test {
    public static void main(String[] args) {
        try {
        	Scanner sc = new Scanner(new FileReader("input.txt"));
        	
        	while(sc.hasNext() == true) { //파일에서 읽어올 게 있으면 실행
        		String s = sc.next();
        		System.out.println(s);
        	}
        	
        	if (sc != null) {
        		sc.close();
        	}
        } catch (FileNotFoundException e) {
        	e.printStackTrace();
        }
    }
}

//출력결과
288
567.0

* hasNext() : true/false 반환

- 파일에서 읽을 게 있으면 true 읽을 게 없으면 false

* next() : Object 반환

- 다음 원소를 반환.

 

- 파일에서 읽어오기 2

input 파일

import java.util.Scanner;
import java.io.FileReader;
import java.io.FileNotFoundException;

class Test {
    public static void main(String[] args) {
        try {
        	Scanner sc = new Scanner(new FileReader("input.txt"));
        	
        	int sum = 0;
        	while (sc.hasNext()) {
        		if(sc.hasNextInt()) {
        			int i = sc.nextInt();
        			System.out.println(i + " ");
        			sum = sum + i;
        		}
        		else {
        			sc.next();
        		}
        	}
        	
        	if (sc != null) {
        		sc.close();
        	}
        	
        	System.out.println("합계의 합: " + sum);
        } catch (FileNotFoundException e) {
        	e.printStackTrace();
        }
    }
}

//출력결과
10 
5 
55 
합계: 70

 

'JAVA' 카테고리의 다른 글

[JAVA] JUnit  (0) 2024.06.27
[JAVA] 패키지란?  (0) 2024.06.27
상속과 구성 - 객지설 12주차  (0) 2024.05.27
컬렉션/ArrayList/HashSet - 객지설 11주차  (0) 2024.05.23
제네릭 - 객지설 10주차  (0) 2024.05.17