본문 바로가기

국비지원_핀테크

15일차_ [java] 파일 입, 출력 ( File I/O )

 

 

 

 

 

파일 입, 출력 ( File I/O )

파일 입, 출력 ( File I/O )

 

 

 

 

 

FileOutputStream

 

새로 생성한 테스트 폴더에 파일이 존재하지 않음

 

package file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Ex01 {
public static void main(String[] args) throws IOException {
	
	// 파일 경로 지정(E:\\0.핀테크\\test) 및 생성할 파일(\\test.txt) 설정
	File path = new File("E:\\0.핀테크\\test\\test.txt");
	
	// 내보내는 통로 OutputStream
	FileOutputStream fos = new FileOutputStream(path); // 위에서 설정한 경로 변수로 설정, 예외처리 throws 로 처리함
	fos.write( 97 ); // 예외처리 thorws 로 처리
	fos.write( 'a' ); // 예외처리 throws 로 처리
	// write() 메소드는 int 자료형과 byte 자료형만 입력할 수 있다
	fos.write("test".getBytes()); // 문자열을 처리하려면 byte 형으로 변환하여 사용해야 한다
	
	// 가져오는 통로 InputStream
	
}
}

파일 스트림 사용

 

위 코드 실행 후 파일이 생성된 모습

 

파일 내용 확인

 

package file;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Ex02 {
public static void main(String[] args) throws Exception {
	
	Scanner sc = new Scanner(System.in);
	// 경로 설정
	String path = "E:\\0.핀테크\\test\\test2.txt";
	// 파일 내보내는 통로인 FileOutputStream 생성
	FileOutputStream fos = new FileOutputStream(path);
	
	// 입력 내용 받기
	System.out.print("출력할 내용 입력 >> ");
	String  name = sc.next();
	
	// byte 형태로 문자열 전달하여 생성
	fos.write(name.getBytes());
	System.out.println("내용이 저장되었습니다!");
	
}
}

텍스트 입력받은 후 생성되는 파일 확인

 

파일이 정상적으로 생성된 모습

 

package file;

import java.io.File;

public class Ex03 {
public static void main(String[] args) {
	// 문자열로 경로를 생성하는 경우 문자열에 존재하는 메소드만 사용할 수 있다
	String sPath = "c:/test/";
	
	// 하지만 경로를 File 자료형으로 선언하면 File 클래스에 존재하는 메소드를 사용할 수 있다
	File fPath = new File("E:\\0.핀테크\\abcd");
	fPath.mkdir(); // abcd 디렉토리 생성
	fPath.delete(); // abcd 디렉토리 삭제
	
	fPath = new File("E:\\0.핀테크");
	// list() 메소드는 반환 형태가 String[] 배열
	String[] s = fPath.list();
	// 존재하는 파일 갯수
	System.out.println(s.length); // 7 출력
	for(String a : s) {
		System.out.println(a);
		// eclipse-java
		// eclipse-java-2023-03-R-win32-x86_64.zip
		// jdk-11.0.22_windows-x64_bin.exe
		// test
		// test-home
		// test_git
		// workspace-java
	}
	
	// 현재 생성된 경로가 존재하는지 확인하는 exists() 메소드
	// 존재하면 : true, 존재하지 않으면 : false
	System.out.println(fPath.exists()); // true 출력
}
}

경로를 파일 객체로 생성하여 사용하는 이유, 파일 자료형의 메소드 종류

 

package file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Ex04 {
public static void main(String[] args) throws IOException {
	Scanner sc = new Scanner(System.in);
	
	// 파일 경로는 입력받지 않고 미리 설정해두었음
	String path = "E:\\\\0.핀테크\\test";
	
	// 파일명 입력받는 부분
	System.out.print("생성할 파일명 입력 >>> ");
	String fileName = sc.nextLine();
	
	// File 자료형으로 경로를 설정 + 사용자가 입력한 파일명을 내용에 추가
	File filePath = new File(path + "\\" + fileName + ".txt");
	
	// 파일을 전송하기 위해 fileOutputStream 객체 생성
	// FileOutputStream fos = new FileOutputStream(filePath);
	// FileOutputStream 를 사용하여 파일을 생성 시 이미 해당 이름의 파일이 존재하면
	// 기존 파일을 덮어씌운다
	
	// 파일이 존재하는지 확인 후 없다면 파일 생성
	if(filePath.exists()) { 
		// 만약 같은 이름으로 파일이 존재한다면
		System.out.println("이미 존재하는 파일입니다.");
	}else {
		// 같은 이름으로 파일이 존재하지 않는다면
		FileOutputStream fos = new FileOutputStream(filePath);
		String msg;
		System.out.print("내용을 입력하세요 >>> ");
		msg = sc.nextLine();
		fos.write(msg.getBytes());
		System.out.println("저장 되었습니다.");
	}
}
}

