반응형
01. java.base모듈 >> java.io패키지 >> File클래스
1. File(파일)이란?
- 값을 반영구적으로 저장할 수 있는 물리적인 저장단위
2. File(파일)클래스란?
- 파일(디렉토리 - 폴더)관련 정보를 저장하기 위한 클래스 파일도 저장하고,
- 엄밀히 말하면 폴더(파일의 묶음)도 저장한다!
- 유닉스기반 운영체제 : 디렉토리라고 부름
- 윈도우기반 운영체제 : 폴더라고 부름
3. 파일경로 이해하기
- 시스템에 존재하는 파일 위치를 표현하는 방법
- 📄 절대경로 : 파일경로를 최상위 디렉토리를 기준으로 파일 위치를 표현하는 방법
- 📄 상대경로 : 현재 실행 프로그램의 작업 디렉토리를 기준으로 파일 위치를 표현하는 방법
- 이클립스의 작업 디렉토리 : 현재 프로젝트 폴더(기본워크디렉토리)를 작업 디렉토리로 처리
//현재 프로젝트 폴더 밑에 있는 data파일 : java-3 >> data11111파일
File fileOne = new File("data11111");
4. 운영체제마다 다른 경로표현
📄Windows
- 폴더(드라이브) 파일을 구분하기 위해 역슬래시 \\ 기호 사용
- 자자바가 제공해주는 경로표현 슬래쉬 / 이용가능
// C드라이브 >> data폴더 생성하는 방법
//File fileOne = new File("c:\\data");
File fileOne = new File("c:/data"); //자바가 제공해주는 경로표현(운영체제에 상관없음)
fileOne.mkdir(); //실제로 폴더가 생성됨
// C드라이브 >> data폴더 >> xyz.txt파일 생성하는 방법
//File fileTwo = new File("c:\\data\\xyz.txt");
File fileTwo = new File("c:/data/xyz.txt"); //자바가 제공해주는 경로표현
fileTwo.createNewFile(); //실제로 파일이 생성됨 - IOException 발생되므로 예외처리필수
📄Mac
- Windows 운영체제를 제외한 나머지 운영체제
- 유닉스 커널을 이용하므로 디렉토리 장치 구조가 다름
- 폴더(드라이브)와 파일을 구분하기 위해 슬래쉬 / 기호 사용
// /Users/jaeheela/Desktop >> data폴더 생성하는 방법
File fileOne = new File("/Users/jaeheela/Desktop/data");
fileOne.mkdir(); //실제로 폴더가 생성됨
// /Users/jaeheela/Desktop >> data폴더 >> xyz.txt파일 생성하는 방법
File fileTwo = new File("/Users/jaeheela/Desktop/data/xyz.txt");
fileTwo.createNewFile(); //실제로 파일이 생성됨 - IOException 발생되므로 예외처리필수
🔥 주의사항) 자바에서는 문자 \ 출력 시 회피문자로 인식한다
- 자바에서는 \기호하나만 사용하면 회피문자(Escape Character)를 표현하는 용도로 사용하므로, \기호를 문자로 사용하기 위해서는 \\ 형태의 회피문자(Escape Character)로 표현해야함
File fileOne = new File("c:\\data"); // \\이용
System.out.println("c:\\data 폴더가 이미 존재합니다."); // \\이용
//c:\data 폴더가 이미 존재합니다.
02. 파일클래스로 파일객체 생성해 사용
FileApp
package xyz.itwill.io;
import java.io.File;
import java.io.IOException;
//File 클래스 : 파일(디렉토리 - 폴더) 관련 정보를 저장하기 위한 클래스
public class FileApp {
public static void main(String[] args) throws IOException {
//File 클래스는 무조건 매개변수가 있는 생성자만 사용 가능
//📄 파일객체 생성법
//1. 절대경로표현방법
// => pathname : 경로 안에 꼭 파일이 있지 않아도 된다!
new File(String pathname)
//시스템(운영체제-OS)의 파일 경로를 전달받아 File객체를 생성하는 생성자 (시스템마다 파일 경로의 표현방법 다름)
//ex. Windows
File fileOne = new File("c:\\data");
File fileTwo = new File("c:/data/xyz.txt");
//ex. Mac
File fileOne = new File("/Users/jaeheela/Desktop/data");
File fileTwo = new File("/Users/jaeheela/Desktop/data/xyz.txt");
//📄 파일객체 생성법
//2. 경로 + 파일명
// => parent : 파일이 저장된 디렉토리
// => child : 파일이름
new File(String parent, String child)
//시스템(운영체제-OS)의 파일 경로를 부모(디렉토리)와 자식(파일)으로 구분하여 전달받아 File객체를 생성하는 생성자
// => (부모) 앞: 디렉토리경로
// => (자식) 뒤: 디렉토리안에있는파일명
//ex. Windows
//File fileThree = new File("c:/data/xyz.txt");
File fileThree = new File("c:/data" ,"xyz.txt");
//ex. Mac
//File fileThree = new File("/Users/jaeheela/Desktop/data/xyz.txt");
File fileThree = new File("/Users/jaeheela/Desktop/data","xyz.txt");
//📄 파일객체 생성법
//3. 상대경로표현방법
new File(String pathname)
// => 파일경로를 상대경로 표현방법으로 전달하여 File 객체 생성
// => 현재 프로그램의 작업디렉토리는 프로젝트 폴더로 설정됨
// => 상대경로 표현방법: .. 기호를 사용해 상위 디렉토리(폴더)를 표현하며, [파일]형식 으로 폴더에 존재하는 파일 또는 하위 폴더(디렉토리)를 표현
//ex. Windows
File fileFour = new File("src");
System.out.println(fileFour.getAbsolutePath());
//ex. Mac
File fileFour = new File("src");
System.out.println("파일경로 = "+ fileFour.getAbsolutePath());
//파일경로 = /Users/jaeheela/eclipse-workspace/java-3/src
//🧡파일객체의 메소드 사용하기
//1.
//🤍File.exists( ) - 실제 파일유무 / 실제 디렉토리유무
// => File객체에 저장된 파일경로에 실제파일(디렉토리)이 없는 경우 [false]를 반환하고, 있는 경우 [true]를 반환하는 메소드
// 🤍File.mkdir( ) - 디렉토리(폴더) 생성
// => File객체에 저장된 파일경로를 이용하여 실제파일(디렉토리)를 생성하는 메소드
//Mac
File fileOne = new File("/Users/jaeheela/Desktop/data");
if(fileOne.exists()) {
System.out.println("/Users/jaeheela/Desktop/data 폴더가 이미 존재합니다.");
}else {
fileOne.mkdir();
System.out.println("/Users/jaeheela/Desktop/data 폴더를 생성하였습니다.");
}
// /Users/jaeheela/Desktop/data 폴더를 생성 하였습니다.
// => 한번 더 실행하면?
// /Users/jaeheela/Desktop/data 폴더가 이미 존재합니다.
//Windows
File fileOne=new File("c:\\data");
if(fileOne.exists()) {
System.out.println("c:\\data 폴더가 이미 존재합니다.");
} else {
fileOne.mkdir();
System.out.println("c:\\data 폴더를 생성 하였습니다.");
}
// c:\\data 폴더를 생성 하였습니다.
// => 한번 더 실행하면?
// c:\\data 폴더가 이미 존재합니다.
//2.
//🤍File.createNewFile( ) - 파일 생성File 객체에 저장된 파일경로를 이용하여 파일을 생성하는 메소드
// => IOException 발생되므로 예외처리해야만 에러 미발생
//Mac
File fileOne = new File("/Users/jaeheela/Desktop/data");
fileOne.mkdir();
File fileTwo = new File("/Users/jaeheela/Desktop/data/xyz.txt");
fileTwo.createNewFile();
//Windows
File fileOne=new File("c:\\data");
fileOne.mkdir();
File fileTwo = new File("c:/data/xyz.txt");
fileTwo.createNewFile();
//3.
//🤍File.delete( ) - 파일삭제
// => File 객체에 저장된 파일경로의 파일을 삭제하는 메소드
// => 웹프로그램 만들 때 : 업로드, 다운로드 파일처리 시 - 파일을 저장한 정보를 삭제할 때, 파일도 같이 삭제할 예정!
//Mac
File fileThree = new File("/Users/jaeheela/Desktop/data" ,"xyz.txt");
if(fileThree.exists()) {
fileThree.delete();
System.out.println("/Users/jaeheela/Desktop/data/xyz.txt파일을 삭제 하였습니다.");
} else {
System.out.println("/Users/jaeheela/Desktop/data/xyz.txt파일이 존재하지 않습니다.");
}
// /Users/jaeheela/Desktop/data/xyz.txt파일을 삭제 하였습니다.
//Windows
File fileThree = new File("c:/data" ,"xyz.txt");
if(fileThree.exists()) {
fileThree.delete();
System.out.println("c:\\data\\xyz.txt파일을 삭제 하였습니다.");
} else {
System.out.println("c:\\data\\xyz.txt파일이 존재하지 않습니다.");
}
//c:\data\xyz.txt파일을 삭제 하였습니다.
//4.
//🤍File.toString( ) - 상대경로
// => File 객체에 저장된 파일경로를 문자열로 반환하는 메소드
//Mac & Windows
File fileFour=new File("xyz");
if(fileFour.exists()) {
//System.out.println("파일 경로 = "+fileFour.toString());
System.out.println("파일 경로 = "+fileFour);
} else {
System.out.println("작업디렉토리에 xyz 폴더가 없습니다.");
}
//파일 경로 = xyz
//5.
//🤍File.getAbsolutePath( ) - 절대경로
// => File 객체에 저장된 파일경로를 절대경로의 문자열로 반환하는 메소드
//Mac & Windows
File fileFour=new File("xyz");
if(fileFour.exists()) {
System.out.println("파일 경로 = "+fileFour.getAbsolutePath());
} else {
System.out.println("작업디렉토리에 xyz 폴더가 없습니다.");
}
//파일 경로 = /Users/jaeheela/eclipse-workspace/java-3/xyz
//6.
//🤍File.isDirectory( ) - 파일경로가 디렉토리인지아닌지
// => File 객체에 저장된 파일경로가 디렉토리인 경우 [true]를 반환하는 메소드
//🤍File.isFile( ) - 파일경로가 파일인지아닌지
// => File 객체에 저장된 파일경로가 파일인 경우 [true]를 반환하는 메소드
//🤍File.listFiles( ) - 자식들을 배열로
// => File 객체에 저장된 파일경로의 자식 파일(디렉토리) 목록을 File 객체 배열로 반환하는 메소드
//Mac
File fileFive = new File("/Users/jaeheela/Desktop/");
if(fileFive.isDirectory()) { //만약 변수에 저장된 파일이 디렉토리라면
//파일경로 안에 든 자식들을 배열로 만들어주세요
File[] subFiles = fileFive.listFiles();
System.out.println(fileFive + "폴더의 자식 목록 >> "); //폴더자식의 목록을 출력해주세요
for(File file:subFiles) {
if(file.isFile()){ //만약 자식이 파일이라면
System.out.println("파일 = "+file);
} else { //민약 자식이 파일이 아니라면
System.out.println("폴더 = "+file);
}
}
}
///Users/jaeheela/Desktop폴더의 자식 목록 >>
//파일 = /Users/jaeheela/Desktop/.DS_Store
//파일 = /Users/jaeheela/Desktop/.localized
//폴더 = /Users/jaeheela/Desktop/PROJECT
//폴더 = /Users/jaeheela/Desktop/data
//Windows
File fileFive = new File("c:/");
if(fileFive.isDirectory()) {
File[] subFiles = fileFive.listFiles();
System.out.println(fileFive + "폴더의 자식 목록 >> ");
for(File file:subFiles) {
if(file.isFile()){
System.out.println("파일 = "+file);
} else {
System.out.println("폴더 = "+file);
}
}
}
//c:\\폴더의 자식 목록 >>
//폴더 = c:\\$Recycle.Bin
//폴더 = c:\\$WinREAgent
//폴더 = c:\\data
//폴더 = c:\\Documents and Settings
//파일 = c:\\DumpStack.log.tmp
//폴더 = c:\\eclipse
//파일 = c:\\hiberfil.sys
//폴더 = c:\\java
//파일 = c:\\pagefile.sys
//폴더 = c:\\PerfLogs
//폴더 = c:\\Program Files
//폴더 = c:\\Program Files (x86)
//폴더 = c:\\ProgramData
//폴더 = c:\\Recovery
//파일 = c:\\swapfile.sys
//폴더 = c:\\System Volume Information
//폴더 = c:\\Users
//폴더 = c:\\Windows
}
}
03. 1Byte → 파일에 전달 → 저장 (SAVE) → 출력(LOAD)
1) FileByteSaveApp
package xyz.itwill.io;
import java.io.FileOutputStream;
import java.io.IOException;
//키보드로 원시값을 "원시데이타" 로 제공받아 "파일에 전달하여 저장"하는 프로그램
//입력스트림 : 🌀원시데이타 기반 스트림
// => System.in (Java 프로그램 개발을 위한 기본적인 키보드입력스트림) - 키보드에 입력된 값을 원시데이타로 프로그램에 전달 (입력)
// => 원시데이타로 A 입력받기 가능
// => 원시데이타로 홍 입력받기 불가능 -> 문자데이타 이용하자
// => 예외처리
//출력스트림 : 🌀원시데이타 기반 스트림
// => FileOutputStream (키보드에 전달받은 값을 원시데이타로 파일에 저장 (출력)
// => 예외전달 (예외처리 필요없음!! - 파일이 없으면 파일자동생성해줌)
// => 파일스트림제거
//=> EOF(End Of File) : 입력종료 - window - Ctrl+Z) 신호를 입력하면 프로그램 종료 /mac - Ctrl+D
public class FileByteSaveApp {
public static void main(String[] args) throws IOException {
System.out.println("[메세지]키보드를 눌러 값을 입력해 주세요.[프로그램 종료 : Ctrl+Z]");
//1.🔥🔥🔥
//📄파일출력스트림 객체 생성
// => FileOutputStream : 파일에 원시데이터를 전달하기 위한 출력스트림을 생성하기 위한 클래스
// => FileOutputStream(String pathname): 파일경로를 전달받아 파일 출력스트림을 생성하는 생성자
// => FileOutputStream(String pathname, boolean append) : 파일경로와 추가 유무에 대한 논리값을 전달받아 파일 출력스트림을 생성하는 생성자
// => 파일출력스트림 객체 생성 시 예외발생
// => 전달받은 파일경로의 파일이 없는 경우 FileNotFoundException(일반예외) 발생
// => 일반예외라 예외처리해야하지만, 예외처리 하지 않고 예외를 전달할 경우 파일을 자동으로 생성하여 출력스트림으로 반환해줌
//⭐⭐주의⭐⭐ : 파일을 자동으로 생성해주는 것이지, 디렉토리경로를 생성해주는 것은 아니므로 존재하는 디렉토리 안에 파일 생성해야함
//FileOutputStream out = new FileOutputStream("/Users/jaeheela/Desktop/dateee/byte.txt");
//=>FileNotFoundException(일반예외) 발생
//📄파일출력스트림 객체생성 첫번째 방법
// => 전달받은 파일경로에 파일이 있는 경우 기존 파일내용 대신 새로운 값이 파일에 저장
// => 파일 덮어씌우기: false(기본값)
//FileOutputStream out = new FileOutputStream("/Users/jaeheela/Desktop/data/byte.txt");
//FileOutputStream out = new FileOutputStream("/Users/jaeheela/Desktop/data/byte.txt", false);
//📄파일출력스트림 객체생성 두번째 방법
// => 전달받은 파일경로에 파일이 있는 경우 기존 파일내용에 이어쓰기
// => 파일 이어쓰기: true
FileOutputStream out = new FileOutputStream("/Users/jaeheela/Desktop/data/byte.txt", true);
//2.
//키보드 입력값을 저장하기 위한 변수
int readByte;
//3.
//Ctrl+Z/D 입력 전까지 무한반복 저장가능
while(true) { //키보드입력스트림으로 원시데이타 읽어 변수에 저장(1Byte씩)
readByte = System.in.read(); // 🪲IOException발생 - 예외전달(예외발생가능성낮으므로)
if(readByte == -1) break; //입력종료신호(Ctrl+Z/D : EOF)가 전달된 경우 반복문 종료
out.write(readByte); //파일 출력스트림으로 원시데이타를 전달하여 저장(1Byte씩) - SAVE
}
//4.
//파일 출력스트림 제거
// => FileOutputstream.close() : 파일 출력스트림을 제거하는 메소드
// => 파일에는 입출력스트림을 딱 1개씩만 생성가능, 그러므로 파일처리를 위한 입출력스트림은 사용 후 반드시 제거
out.close();
//5.
System.out.println("/Users/jaeheela/Desktop/data/byte.txt 파일에 키보드 입력값이 저장 되었습니다.");
}
}
2) FileByteLoadApp
package xyz.itwill.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
//파일에 저장된 값을 "원시데이타"로 읽어와 모니터에 전달하여 출력하는 프로그램
//입력스트림 : 🌀원시데이타 기반 스트림
// => FileInputStream (파일로 값 입력받아 저장) - 파일에 저장된 값을 원시데이타로 프로그램에 전달 (입력)
// => 무조건예외처리 (try-catch-finally문)
// => 파일스트림제거
//출력스트림 : 🌀원시데이타 기반 스트림
// => System.out (Java 프로그램 개발을 위한 기본적인 키보드출력스트림) - 전달받은 값을 원시데이타로 모니터에 저장 (출력)
// => 예외전달
public class FileByteLoadApp {
public static void main(String[] args) throws IOException {
//1.🔥🔥🔥
//📄파일입력스트림 객체 생성
// => FileInputStream : 파일에 저장된 값을 원시데이터로 읽기 위한 입력스트림을 생성하기 위한 클래스
// => FileInputStream(String name) : 파일경로를 전달받아 파일 입력스트림을 생성하는 생성자
// => 파일입력스트림 객체 생성 시 예외발생
// => 전달받은 파일 경로에 파일이 없는 경우 FileNotFoundException(일반예외) 발생
// => 일반예외이며, 파일이 없는 경우 파일 입력 스트림을 생성하지 못하므로 반드시 예외처리
//1-1.
//⭐ try문 안에 FileInputStream변수 만들면 블록문 종료 시 사용못하므로 반드시 밖으로 꺼내서 null 선언하기
FileInputStream in = null;
//예외처리(try문)
try {
//1-2.
in = new FileInputStream("/Users/jaeheela/Desktop/data/byte.txt");
//2.
System.out.println("[메세지]/Users/jaeheela/Desktop/data/byte.txt파일에 저장된 내용입니다.");
//3.
int readByte; //파일값을 저장하기 위한 변수
//4.
while(true) { //파일의 마지막 출력 전까지 무한반복 출력가능
//4-1.
//파일입력스트림을 이용해 파일값을 원시데이타로 반환받아 저장 - LOAD (읽어들이다)
readByte = in.read(); //IOException - 예외전달로 처리(파일을 중간에 삭제하지 않을 것이므로)
//4-2.
//모든 파일의 마지막에는 우리 눈에 보이지 않지만 무조건 EOF 존재 - 일종의 상수임
if(readByte == -1) break;
//4-3.
//모니터출력스트림에 원시데이타를 전달하여 출력
//=>System.out.print()는 내부적으로 숫자로 출력해주기 때문에 반드시 System.out.write() 사용하기
//System.out.print(readByte);
//23614913623513314910104966121116101236148169322361571892361501803223714014023615718823615114432236160128236158165236164145331023614913623513314910
System.out.write(readByte);
//안녕! 1Byte씩 읽어 파일에 저장중!
}
//예외처리 (catch문)
} catch (FileNotFoundException e) {
//5.
System.out.println("[에러] 대상 파일을 찾을 수 없습니다."); // 파일이 없어도 만들어주지 않으므로
} finally {
//6.⭐
//파일 입력스트림 제거
//FileInputStream.close() : 파일 입력스트림을 제거하는 메소드
// => 예외 발생과 상관없이 무조건 파일스트림객체는 제거해야하므로 try 블럭이 아닌 finally 블럭에서 처리하는 것을 권장
// => if 구문을 사용해 참조변수에 NULL이 저장되어 있지 않을 경우에만 메소드 호출
// => 만약 위에서 FileNotFoundException가 발생하여 in 에 계속 null이 저장되어있다면, in.close()할 경우
// => NullPointException이 발생하므로, if(in != null)일 때만 in.close()하게 만들기
if(in != null) in.close();
}
}
}
04. 2Byte → 파일에 전달 → 저장 (SAVE) → 출력(LOAD)
1) FileCharSaveApp
package xyz.itwill.io;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
//키보드로 원시값을 "문자데이타"로 제공받아 "파일에 전달하여 저장"하는 프로그램
//입력스트림 : 🌀문자데이타 기반 스트림
// => InputStreamReader - 키보드에 입력된 값을 문자데이타로 프로그램에 전달 (입력)
//출력스트림 : 🌀문자데이타 기반 스트림
// => FileWriter - 전달받은 값을 문자데이타로 파일에 저장 (출력)
// => 예외 전달 (예외처리 필요없음!! - 파일이 없으면 파일자동생성해줌)
// => 파일스트림제거
//=> EOF(End Of File) : 입력종료 - window - Ctrl+Z) 신호를 입력하면 프로그램 종료 /mac - Ctrl+D
public class FileCharSaveApp {
public static void main(String[] args) throws IOException {
//1.🔥🔥🔥
//키보드입력스트림(Reader객체) 생성 - 2Byte
// => 키보드 입력값을 문자데이타 형태로 읽을 수 있게 됨
// => 실제 키보드(System.in)에서 1Byte씩 데이타를 보내면, InputStreamReader가 2Byte씩 묶은후 인코딩(가공처리)후 프로그램에 전달(입력)
InputStreamReader in = new InputStreamReader(System.in);
//2.🔥🔥🔥
//📄파일출력스트림(Writer객체) 생성 - 2Byte
// => FileWriter : 파일에 문자데이타를 전달하기 위한 출력스트림을 생성하기 위한 클래스
// => FileWriter(String pathname : 파일경로를 전달받아 파일 출력스트림을 생성하는 생성자
// => FileWriter(String pathname, boolean append) : 파일경로와 추가 유무에 대한 논리값을 전달받아 파일 출력스트림을 생성하는 생성자
// => 파일출력스트림(Writer객체) 객체 생성 시 예외발생
// => 전달받은 파일경로의 파일이 없는 경우 IOException(일반예외) 발생
// => 일반예외라 예외처리해야하지만, 예외처리 하지 않고 예외를 전달할 경우 파일을 자동으로 생성하여 출력스트림으로 반환해줌
//📄파일출력스트림(Writer객체) 객체생성 첫번째 방법
// => 전달받은 파일경로에 파일이 있는 경우 기존 파일내용 대신 새로운 값이 파일에 저장
// => 파일 덮어씌우기: false(기본값)
//FileWriter out = new FileWriter("c:/data/char.txt");
//📄파일출력스트림(Writer객체) 객체생성 두번째 방법
// => 전달받은 파일경로에 파일이 있는 경우 기존 파일내용에 이어쓰기
// = >파일 이어쓰기: true
FileWriter out = new FileWriter("/Users/jaeheela/Desktop/data/char.txt", true);
//3.
//키보드 입력값을 저장하기 위한 변수
int readByte;
//4.
//Ctrl+Z/D 입력 전까지 무한반복 저장가능
while(true) {
//4-1.
//키보드 입력값을 문자데이타로 읽어 변수에 저장(2Byte씩)
readByte = in.read(); // 🪲IOException발생 - 예외전달(예외발생가능성낮으므로)
//4-2.
//입력종료신호(Ctrl+Z/D : EOF)가 전달된 경우 반복문 종료
if(readByte == -1) break;
//4-3.
//save
//파일 출력스트림으로 문자데이타를 전달하여 저장(2Byte씩)
out.write(readByte);
}
//5.
//파일 출력스트림 제거
//FileWriter.close() : 파일 출력스트림을 제거하는 메소드
out.close();
//6.
System.out.println("/Users/jaeheela/Desktop/data/char.txt 파일에 키보드 입력값이 저장 되었습니다.");
}
}
2) FileCharLoadApp
package xyz.itwill.io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
//파일에 저장된 값을 "문자데이타"로 읽어와 모니터에 전달하여 출력하는 프로그램
//입력스트림 : 🌀문자데이타 기반 스트림
// => FileReader - 파일에 저장된 값을 문자데이타로 프로그램에 전달 (입력)
// => 무조건예외처리 (try-catch-finally문)
// => 파일스트림제거
//출력스트림 : 🌀문자데이타 기반 스트림
// => OutputStreamWriter 전달받은 값을 문자데이타로 모니터에 저장 (출력)
// => 예외전달 - IOException
public class FileCharLoadApp {
public static void main(String[] args) throws IOException {
//1.🔥🔥🔥
//📄파일입력스트림(Reader객체) 객체 생성
// => FileReader : 파일에 저장된 값을 문자데이타로 읽기 위한 입력스트림을 생성하기 위한 클래스
// => FileReader(String filename) : 파일경로를 전달받아 파일 입력스트림을 생성하는 생성자
// => 🪲파일입력스트림 객체 생성 시 예외발생
// => 전달받은 파일경로에 파일이 없는 경우 FileNotFoundException 발생(일반예외) 발생
// => 일반예외이며, 파일이 없는 경우 파일 입력스트림을 생성하지 못하므로 반드시 예외처리
//1-1.
FileReader in=null;
//예외처리 (try문)
try {
//1-2.
in=new FileReader("c:/data/char.txt");
//2.🔥🔥🔥
//모니터출력스트림(Writer객체) 객체 생성
//OutputStreamWriter : 문자데이타를 전달하기 위한 모니터 출력스트림으로 확장
OutputStreamWriter out=new OutputStreamWriter(System.out);
//3.
System.out.println("[메세지]c:\\\\data\\\\char.txt 파일에 저장된 내용입니다.");
//4.
//파일값을 저장하기 위한 변수
int readByte;
//5.
//파일의 마지막 출력 전까지 무한반복 출력가능
while(true) {
//5-1.
//load
//파일 입력스트림을 이용해 파일값을 문자데이타로 반환받아 저장
readByte=in.read();
//5-2.
//파일의 모든 값을 얻어온 경우 반복문 종료
//모든 파일의 마지막에는 우리 눈에 보이지 않지만 무조건 EOF 존재 - 일종의 상수임
if(readByte==-1) break;
//5-3.
//모니터 출력스트림에 문자데이타를 전달하여 출력
out.write(readByte);
//5-4.
//문자데이타 출력버퍼에 모으지 말고, 바로바로 출려해주세요~
out.flush();
}
//예외처리 (catch문)
} catch (FileNotFoundException e) {
//6.
System.out.println("[에러]대상 파일을 찾을 수 없습니다.");
} finally {
//7.
//파일 입력스트림 제거
//FileReader.close() : 파일 입력스트림을 제거하는 메소드
if(in!=null) in.close();
}
}
}
05. 🔥보조스트림 클래스🔥
- 스트림을 전달받아 기능을 확장하기 위한 클래스
- 단독사용불가능
- 전달받아 확장시키는용
- BufferedInputStream , BufferedOutputStream
- BufferedReader , BufferedWriter
- DataOutputStream , DataInputStream
- ObjectOutputStream , ObjectInputStream
06. 원본파일 → 1/2Byte → 타겟 파일에 저장
1) FileCopyByteApp
package xyz.itwill.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//원본파일에 저장된 값을 "원시데이타"로 읽어와 "타겟파일에 전달하여 저장"하는 프로그램 - 파일복사
// => 모든 형식의 원본파일을 복사하여 타겟파일로 전달하여 저장 가능
//🌀입력스트림
// => FileInputStream , BufferedInputStream(확장: 통로넓어짐)
// => 파일에 저장된 값을 원시데이타로 읽어들임 (1Byte씩)
//🌀출력스트림
// => FileOutputStream , BufferedOutputStream(확장: 통로넓어짐)
// => 읽어들인 값을 새로운 파일에 저장 (1Byte씩)
// => 🖨 파일을 원시데이타 형태로 복사
// => 그대로 읽어서 가공없이 있는 그대로 복사하기
// => 원본파일에 저장된 값에 대한 변형이 절대 일어나지 않음
// => 즉, 모든 형식의 원본파일은 복사하여 타겟파일로 저장 가능!!!
// => ex) 실행파일, 이미지파일, 그림파일, 동영상파일, 소리파일... 모두 다!!
public class FileCopyByteApp {
public static void main(String[] args) throws IOException {
//🔥BufferedInputStream & BufferedOutputStream
// => 스트림의 폭을 넓혀 입출력속도를 빠르게해줌
// => ex) 1차선도로 -> 16차선도로
//🔥BufferedInputStream(보조스트림클래스) : InputStream 객체를 전달받아 대량의 원시데이타(문자열)를 읽기 위한 입력스트림을 생성하기 위한 클래스
//FileInputStream in = null; //확장시키자
BufferedInputStream in=null;
//🔥BufferedOutputStream(보조스트림클래스): OutputStream 객체를 전달받아 대량의 원시데이타(문자열)를 전달하기 위한 출력스트림을 생성하기 위한 클래스
//FileOutputStream out = null; //확장시키자
BufferedOutputStream out=null;
try {
//1.
//입력객체 : 재실행하면 덮어씌우기(기본값:false)
in=new BufferedInputStream(new FileInputStream("c:/data/ban.exe"));
//2.
//출력객체
out=new BufferedOutputStream(new FileOutputStream("c:/data/ban_byte.exe"));
//3.
//복사중~
//1Byte 입력 -> 1Byte 출력 -> 1Byte 입력 -> 1Byte 출력..
int readByte;
while(true) {
readByte=in.read();
if(readByte==-1) break; //읽어들일 데이터가 없을 때까지
out.write(readByte);
}
System.out.println("[메세지]파일을 성공적으로 복사 하였습니다.");
} catch (FileNotFoundException e) {
System.out.println("[에러]원본파일을 찾을 수 없습니다.");
} finally {
in.close();
out.close();
}
}
}
2) FileCopyCharApp
package xyz.itwill.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//원본파일에 저장된 값을 "문자데이타"로 읽어와 "타겟파일에 전달하여 저장"하는 프로그램 - 파일복사
// => 텍스트 형식의 원본파일만을 복사하여 타겟파일로 전달하여 저장 가능
// => 텍스트 형식의 파일을 제외한 원본파일(이진파일 - Binary File)은 값에 대한 가공이 발생되어 타겟파일이 변형되어 저장
//🌀입력스트림
// => FileReader , BufferedReader(확장: 통로넓어짐 - 다량의 문제데이타로 입력함)
// => 파일에 저장된 값을 문자데이타로 읽어들임 (가공된 2Byte씩)
//🌀출력스트림
// => FileWriter , BufferedWriter(확장: 통로넓어짐 - 다량의 문제데이타로 출력함)
// => 읽어들인 값을 새로운 파일에 저장 (가공된 2Byte씩)
// => 🖨 파일을 문자데이타 형태로 복사
// => 오직 텍스트 형식의 원본파일만을 복사하여 타겟파일로 전달하여 저장 가능
// => 텍스트 형식이 아닌 파일들 : binary 파일들(이진파일)
// => 텍스트 형식의 파일을 제외한 원본파일(이진파일 - Binary File)은 값에 대한 가공이 발생되어 타겟파일이 변형되어 저장
public class FileCopyCharApp {
public static void main(String[] args) throws IOException {
//🔥BufferedReader & BufferedWriter
// => 스트림의 폭을 넓혀 입출력속도를 빠르게해줌
// => ex) 1차선도로 -> 16차선도로
//🔥BufferedReader(보조스트림클래스) : Reader 객체를 전달받아 대량의 문자데이타를 읽기 위한 입력스트림을 생성하기 위한 클래스
BufferedReader in = null;
//🔥BufferedWriter(보조스트림클래스): Writer 객체를 전달받아 대량의 문자데이타를 읽기 위한 출력스트림을 생성하기 위한 클래스
BufferedWriter out = null;
try {
//1.
//입력객체 : 재실행하면 덮어씌우기(기본값:false)
in = new BufferedReader(new FileReader("C:/data/String메소드.PNG"));
//2.
//출력객체
out = new BufferedWriter(new FileWriter("C:/data/String메소드_char.PNG"));
//3.
//복사중~
//2Byte 입력 -> 2Byte 출력 -> 2Byte 입력 -> 2Byte 출력..
int readByte;
while(true){
readByte = in.read();
if(readByte == -1) break; //읽어들일 데이터가 없을 때까지
out.write(readByte);
}
System.out.println("[메세지] 파일을 성공적으로 복사 하였습니다.");
} catch (FileNotFoundException e) {
System.out.println("[에러] 원본파일을 찾을 수 없습니다.");
} finally {
in.close();
out.close();
}
}
}
반응형
'java > java.io' 카테고리의 다른 글
[java.io] 5. ✏️텍스트 파일 편집기 프로그램 - 메모장 (0) | 2024.07.01 |
---|---|
[java.io] 4. 객체 직렬화(Object Serialization) 클래스 (1) | 2024.07.01 |
[java.io] 3. Data보조스트림 | Object보조스트림 (1) | 2024.06.30 |
[java.io] 1. 입출력스트림(원시데이타기반 | 문자데이타기반) (0) | 2024.06.30 |