1-3. File을 이해하기 위한 예제(3)
: 1-2 예제(2)에서 했던 코드에 추가로 서브 디렉토리의 파일과 디렉토리까지 보여주는 예제이다.
package File;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
public class Exercise003 {
static int totalFiles = 0;
static int totalDirs = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
if(input == null) {
System.out.println("USAGE : java FileEx3 DIRECTORY");
System.exit(0);
}
File dir = new File(input);
if(!dir.exists() || !dir.isDirectory()) {
System.out.println("유효하지 않은 디렉토리입니다.");
System.exit(0);
}
printFileList(dir);
System.out.println();
System.out.println("총 " + totalFiles + "개의 파일");
System.out.println("총 " + totalDirs + "개의 디렉토리");
} // main
public static void printFileList(File dir) {
System.out.println(dir.getAbsolutePath()+" 디렉토리");
File[] files = dir.listFiles();
ArrayList subDir = new ArrayList();
for(int i=0; i < files.length; i++) {
String filename = files[i].getName();
if(files[i].isDirectory()) {
filename = "[" + filename + "]";
subDir.add(i+"");
}
System.out.println(filename);
}
int dirNum = subDir.size();
int fileNum = files.length - dirNum;
totalFiles += fileNum;
totalDirs += dirNum;
System.out.println(fileNum + "개의 파일, " + dirNum + "개의 디렉토리");
System.out.println();
for(int i=0; i < subDir.size(); i++) {
int index = Integer.parseInt((String)subDir.get(i));
printFileList(files[index]);
}
} // printFileList
}
1-4. File을 이해하기 위한 예제(4)
: 현재 디렉토리에 속한 파일과 디렉토리의 이름, 크기 등 상세정보를 보여주는 예제이다.
package File;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Exercise004 {
public static void main(String[] args) {
String currDir = System.getProperty("user.dir");
File dir = new File(currDir);
File[] files = dir.listFiles();
for(int i=0; i < files.length; i++) {
File f = files[i];
String name = f.getName();
SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mma");
String attribute = "";
String size = "";
if(files[i].isDirectory()) {
attribute = "DIR";
} else {
size = f.length() + "byte";
attribute = f.canRead() ? "R" : " ";
attribute += f.canWrite() ? "W" : " ";
attribute += f.isHidden() ? "H" : " ";
}
System.out.printf("%s %3s %6s %s%n", df.format(new Date(f.lastModified())), attribute, size, name );
}
}
}
1-5. File을 이해하기 위한 예제(5)
: 1-4 예제(4)에서 했던 코드에 정렬 기능을 추가한 코드이다.
package File;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.Scanner;
public class Exercise005 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
System.out.println(" SORT_OPTION : ");
System.out.println(" t Time ascending sort. ");
System.out.println(" T Time descending sort. ");
System.out.println(" l Length ascending sort. ");
System.out.println(" L Length descending sort. ");
System.out.println(" n Name ascending sort. ");
System.out.println(" N Name descending sort. ");
String input = sc.nextLine();
if(input ==null || "tTlLnN".indexOf(input) == -1) {
System.out.println("USAGE : java FileEx5 SORT_OPTION ");
System.exit(0);
}
final char option = input.charAt(0);
String currDir = System.getProperty("user.dir");
File dir = new File(currDir);
File[] files = dir.listFiles();
Comparator comp = new Comparator(){
public int compare(Object o1, Object o2) {
long time1 = ((File)o1).lastModified();
long time2 = ((File)o2).lastModified();
long length1 = ((File)o1).length();
long length2 = ((File)o2).length();
String name1 = ((File)o1).getName().toLowerCase();
String name2 = ((File)o2).getName().toLowerCase();
int result = 0;
switch(option) {
case 't' :
if(time1 - time2 > 0) result = 1;
else if(time1 - time2 == 0) result = 0;
else if(time1 - time2 < 0) result = -1;
break;
case 'T' :
if(time1 - time2 > 0) result = -1;
else if(time1 - time2 == 0) result = 0;
else if(time1 - time2 < 0) result = 1;
break;
case 'l' :
if(length1 - length2 > 0) result = 1;
else if(length1 - length2 == 0) result = 0;
else if(length1 - length2 < 0) result = -1;
break;
case 'L' :
if(length1 - length2 > 0) result = -1;
else if(length1 - length2 == 0) result = 0;
else if(length1 - length2 < 0) result = 1;
break;
case 'n' :
result = name1.compareTo(name2);
break;
case 'N' :
result = name2.compareTo(name1);
break;
}
return result;
} // compare
public boolean equals(Object o) { return false; } // not used.
}; // end of Comparator
Arrays.sort(files, comp);
for(int i=0; i < files.length; i++) {
File f = files[i];
String name = f.getName();
SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm");
String attribute = "";
String size = "";
if(files[i].isDirectory()) {
attribute = "DIR";
} else {
size = f.length() + "";
attribute = f.canRead() ? "R" : " ";
attribute += f.canWrite() ? "W" : " ";
attribute += f.isHidden() ? "H" : " ";
}
System.out.printf("%s %3s %6s %s%n", df.format(new Date(f.lastModified())),attribute,size,name );
} // for
} // main
} // end of class
1-6. File을 이해하기 위한 예제(6)
: 지정된 디렉토리와 그와 포함된 서브 디렉토리에 포함된, 확장자가 'java', 'txt', 'bak'인 모든 파일의
내용을 읽어서 지정한 키워드가 포함된 라인을 출력하는 예제이다.
package File;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Exercise006 {
static int found = 0;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String[] input = new String[2];
System.out.println("경로: ");
input[0] = sc.nextLine();
System.out.println("키워드: ");
input[1] = sc.nextLine();
if(input.length != 2) {
System.out.println("USAGE : java FileEx6 DIRECTORY KEYWORD");
System.exit(0);
}
File dir = new File(input[0]);
String keyword = input[1];
if(!dir.exists() || !dir.isDirectory()) {
System.out.println("유효하지 않은 디렉토리입니다.");
System.exit(0);
}
try {
findInFiles(dir, keyword);
} catch(IOException e) {
e.printStackTrace();
}
System.out.println();
System.out.println("총 " + found + "개의 라인에서 '" + keyword + "'을/를 발견하였습니다. ");
} // main
public static void findInFiles(File dir, String keyword) throws IOException
{
File[] files = dir.listFiles();
for(int i=0; i < files.length; i++) {
if(files[i].isDirectory()) {
findInFiles(files[i], keyword);
} else {
String filename = files[i].getName();
String extension = filename.substring(filename.lastIndexOf(".")+1);
extension = "," + extension + "," ;
if(",java,txt,bak,".indexOf(extension) == -1) continue;
filename = dir.getAbsolutePath() + File.separator + filename;
FileReader fr = new FileReader(files[i]);
BufferedReader br = new BufferedReader(fr);
String data = "";
int lineNum = 0;
while((data=br.readLine())!=null) {
lineNum++;
if(data.indexOf(keyword)!=-1) {
found++;
System.out.println("["+filename+ "("+lineNum+")" + "]" + data);
}
} // while
br.close();
}
} // for
} // findInFiles
} // class
( File.separator은 File의 static 멤버변수이므로, 구분자를 사용할 때 쓰인다. )
( extension의 뒤쪽이나 앞 쪽에만 구분자를 붙이면 확장자가 'ava'와 같이 부분적으로 일치하는 경우에
문제가 생긴다. )
다음장
표준 입출력과 File: File(3) (tistory.com)
표준 입출력과 File: File(3)
1-7. File을 이해하기 위한 예제(7) : 해당 디렉토리에 입력된 문자열과 일치한 파일의 목록을 보여주는 예제이다. package File; import java.io.File; import java.io.FilenameFilter; import java.util.Scanner..
kind-coding.tistory.com
'자바 > 입출력 IO' 카테고리의 다른 글
표준 입출력과 File: File(4) (0) | 2022.04.28 |
---|---|
표준 입출력과 File: File(3) (0) | 2022.04.28 |
표준 입출력과 File: File(1) (0) | 2022.04.27 |
표준 입출력과 File: RandomAccessFile (0) | 2022.04.27 |
표준 입출력과 File: System(in, out, err) (0) | 2022.04.27 |