티스토리 뷰

입출력 전에, 스트림에 대해서 공부하겠습니다.


스트림이란? 순서가 있는 데이터를 운반하는데 사용되는 연결 통로이다.

하나의 스트림은 단 방향 통신만 가능하다.


* 입력 스트림 : 데이터 소스로부터 데이터를 읽기 위한 스트림이다.

* 출력 스트림 : 데이터 소스에 데이터를 소비하기 위한 스트림이다.



* 스트림의 종류

바이트 스트림(byte stream)

데이터 종류가 파일, 그림, 동영상 등의 바이트 기반인 경우 8비트의 바이트 단위로

입출력하는 클래스

문자 스트림(character stream)

문자데이터를 입출력하는 클래스



버퍼란? 데이터를 일정 크기 단위로 묶어서 저장하는 창고이다.

자바에서는 버퍼링된 스트림을 제공한다.


Why? 문자 하나하나를 처리하기엔 버겁기 때문에(오버헤드) 버퍼에 만들어진 일정공간에 담아서 사용한다.


* 버퍼 스트림

바이트기반 스트림

문자기반 스트림

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter 



* flush() : 버퍼의 모든 내용을 출력소스에 출력한 다음, 버퍼를 수동으로 비운다.






File 객체

-  File객체는 파일이 아닌 파일 이름을 나타내는데,

   파일 이름에 해당되는 파일이 실제로 존재하지 않을 수도 있다.


Why? 프로그램이 File객체를 이용하여 파일 이름을 파싱할 수 있기 때문이다.


File객체 생성 => File file = new File("Example.txt");


* File 클래스의 메소드

반환형

메소드

설명

boolean

exists()

파일의 존재 여부

boolean

delete()

파일을 삭제한다.

boolean

canExecute()

파일을 실행할 수 있는지의 여부

boolean

canRead()

파일을 읽을 수 있는지의 여부

boolean

canWrite()

파일을 기록할 수 있는지의 여부

boolean

isFile()

파일이면 참(true)이다.

boolean

isDirectory()

파일이 디렉토리이면 참(true)이다.

boolean

isHidden()

파일이 숨겨진 파일이면 참(true)이다.

string

getName()

파일의 이름을 반환한다.

string

getParent()

파일의 부모 경로 이름을 반환한다.

string

getPath()

파일의 경로를 반환한다.

long

length()

파일 길이를 반환한다.




간단한 이론을 마치고 실습을 통해 공부하겠습니다.

기본적인 파일 객체를 이용하여 전송하는 클래스입니다.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class ExampleIO01 {
	public static void main(String[] args) throws IOException {
		// 1) File 클래스
		// => 디스크 상에 존재하는 파일을 다루기 위한 클래스

		File file = new File("tset1.txt");

		// 만약에 파일이 존재하지 않으면
		// File.exists() => 파일이 존재하면 true, 존재하지 않으면 false
		if (!file.exists()) {
			System.out.println("파일이 존재하지 않습니다.");
			file.createNewFile(); // 파일을 새로 만든다. => Checked Exception.
		}

		// 1) 목적지 : file - test.txt에다가
		// 2) 데이터를 출력할 것이다. (write)

		// 파일에 텍스트 형태의 데이터를 출력하기 위해서
		// Writer 객체를 만든다. 1,2번 단계를 동시에 수행

		// 무엇을 할것인지? 목적지, 이어 쓸 것인지 여부 (is Append) default : false
		Writer out = new FileWriter(file, true);

		// 목적지에 데이터 출력 (write 메소드 활용)
		out.write("ABCDE\n");
		out.write("안녕히 가세요");

		// 목적지와 무엇을 할 것인지 설정이 완료되면 바로 닫아준다.
		out.close();
		System.out.println("프로그램 종료");
	}
}



기본적인 파일 객체를 이용하여 불러오는 클래스입니다.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ExampleIO2 {
	public static void main(String[] args) throws IOException  {
		File file = new File("tset1.txt");
		
		// 파일이 존재한다면
		if(file.exists()){
			// 뭘 한건지?					목적지 => 목적지에서 읽어 오겠다.(Input - Reader) 
			Reader in = new FileReader(file);
			// 1) reader에서는 한글자 한글자씩 읽어온다.
			
			int readData=0;		// EOF : -1 => End Of File
			
			while((readData = in.read())!= -1){
				System.out.print((char)readData); // 유니코드인 int로 읽어오기 때문에 char로 형변환 해야한다.
			}
			System.out.println();
			in.close();			
		}else{
			System.out.println("파일이 없습니다.");
		}
		
		System.out.println("프로그램 종료");
	}
}



