파일 입, 출력 ( 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
'국비지원_핀테크' 카테고리의 다른 글
15일차_ [java] 직렬화 ( Serializable ) (0) | 2024.02.23 |
---|---|
15일차_ [DB] DB 다운로드 (0) | 2024.02.23 |
15일차_ [java] 롬복 ( lombok ) (0) | 2024.02.23 |
14일차_ [java] 회원 관리 프로젝트 ( DAO, DTO, Interface 활용 ) (0) | 2024.02.22 |
14일차_ [java] 컬렉션 ( collection ), 객체 리스트 (0) | 2024.02.22 |