JAVA 에서는 System 외부로부터의 Data도 다를 수 있으며, system 안으로 또는 밖으로 이동하는 Data의 흐름을 Stream 이라고 한다.
Java.io package는 크게 InputStream 과 OutputStream 으로 나뉜다.
Input/Output Stream 은 byte 기반 최 상위 class 이다
각 하위 클래스들은 특화된 분야가 있기 때문에 Input/Output Stream 을 직접 사용 하는 경우는 드물다.
- File은 I/O 에 해당하는 클래스가 아니다
- file.directory 등을 다룰 수 있게 해 주는 객체이다.
- File에 Data를 읽고 쓰는 기능은 Stream을 통해 이루어 진다.
public class FileModel {
public String makeFolder(String path) {
// 파일, 디렉토리 등을 다룰때는 무조건 File 객체를 사용한다.
File folder = new File(path);
String msg = "이미 존재하는 폴더 입니다.";
if(folder.exists()==false) { // 디렉토리가 존재하지 않으면
msg = folder.mkdirs()==true?"폴더가 생성 되었습니다.":"다시 시도해 주세요.";
}
return msg;
}
public String createNewFile(String path) throws IOException {
File file = new File(path);
String msg = "이미 존재하는 파일 입니다.";
if(file.exists()==false) {
msg = file.createNewFile()==true?"파일이 생성 되었습니다.":"다시 시도해 주세요.";
}
return msg;
}
public List<Map<String, Object>> fileList(String path) {
File file = new File(path);
File[] files = file.listFiles();
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String, Object> map = null;
for (File f : files) {
map = new HashMap<String, Object>();
map.put("dir",f.isDirectory()); // 디렉토리 여부
map.put("name",f.getName()); // 파일/디렉토리 이름
map.put("size",f.length()/1024); // kb
map.put("hidden",f.isHidden()); // 숨김 여부
list.add(map);
}
return list;
}
// 1. 읽을 위치 지정 + 2. 건드릴 파일을 객체화
File file = new File("C:/img/temp/news.txt");
// 3. 읽어올 빨대를 준비(InputStream | Reader).
FileReader reader = new FileReader(file);
// 4. 읽어온다.
// read() 는 숫자를 반환(문자의 경우는 ASCII CODE 반환)
// 더 이상 읽을 내용이 없으면 -1(End Of File)
int data = 0;
StringBuilder builder = new StringBuilder();
while((data = reader.read()) != -1) {
//System.out.print((char)data);
builder.append((char)data);
}
// 5. 다 사용한 자원은 닫는다.
reader.close();
// 1. 저장할 위치 지정 + 2. 파일 객체 생성
File file = new File("C:/img/temp/user001.txt");
// 3. 내보낼 스트림 준비(OutputStream, Writer)
FileWriter fw = new FileWriter(file, true); // 쓸 파일과, 이어쓰기 여부
// 4. 저장할 내용 입력
fw.write(content+"\r\n"); // new line : 줄바꿈
// 5. 내보내기+자원반납
fw.flush();
fw.close();
Upload : 사용자PC -> 서버 파일을 전송하는것
<form action="write" method="post" enctype="multipart/form-data">
@MultipartConfig(fileSizeThreshold = 10*1024*1024,maxFileSize = 20*1024*1024,maxRequestSize = 50*1024*1024)
// fileSizeThreshold : 파일이 디스크에 기록될 때 까지의 크기 임계값
// maxFileSize : 업로드 될 파일의 최대 허용 크기
// maxRequestSize : 파일을 포함한 요청의 최대 허용 크기(multipart/form-data)
// 외부라이브러리의 힘을 빌려, 파일, 파일명, 파라메터 등을 추출 한다.
PartsUploadUtil util = new PartsUploadUtil(req);
System.out.println(util.getParams()); // 일반 파라메터 확인
String fileName = util.getFileName("file"); // 파일명 알아내기
InputStream is = util.getStream("file"); // 1. input stream 얻어 오기
// 2. 밖으로 내보낼 OutputStream 준비 + 저장위치 설정
FileOutputStream fos = new FileOutputStream("c:/img/"+fileName);
/* 3. 파일의 데이터 읽기(기본적인 방식) - 네트워크에서 파일 전송시 이방법을 쓴다.
int data = 0;
while((data=is.read())!= -1) {
System.out.println("저장중...");
fos.write(data); // 4. 읽을 내용 쓰기
}
*/
// 조금 더 큰 숟가락으로 데이터를 이동해 보자
// read(byte) 사용시 읽어들인 바이트수와 -1 만을 반환 한다.
byte[] cup = new byte[1024];
while(is.read(cup)!= -1) {
System.out.println("저장중...");
fos.write(cup);
}
// 5. 자원 반납
is.close();
fos.flush();
fos.close();