보조스트림을 사용하여 전송하는 클래스 입니다.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class ExampleIO3 {
	public static void main(String[] args) throws IOException {

		// 보조 스트림
		// => 주 스트림을 보조해주는 스트림
		// 주 스트림에는 없는 여러가지 기능들을 제공한다.
		// BufferedReader/InputStream
		// BufferedWriter/OutputStream

		File file = new File("BufferedTest1.txt");
		if (!file.exists()) {
			file.createNewFile();
		}
		// 1) 주 스트림을 설정한다.
		FileWriter out = new FileWriter(file);

		// 2) 보조스트림을 만든다. 매개변수로 주스트림 객체가 들어간다.
		BufferedWriter bw = new BufferedWriter(out);

		// * 배열이라고 하는 것을 전부다 버퍼(Buffer)라고 한다.
		// 5개 짜리 배열
		bw.write("Hello"); // char[] 버퍼를 만든다. 해당 문자열의 갯수만큼이 char 형 배열을 만들고
							// 해당 데이터를 복사 한 후에 파일에 전송한다. \n또는 문자열이 끝난 것을 기준으로
							// 한다.
							// BufferedWriter에서 자동으로 배열을 만들어 낸다.

		bw.write("World!!!"); // 8개 짜리 배열

		// 보조스트림을 닫으면 주 스트림은 자동으로 닫힌다.
		bw.close();
		System.out.println("프로그램 종료");
	}
}



보조스트림을 사용하여 읽어오는 클래스 입니다.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ExampleIO04 {

	public static void main(String[] args) throws IOException {

		File file = new File("BufferedTest1.txt");

		if (file.exists()) {
			// 1) 주 스트림 객체 생성
			FileReader in = new FileReader(file);

			// 2) 보조 스트림 객체 생성
			BufferedReader br = new BufferedReader(in);
			// BufferedReader readLine() => 한 줄씩 한꺼번에 읽어온다.
			// 								(개행문자를 만나기 전까지의 문자열들을 한번에 읽어온다.)
			
			String line = "";
			
			// 한 줄씩 읽어오다가 더 이상 읽을 줄이 없을 떄 까지 반복
			while((line = br.readLine())!=null){
				System.out.println(line);
			}

		} else {
			System.out.println("파일이 없습니다.");
		}
		System.out.println("프로그램 종료");
	}
}



배운 내용을 토대로 실습하도록 하겠습니다. 키보드로 입력받은 내용을 전부 다 log.txt에 저장 "exit" 입력 시 프로그램 종료 프로그램을 다시 실행하면 log.txt에 입력 되어 있던 내용을 표시 Buffered Reader // Writer를 사용할 것. 최초 실행 시 log.txt가 없어 -> createNewFil() 있다면 내용 다 뿌려주고 다시 입력 받기 실행(isAppend = true) 이어쓰기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

// System.in
// System.out

// 1) System: 환경

// System.in: 환경에서 뭔가 데이터를 받아오겠다. (대표적인 입력 장치로부터 ...)
// 키보드 (대표적인 입력 장치)

// System.out: 환경에다 뭔가 내가 발생시킨 데이터를 출력하겠다.
// 모니터 (대표적인 출력 장치)



public class ExampleIO05 {

	public static void main(String[] args) throws IOException {

		String str = "";
		File file = new File("log.txt");
		Scanner sc = new Scanner(System.in);
		
		if (file.exists()) {
			FileReader in = new FileReader(file);
			BufferedReader br = new BufferedReader(in);
			String line = "";
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
			br.close();
		} else {
			file.createNewFile();
		}
		
		FileWriter out = new FileWriter(file, true);
		BufferedWriter bw = new BufferedWriter(out);
		
		while (!str.toLowerCase().equals("exit")) {
			System.out.print("내용 입력 >> ");
			str = sc.nextLine();
			if (str.toLowerCase().equals("exit")) {
				System.out.println("프로그램 종료");
				continue;
			}
			bw.write(str + "\n");
		}
		bw.close();
	}
}
반응형
LIST
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함