🔷 Java에서는 다양한 방식으로 파일에 데이터를 읽고 쓸 수 있다.
file : java.io.*에서 제공하는 클래스들은 try~catch / throws를 해줘야 함.
Input/OutputStream (IOStream) : 단방향으로 데이터가 흘러가는 형태
🔷 java는 입력스트림, 출력스트림을 통해 데이터를 입출력함.
다양한 장치에 독립적으로 운영, 일관성있게 입출력을 유지하기 위해 입출력 스트림을 통해 일관성, 독립성 제공
🔷 두가지 형태의 스트림
- 바이트 형태의 스트림 : 기본 (문자, 그림, 멀티미디어)
- 문자 형태의 스트림 : 문자만 입출력할 때 사용
1. 바이트 스트림
- 입력(InputStream) : FileInputStream, BufferedInputStream, DataInputStream....
- 출력(OutputStream) : FileOutputStream, BufferedOutputStream, DataOutputStream...
2. 문자 스트림
- 입력(Reader) : FileReader, BufferedReader, InputStreamReader...
- 출력(Writer) : FileWriter, BufferedWriter, PrintWriter...
🔷 기반스트림 / 보조스트림
기반스트림 : 직접 자료를 읽고 쓰는 기능이 있는 스트림
- FileInputStream, FileOutputStream, FileReader, FileWriter
보조스트림 : 직접 읽고 쓰는 기능은 없지만, 추가적인 기능을 더해주기 위한 스트림
- BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
🔷 예제(1)
//표준 출력(모니터=콘솔) 스트림
System.out.println("print");
//표준 입력(키보드) 스트림
try {
//바이트 단위 스트림
int b = System.in.read();
System.out.println("Read() > " +(char)b);
} catch (IOException e) {
e.printStackTrace();
}
//표준 에러 출력 스트림
System.err.println("error");
결과

🔷 예제(2)
package day10;
import java.io.IOException;
public class File02 {
public static void main(String[] args) {
// 사용자에게 알파벳 입력을 요청
System.out.println("알파벳 입력 > ");
try {
int in; // 입력받은 값을 저장할 변수
// 사용자가 입력할 때까지 반복
while((in = System.in.read()) != '\n') { // Enter가 아닌 경우에만 출력
System.out.print((char)in); // 입력받은 값을 문자로 변환하여 출력
}
} catch (IOException e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
}
}
}
결과
알파벳 입력 >
abcd
abcd
🔷 예제(3) : FileWriter, PrintWriter, FileOutputStream을 사용하여 파일에 데이터 기록
package day10;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class File03 {
public static void main(String[] args) throws IOException {
// FileWriter를 통해 파일 쓰기
// 다시 실행하면 같은 이름의 파일로 덮어쓰기
FileWriter fw = new FileWriter("writer.txt");
for(int i=1; i<=10; i++) {
// \r=캐리지리턴 \n = enter
String data = i + " test \r\n";
fw.write(data); //파일에 기록
fw.write("myproject I/O Test \r\n");
}
fw.close();
//기존파일에 데이터를 쓰려고 할 때 : 추가모드
FileWriter fw2 = new FileWriter("writer.txt", true);
for(int i=11; i<=20; i++) {
// \r=캐리지리턴 \n = enter
String data = i + " test \r\n";
fw2.write(data); //파일에 기록
fw2.write("myproject I/O Test \r\n");
}
fw2.close();
//PrintWriter
PrintWriter pw = new PrintWriter("writer2.txt");
for(int i=1; i<=10; i++) {
String data = i+ " PrintWriter Test. \r\n";
pw.write(data);
}
pw.close();
//파일에 내용을 추가하라면...
PrintWriter pw2 = new PrintWriter(new FileWriter("writer2.txt", true));
for(int i=11; i<=20; i++) {
String data = i+ " append mode. \r\n";
pw2.write(data);
}
pw2.close();
//바이트기반 스트링
//fileOutputStream을 이용한 파일 쓰기
FileOutputStream output = new FileOutputStream("out.txt");
for(int i=1;i<=10;i++) {
String data = i+". 한글로 써보기 Test \r\n";
//바이트 기반 스트림이기 때문에 바이트 단위로 쓰기
output.write(data.getBytes());
}
output.close();
}
}
결과

