지원기능 : 파일분할, 파일존재유무, 파일폴더 존재유무, 생성할 파일이 이미 존재 확인, 크기확인..
아래 예제는 객체 정보를 파일로 생성하는데 있어서 2M의 MAX 크기를 기본으로 설정하고
2M가 넘으면 새로운 파일을 만들어내는 로직이다.
다소 위험한 부분들도 있지만 (특히 NumberFormatException) 이런 취약부분은 코드가 길어지는
관계로 생략하고, 파일이 생성되야 하는 폴더에 생성이되고 증가되면서 임계치를 넘었는지 봐서
다음번 파일 생성시에는 이름을 달리해서 생성시키는 방법을 가지고 있다.
이런로직의 핵심은 OutputStream os = new FileOutputStream(neoPathFile, addFile); 로써
addFile true 라면 덧붙이기가 가능하고 false면 새롭게 생성하게 된다.
이미 단위메소드 활용법에 대해서는 알고 있을테지만 종합선물셋트 형태에서는 고민할꺼리가 많아지는터라 이렇게 정리를 해본다.
public static String makeFileOneContents(String fileName, String serviceRoot, XMLHeaderBean xmlUserInfo, List<XMLCategoryBean> xmlCategory, XMLPostBean postBean, NeoBean neoBean) {
boolean makeFileBoolean = false;
boolean addFile = false;
String neoFileName = fileName;
String neouserFileRoot = serviceRoot+File.separator+neoBean.getName()();
long maxFileSize = 2 * 1024 * 1024; // 2M
long nowFileSize = 0; // 2M
File fileDirRoot = new File (neouserFileRoot);
if (fileDirRoot.isDirectory()) { // 디렉토리 존재하는가? / 네 존재합니다.
File[] files = fileDirRoot.listFiles();
for (File fileDir : files) {
String fileNames = fileDir.getName();
long file_size = fileDir.length();
if (fileNames.equals(neoFileName+".xml") && file_size >= maxFileSize) {
int fileCount = Integer.parseInt(neoFileName.substring(neoFileName.lastIndexOf("_")+1, neoFileName.length())) + 1;
neoFileName = neoFileName.substring(0, neoFileName.lastIndexOf("_")) +"_"+fileCount;
} else {
nowFileSize = files.length;
addFile = true;
}
}
} else {
fileDirRoot.mkdir();
}
String neoPath = serviceRoot+File.separator+neoBean.getName()()+File.separator+neoFileName;
neoPath = neoPath +".xml"; // 넘어올때 xml이라는 확장자 이름을 달고오지 않습니다.
File neoPathFile = new File(neoPath);
XMLBean xmlBean = new XMLBean();
BufferedReader in = null;
BufferedWriter out = null;
try {
OutputStream os = new FileOutputStream(neoPathFile, addFile); //addFile의 옵션에 따라 파일을 덧 추가하거나 분할한다. (true: 추가 / false : 분할)
out = new BufferedWriter (new OutputStreamWriter(os, "UTF-8"));
// XML을 만들때 setting + category 를 1개의 Set으로 간주해서 우선 파일을 생성합니다.
// 그리고 postAL 의 경우는 attach된 파일이 있을경우를 대비 1개씩 추가로 삽입합니다.
String readLine;
String readSetting = xmlUserInfo.getXml().toString();
StringBuffer sbCate = new StringBuffer();
for (XMLCategoryBean categoryBean: xmlCategory) {
sbCate.append(categoryBean.getXml());
}
readSetting = readSetting+sbCate.toString(); // setting + category
if (!addFile) { // 새로만든 파일은 해더와 카테고리 정보를 넣습니다.
out.write(xmlBean.getHeader());
in = new BufferedReader (new InputStreamReader(new ByteArrayInputStream(readSetting.getBytes())));
while ((readLine = in.readLine()) != null) {
out.write(readLine);
out.newLine();
}
}
if (postBean != null) {
nowFileSize =+ postBean.getXml().toString().getBytes().length;
in = new BufferedReader (new InputStreamReader(new ByteArrayInputStream(postBean.getXml().toString().getBytes())));
while ((readLine = in.readLine()) != null) {
out.write(readLine);
out.newLine();
}
}
makeFileBoolean = true;
if (nowFileSize >= maxFileSize) { // 생성될 파일의 크기가 크다면 Footer 정보를 넣어줍니다.
out.write(xmlBean.getFooter());
}
}
catch (MalformedURLException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
finally {
try {
in.close();
out.close();
} catch (IOException e) { e.printStackTrace(); }
}
return neoFileName;
}
}