FileOutputStream 의 경우 기존에 파일이 존재하는데 새로 생성하려고할 때 기존 파일을 파기해버린 후 새로 생성한다

그래서 파일을 생성할땐 해당 이름의 파일 또는 디렉토리가 이미 존재하는지 여부를 확인 후 진행해야 한다

 

 

 

 

 

FileInputStream

 

package file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Ex06 {
public static void main(String[] args) throws Exception {
	String path = "E:\\\\0.핀테크\\test\\test.txt";
	FileOutputStream fos = new FileOutputStream(path, true);
	// path 뒤에 true 값은 파일이 존재하면 기존 내용을 유지하면서 내용을 추가하겠다는 뜻
	// 만약 해당 파일이 없으면 파일을 새로 생성하는 것은 동일하다
	
	// true 가 들어갔으므로 기존에 test.txt 파일이 존재한다면
	// 해당 파일의 내용 뒤에 a 라는 내용을 추가하여 저장한다
	fos.write('a');
	
	fos.close(); // 열려있는 stream 을 닫아 메모리를 효율적으로 관리한다
	
	fos = new FileOutputStream(path, true);
	fos.write('c');
	fos.close();
	
	
	FileInputStream fis = new FileInputStream(path);
	int re = fis.read();
	System.out.println((char)re); // 문자를 숫자형식으로 가져와서 a 의 int 값인 97 출력되기 때문에 char 형으로 변경
	while(true) {
		re = fis.read();
		if(re<0) {
			System.out.println();
			System.out.println("내용이 없습니다 : " + re);
			break;
		}
		System.out.print((char)re);
	}
	fis.close();
}
}

파일의 내용을 읽어오는 방법

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

보조 스트림 ( BufferedOutputStream )

 

package file;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

public class Ex07 {
public static void main(String[] args) throws Exception {
	String path = "E:\\\\0.핀테크\\test\\test.txt";
	FileOutputStream fos = new FileOutputStream(path);
	
	// 보조 스트림
	// 파일을 매번 접근하지 않고 한번에 파일 작업을 모아서 한번 접근하여 모두 처리하게끔 해줌
	BufferedOutputStream bos = new BufferedOutputStream(fos);
	
	for( char ch='0' ; ch<='9' ; ch++ ) {
		Thread.sleep(1000);
		
		// fos.write(ch);
		// 파일에 1초마다 1, 2, 3, 4, 5, 6, 7, 8, 9 내용이 순차적으로 저장됨
		// 문자 하나를 입력할때마다 파일에 한번씩 접근함 -> 처리 속도가 느리다
		
		bos.write(ch); // 반복문을 돌면서 저장된 123456789 데이터를 보조 스트림에 모아놓은 상태
	}
	bos.flush(); // 보조스트림에 저장된 내용을 파일로 보내주는 flush() 메소드
	bos.write("안녕하세요".getBytes());
	bos.flush();
	
	bos.close(); // 메모리를 효율적으로 사용하기 위해 스트림을 종료
	fos.close(); // 메모리를 효율적으로 사용하기 위해 스트림을 종료
}
}

보조 스트림 ( BufferedOutputStream ) 을 사용하는 이유

- 문자를 입력받을 때 한꺼번에 처리하기 위해

 

 

 

 

 

보조 스트림 ( DataInputStream )

DataInputStream 을 사용하는 이유는 보조스트림 중 하나인 BufferedOutputStream 이나 FileOutputStream 의 경우 값을 입력할 때 byte 자료형이나 int 자료형밖에 사용할 수 없지만 DataInputStream 은 문자열이나 double 자료형 등을 형변환 하지 않고 입력할 수 있다.

 

package file;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Ex08 {
public static void main(String[] args) throws Exception {
	String path = "E:\\\\0.핀테크\\test\\test.txt";
	FileOutputStream fos = new FileOutputStream(path);
	BufferedOutputStream bos = new BufferedOutputStream(fos);
	DataOutputStream dos = new DataOutputStream(bos);
	
	// writeUTF - 문자열 한글 입력 가능
	dos.writeUTF("안녕하세요");
	dos.writeInt(123456);
	dos.writeDouble(0.12345);
	dos.close(); bos.close(); fos.close();
	
	FileInputStream fis = new FileInputStream(path);
	BufferedInputStream bis = new BufferedInputStream(fis);
	DataInputStream dis = new DataInputStream(bis);
	
	// 파일에 저장된 순서대로 값을 읽어와야 한다
	String msg = dis.readUTF();
	int num = dis.readInt();
	double dou = dis.readDouble();
	System.out.println(msg); // 안녕하세요
	System.out.println(num); // 123456
	System.out.println(dou); // 0.12345
	
}
}

보조 스트림 ( DataInputStream ) 을 사용하는 이유

728x90