🔷 파일 읽기
BufferedReader : 문자 보조 스트림
보조스트림은 직접 읽고 쓰는 기능이 없기 때문에 FileReader와 같은 기반 스트림을 매개변수로 포함해야 함
BufferedReader의 readLine() 메서드는 라인 단위로 읽기 가능. 더이상 읽을 라인이 없다면 null을 리턴.
🔷 예제(4)
package day10;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class File04 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("writer2.txt"));
while(true) {
String line = br.readLine(); //한 라인으로 읽어오기
if(line == null) {
break;
}
System.out.println(line);
}
br.close();
}
}
결과
1 PrintWriter Test.
2 PrintWriter Test.
3 PrintWriter Test.
4 PrintWriter Test.
5 PrintWriter Test.
6 PrintWriter Test.
7 PrintWriter Test.
8 PrintWriter Test.
9 PrintWriter Test.
10 PrintWriter Test.
11 append mode.
12 append mode.
13 append mode.
14 append mode.
15 append mode.
16 append mode.
17 append mode.
18 append mode.
19 append mode.
20 append mode.
🔷 예제(5) : test.txt 파일을 읽어들여 학생의 명단과 점수를 map에 저장.
합계와 평균 계산 및 출력, 80점 이상인 학생 명단 출력
test파일은 다음과 같다.
test.txt
홍길동 78
강감찬 89
김순이 45
박영이 69
이순신 96
박철수 85
김승찬 87
읽어 들이는 파일은 모두 String
계산을 위해서는 int로 변환이 필요 => Integer.parseInt();
package day10;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class File05 {
public static void main(String[] args) throws IOException {
Map<String, Integer> map = new HashMap<>();
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
while(true) {
String line = br.readLine();
if(line == null) {
break;
}
String name = line.split(" ")[0];
int age = Integer.parseInt(line.split(" ")[1]);
map.put(name, age);
}
br.close();
int sum = 0;
double avg;
List<String> pass = new ArrayList<String>();
for(String key : map.keySet()) {
int value = map.get(key);
sum+=value;
if(value>=80) {
pass.add(key);
}
System.out.println(key+":"+value);
}
avg = sum / (double)map.size();
System.out.println("합계:"+sum+"/"+"평균:"+avg);
System.out.println("--80점 이상--");
for(String s : pass) {
System.out.println(s);
}
}
}
결과
박영이:69
홍길동:78
김승찬:87
박철수:85
강감찬:89
이순신:96
김순이:45
합계:549/평균:78.42857142857143
--80점 이상--
김승찬
박철수
강감찬
이순신
🔷 File 객체 : 경로 + 확장자
예) D:\sk\java\java_workspace\java_project\test.txt
1. 경로(Path): 파일이 저장된 위치. D:\sk\java\java_workspace\java_project\ 까지가 경로
2. 확장자(Extension): 파일의 종류. 위 예시에서 test.txt에서 .txt가 확장자.
Java에서 File 객체를 사용하여 새로운 파일을 생성할 수 있다.
🔷 File.separator : 파일 경로를 작성할 때 운영체제에 따라 다른 경로 구분자를 사용
Windows: 백슬래시(\)를 사용. (예: D:\folder\file.txt)
Unix/Linux/Mac: 슬래시(/)를 사용. (예: /home/user/file.txt)
🔷 다양한 파일 형식
txt: 일반 텍스트 파일.
xml: 데이터 저장 및 전송을 위한 마크업 언어. 구조화된 데이터
json: JavaScript Object Notation의 약자로, 데이터 교환 형식. 가독성이 좋고, 많은 API에서 표준으로 채택.
csv: Comma-Separated Values의 약자로, 데이터를 콤마로 구분하여 저장. 주로 엑셀과 호환.
데이터 센터에서는 xml, json이 가장 많이 사용됨.
공공데이터포털(https://www.data.go.kr/) => 정부가 제공하는 다양한 데이터
🔷 예제(6)
package day10;
import java.io.File;
public class File06 {
public static void main(String[] args) {
// File 객체 생성
File f = new File("D:\\sk\\java\\java_workspace\\java_project\\test.txt");
// 운영체제에 따라 다르게 사용되는 파일 경로 구분자 출력
System.out.println(File.separator);
// 파일명과 확장자 출력
String name = f.getName();
System.out.println(name); // 결과: test.txt
// 경로 + 파일명 + 확장자 출력
System.out.println(f.getPath()); // 결과: D:\sk\java\java_workspace\java_project\test.txt
// 파일의 부모 디렉토리 경로 출력
System.out.println(f.getParent()); // 결과: D:\sk\java\java_workspace\java_project
// 파일 객체를 문자열로 변환
String f2 = f.toString();
System.out.println(f2); // 결과: D:\sk\java\java_workspace\java_project\test.txt
// 파일의 이름만 추출하여 출력
String f2Name = f2.substring(f2.lastIndexOf(File.separator) + 1);
System.out.println(f2Name); // 결과: test.txt
}
}
f.getName(): 파일의 이름과 확장자 리턴
f.getPath(): 파일의 전체 경로 리턴
f.getParent(): 파일이 위치한 부모 디렉토리의 경로 리턴
f.toString(): File 객체의 경로를 문자열로 리턴
'백엔드 > Java' 카테고리의 다른 글
| Java 네트워크(Network) (0) | 2024.11.14 |
|---|---|
| Java 쓰레드(Thread) (0) | 2024.11.13 |
| Java 스트림(Stream) (0) | 2024.10.30 |
| Java 람다(Lambda) (0) | 2024.10.29 |
| Java 제네릭(Generic) (1) | 2024.10.26 |