java.nio = New I/O
It was introduced to improve performance, scalability, and flexibility in Java I/O operations.
Here’s what it covers:
Feature | java.io (Old I/O) | java.nio (New I/O) |
📚 Style | Stream-based | Buffer & channel-based |
📁 File handling | File | Path, Files |
🔁 I/O type | Blocking only | Blocking & Non-blocking |
⚙️ Performance | Good for simple tasks | Better for large data or high load |
📂 Directory walk | Manual | Built-in (Files.walk()) |
🧠 Learning curve | Easier to start with | More powerful, but more complex |
🛠️ Use case | Small, legacy, simple apps | Modern, scalable applications |
Path
파일 시스템의 경로 자체를 표현하는 객체 (파일이나 디렉토리가 실제 존재하지 않아도 됨). Path는 "경로 조작 전용 계산기" 같고,
반면, File은 기존 java.io.File 클래스, 실제 존재하는 파일이나 디렉토리를 대상으로 직접 입출력하는 객체.
- Paths.get (String first, String... more) : **파일 시스템 경로(Path)**를 생성하는 정적 메서드입니다. 여러 문자열을 받아서, OS에 맞는 디렉토리 구분자(/, \)로 연결된 경로 객체를 생성합니다.
- first: 첫 번째 경로 조각
- more: 나머지 경로 조각 (0개 이상)
String flowPlanPath = "/var/www/files/floorplan";
Integer companyNo = 123;
Path uploadDir = Paths.get(flowPlanPath, companyNo.toString());
\var\www\files\floorplan\123
- Path.resolve() : 하위 경로를 현재 Path에 붙여서 새로운 Path를 만든다
Path base = Paths.get("/var/www/files");
Path result = base.resolve("floorplan.png");
System.out.println(result);
// 출력: /var/www/files/floorplan.png
- Path.normalize() : 경로 안의 .(현재 디렉토리), ..(상위 디렉토리) 등을 정리해서 실제 OS에서 사용할 수 있는 "정상적이고 안전한 경로"로 만들어주는 기능입니다.
- 단순히 "깔끔해 보이기" 때문이 아니라, 보안과 파일 시스템 안정성 때문에 사용함.
- 운영체제도 /../는 실행 시 해석해서 "상위 디렉토리"로 올라가요. 그래서 Java에서 미리 normalize() 해두면 .이나 ..을 제거하여 정상적인 url로 변경
public class NormalizeExample {
public static void main(String[] args) {
Path path1 = Paths.get("/home/user/docs/../secret/file.txt");
System.out.println("Before normalize: " + path1); // /home/user/docs/../secret/file.txt
System.out.println("After normalize : " + path1.normalize()); // /home/user/secret/file.txt
}
}
- Path.getFileName() : Path의 가장 마지막 요소 (가장 오른쪽 segment)를 반환하는 메서드입니다. 경로가 여러 계층으로 구성되어 있을 때 가장 마지막에 해당하는 부분을 추출합니다.
- Path.toFile() :Path 객체를 File 객체로 변환합니다. 내부적으로 new File(path.toString())과 거의 동일한 역할을 합니다. 라이브러리가 File 타입을 요구할 때 주로 사용됨.
Multipart란?
Multipart는 HTML 4.01부터 도입된 multipart/form-data 타입에서 시작되었고, Java에서는 Servlet 3.0 (Java EE 6, 2009년)부터 표준 지원되기 시작했어요.
HTML <form>에서 파일 업로드를 할 때 사용하는 enctype="multipart/form-data" 방식입니다. 텍스트 필드 + 파일을 함께 전송 가능. (파일과 일반 폼 필드(DTO의 필드들)**을 함께 전송할 수 있도록 만들어진 포맷)
메소드 | 설명 |
String getName() | 폼 필드 이름 (예: <input name="file" />) |
String getOriginalFilename() | 업로드된 파일의 원래 이름 |
String getContentType() | image/png, application/pdf 등 MIME 타입 |
boolean isEmpty() | 파일이 비어있는지 여부 |
long getSize() | 파일 크기 (바이트) |
byte[] getBytes() | 파일 전체 내용을 바이트 배열로 가져오기 |
InputStream getInputStream() | 파일 내용을 읽을 수 있는 InputStream 반환 |
void transferTo(File dest) | 파일을 디스크에 저장 |
if (file.isEmpty()) {
throw new IllegalArgumentException("빈 파일");
}
String originalName = file.getOriginalFilename();
String contentType = file.getContentType();
long size = file.getSize();
Path targetPath = Paths.get("/uploads", originalName);
file.transferTo(targetPath.toFile());
'개발기술 > Java' 카테고리의 다른 글
Java 리플렉션, 제네릭 (0) | 2025.04.08 |
---|---|
Java Blocking I/O vs non-Blocking I/O (0) | 2025.04.06 |
Exception Handling & Logging (1) | 2025.03.10 |
Java의 메모리 영역과 static의 의미 (0) | 2025.01.15 |
Java 코딩구현 심화 : 스트림,람다식 (0) | 2024.09.20 |