[ 날짜 연산법 ]
가. 이해 및 유틸
- 시스템 시간에 대한 이해
- 날짜 계산 종합 유틸리티
나. 응용팁
시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
------------------------------------------------------------------
// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );
------------------------------------------------------------------
현재 시각을 가져오기.
------------------------------------------------------------------
Date today = new Date ();
System.out.println ( today );
결과 : Sat Jul 12 16:03:00 GMT+01:00 2000
------------------------------------------------------------------
경과시간(초) 구하기
------------------------------------------------------------------
long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );
------------------------------------------------------------------
Date를 Calendar로 맵핑시키기
------------------------------------------------------------------
Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );
------------------------------------------------------------------
날짜(년/월/일/시/분/초) 구하기
------------------------------------------------------------------
import java.util.*;
import java.text.*;
SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime );
------------------------------------------------------------------
날짜(년/월/일/시/분/초) 구하기2
------------------------------------------------------------------
GregorianCalendar today = new GregorianCalendar ( );
int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH );
GregorianCalendar gc = new GregorianCalendar ( );
System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) );
------------------------------------------------------------------
날짜(년/월/일/시/분/초) 구하기3
------------------------------------------------------------------
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime());
------------------------------------------------------------------
- 표준시간대를 지정하고 날짜를 가져오기.
------------------------------------------------------------------
TimeZone jst = TimeZone.getTimeZone ("JST");
Calendar cal = Calendar.getInstance ( jst ); // 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.// 또는 Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " +cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " );
결과 : 2000년 8월 5일 16시 16분 47초
------------------------------------------------------------------
영어로된 날짜를 숫자로 바꾸기
------------------------------------------------------------------
Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) );
------------------------------------------------------------------
"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
------------------------------------------------------------------
SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );
String inString = "Sun, 5 Dec 1999 00:07:21";
ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );
System.out.println ( outString );
------------------------------------------------------------------
숫자 12자리를, 다시 날짜로 변환하기
------------------------------------------------------------------
Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
System.out.println ( ttl ); //예 938291839221
Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted );
------------------------------------------------------------------
특정일로부터 n일 만큼 이동한 날짜 구하기
------------------------------------------------------------------
특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다
------------------------------------------------------------------
특정일에서 일정 기간후의 날짜 구하기2
------------------------------------------------------------------
//iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;
public String getDate ( int iDay )
{
Calendar temp=Calendar.getInstance ( );
StringBuffer sbDate=new StringBuffer ( );
temp.add ( Calendar.DAY_OF_MONTH, iDay );
int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );
sbDate.append ( nYear );
if ( nMonth < 10 )
sbDate.append ( "0" );
sbDate.append ( nMonth );
if ( nDay < 10 )
sbDate.append ( "0" );
sbDate.append ( nDay );
return sbDate.toString ( );
}
------------------------------------------------------------------
현재날짜에서 2달전의 날짜를 구하기
------------------------------------------------------------------
Calendar cal = Calendar.getInstance ( );//오늘 날짜를 기준으루..
cal.add ( cal.MONTH, -2 ); //2개월 전....
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) );
------------------------------------------------------------------
달에 마지막 날짜 구하기
------------------------------------------------------------------
for ( int month = 1; month <= 12; month++ )
{
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
}
------------------------------------------------------------------
해당하는 달의 마지막 일 구하기
------------------------------------------------------------------
GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday );
------------------------------------------------------------------
특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
------------------------------------------------------------------
Calendar cal = Calendar.getInstance ( );
cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) );
SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" );
System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) );
System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) );
------------------------------------------------------------------
해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )
------------------------------------------------------------------
Calendar calendar = Calendar.getInstance ( );
calendar.set ( 1999, 0, 1 );
int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH );
------------------------------------------------------------------
어제 날짜 구하기
------------------------------------------------------------------
오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..
------------------------------------------------------------------
어제 날짜 구하기2
------------------------------------------------------------------
import java.util.*;
public static Date getYesterday ( Date today )
{
if ( today == null )
throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );
return yesterday;
}
------------------------------------------------------------------
내일 날짜 구하기
------------------------------------------------------------------
Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) );
------------------------------------------------------------------
내일 날짜 구하기2
------------------------------------------------------------------
Calendar today = Calendar.getInstance ( );
today.add ( Calendar.DATE, 1 );
Date tomorrow = today.getTime ( );
------------------------------------------------------------------
오늘날짜에서 5일 이후 날짜를 구하기
------------------------------------------------------------------
Calendar cCal = Calendar.getInstance();
c.add(Calendar.DATE, 5);
------------------------------------------------------------------
날짜에 해당하는 요일 구하기
------------------------------------------------------------------
//DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스는 JSP일부입니다.
import java.util.*;
Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 )
m_week="일요일";
else if ( day_of_week == 2 )
m_week="월요일";
else if ( day_of_week == 3 )
m_week="화요일";
else if ( day_of_week == 4 )
m_week="수요일";
else if ( day_of_week == 5 )
m_week="목요일";
else if ( day_of_week == 6 )
m_week="금요일";
else if ( day_of_week == 7 )
m_week="토요일";
오늘은 : 입니다.
------------------------------------------------------------------
콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
------------------------------------------------------------------
//gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) );
------------------------------------------------------------------
두 날짜의 차이를 일수로 구하기
------------------------------------------------------------------
각각의 날짜를 Date형으로 만들어서 getTime()하면
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.
------------------------------------------------------------------
두 날짜의 차이를 일수로 구하기2
------------------------------------------------------------------
import java.io.*;
import java.util.*;
Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( today );// 오늘로 설정.
Calendar cal2 = Calendar.getInstance ( );
cal2.set ( 2000, 3, 12 ); // 기준일로 설정. month의 경우 해당월수-1을 해줍니다.
int count = 0;
while ( !cal2.after ( cal ) )
{
count++;
cal2.add ( Calendar.DATE, 1 ); // 다음날로 바뀜
System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}
System.out.println ( "기준일로부터 " + count + "일이 지났습니다." );
------------------------------------------------------------------
두 날짜의 차이를 일수로 구하기3
------------------------------------------------------------------
import java.io.*;
import java.util.*;
public class DateDiff
{
public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 )
{
Calendar cal = Calendar.getInstance ( );
int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;
if ( nYear1 > nYear2 )
{
for ( int i = nYear2; i < nYear1; i++ )
{
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate1 += nDiffOfYear;
}
else if ( nYear1 < nYear2 )
{
for ( int i = nYear1; i < nYear2; i++ )
{
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate2 += nDiffOfYear;
}
cal.set ( nYear1, nMonth1-1, nDate1 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate1 += nDiffOfDay;
cal.set ( nYear2, nMonth2-1, nDate2 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate2 += nDiffOfDay;
return nTotalDate1-nTotalDate2;
}
public static void main ( String args[] )
{
System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
}
}
------------------------------------------------------------------
파일에서 날짜정보를 가져오기
------------------------------------------------------------------
File f = new File ( directory, file );
Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );
System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND));
------------------------------------------------------------------
날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.
------------------------------------------------------------------
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );
for ( int i = 0; i < 48; i++ )
{
c.clear ( );
c.set ( 2000, 1, 3 - ( i * 7 ) );
java.util.Date d = c.getTime ( );
String thedate = sdf.format ( d );
System.out.println ( thedate );
}
------------------------------------------------------------------
쓰레드에서 날짜 바꾸면 죽는 문제
------------------------------------------------------------------
Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.
문제소스:
public void run ( )
{
while ( true )
{
try{
timer.sleep ( 60000 );
}
catch ( InterruptedException ex ) { }
lblTimeDate.setText ( fGetDateTime ( ) );
repaint ( );
}
}
public String fGetDateTime ( )
{
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf.setTimeZone ( timeZone );
long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
}
해답:
// 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( )
{
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );
return sdf4.format ( now );
}
------------------------------------------------------------------
날짜와 시간이 유효한지 검사하려면...?
------------------------------------------------------------------
import java.util.*;
import java.text.*;
public class DateCheck
{
boolean dateValidity = true;
DateCheck ( String dt )
{
try
{
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df.setLenient ( false );
Date dt2 = df.parse ( dt );
}
catch ( ParseException e ) { this.dateValidity = false; }
catch ( IllegalArgumentException e ) { this.dateValidity = false; }
}
public boolean datevalid ( )
{
return dateValidity;
}
public static void main ( String args [] )
{
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
}
------------------------------------------------------------------
두 날짜 비교하기(아래보다 정확)
------------------------------------------------------------------
그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...
이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.
만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다
------------------------------------------------------------------
두 날짜 비교하기2
------------------------------------------------------------------
//Calendar를 쓸 경우 데이타의 원본을 고치기 때문에 clone()을 사용하여
//복사한 후에 그 복사본을 가지고 비교한다
import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;
public class DayComparisonTest
{
public static void main(String args[])
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");
Calendar aDate = Calendar.getInstance(); // 비교하고자 하는 임의의 날짜
aDate.set(2001, 0, 1);
Calendar bDate = Calendar.getInstance(); // 이것이 시스템의 날짜
// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate.set( Calendar.HOUR_OF_DAY, 0 );
aDate.set( Calendar.MINUTE, 0 );
aDate.set( Calendar.SECOND, 0 );
aDate.set( Calendar.MILLISECOND, 0 );
bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate.set( Calendar.MINUTE, 0 );
bDate.set( Calendar.SECOND, 0 );
bDate.set( Calendar.MILLISECOND, 0 );
if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println("같은 날이구만");
}
}

 

Tistory 태그: ,

파일과 디렉토리 접근

1. File 객체로 작업하기

<1> File 객체의 개념

   ▣ 파일이나 디렉토리에 대한 경로 또는 참조를 추상화한 객체

<2> File 객체의 용도

   ▣ 물리적 파일 시스템에 대해 캡슐화한 경로명을 확인하고

       실제의 파일이나 디렉토리와 대응되는지 알아볼 때

   ▣ 파일 스트림 객체를 생성하고자 할 때

2.  File 객체 생성하기

   ▣ File 객체를 생성하는 데에는 네 개의 생성자를 사용할 수 있다

       ① File myFile = new File("C:/j2SDK 1.4.0/src/java/io/File.java");

       ② File myDir = new File("C:/j2SDK 1.4.0/src/java/io"); // 부모 디렉토리

File myFile = new File(myDir, "File.java");  // 파일의 경로

       ③ File myFile = new File("C:/j2SDK 1.4.0/src/java/io" ,"File.java");

       ④ File remoteFile = new File(new URI(http://p2p.wrox.com/java));

   ▣ 경로에 대한 이식성을 고려

       * 경로 이름을 만드는 것은 시스템에 의존적이지만

          File 클래스의 separator 변수를 사용함으로써

          좀더 시스템에 독립적으로 myFile에 대한 경로를 지정 가능

3. File 객체를 확인하고 테스트하기

<1> File 객체에 대한 정보를 얻을 수 있는 메서드

   ▣ getName()

   ▣ getPath()

   ▣ isAbsolute()

   ▣ getParent()

   ▣ toString()

   ▣ hashCode()

   ▣ equals()

<2> File 객체가 참조하는 파일이나 디렉토리를 테스트하기 위한 메서드

   ▣ exist() //참조하는 파일 또는 디렉토리가 존재하는가

   ▣ isDirectory() //디렉토리를 참조하는가

   ▣ isFile() //파일을 참조하는가

   ▣ isHidden() //숨김 속성이 있는 파일을 참조하는가

   ▣ canRead() //파일 또는 디렉토리가 읽을 권한이 있는가

   ▣ canWrite() //파일 또는 디렉토리가 쓰기 권한이 있는가

   ▣ getAbsolutePath() //절대경로 리턴

   ▣ getAbsoluteFile() //절대경로를 포함한 File 객체 리턴

   ▣ (예) 파일 테스트하기

(소스코드)

import java.io.File;

public class TryFile { 
public static void main(String[] args) {

// 디렉토리를 참조하는 객체 생성 
File myDir = new File("C:/JAVA/Chapter09"); 
System.out.println(myDir + (myDir.isDirectory() ? " is" : " is not") 
                       + " a directory.");

// 파일을 참조하는 객체 생성 
File myFile = new File(myDir, "TryFile3.java"); 
System.out.println(myFile + (myFile.exists() ? " does" : " does not") 
                       + " exist"); 
System.out.println(myFile + (myFile.isFile() ? " is" : " is not") 
                       + " a file."); 
System.out.println(myFile + (myFile.isHidden() ? " is" : " is not") 
                       + " hidden"); 
System.out.println("You can" + (myFile.canRead() ? " " : "not ") 
                       + "read " + myFile); 
System.out.println("You can" + (myFile.canWrite() ? " " : "not ") 
                       + "write " + myFile); 
return; 
  } 
}


 

<3> 존재하는 파일 또는 디렉토리에 대해 더 많은 정보를 제공해주는 메서드

   ▣ list() //디렉토리 내의 파일 이름과 하위 디렉토리의 이름을 담고 있는 String 배열 리턴

   ▣ listFiles() //디렉토리 내의 파일과 하부 디렉토리에 대응되는 File 객체 배열 리턴

   ▣ length() //파일의 길이

   ▣ lastModified() //마지막 수정시각

   ▣ (예) 더 많은 정보 얻기

(소스코드)

import java.io.File;
import java.util.Date;   // Date 클래스를 사용하기 위해 포함시킴

public class TryFile2 {
public static void main(String[] args) {

// 디렉토리를 참조하는 객체 생성
File myDir = new File("C:/JAVA/Chapter09");
System.out.println(myDir.getAbsolutePath()
                       + (myDir.isDirectory() ? " is " : " is not ")
                       + "a directory");
System.out.println("The parent of " + myDir.getName() + " is "
                       + myDir.getParent());

// 디렉토리 내의 파일 리스트를 얻어옴
File[] contents = myDir.listFiles();

// 파일 리스트를 출력
if (contents != null) {
System.out.println("\nThe " + contents.length
                         + " items in the directory " + myDir.getName()
                         + " are:");
for (int i = 0; i < contents.length; i++) {
System.out
          .println(contents[i] + " is a "
                   + (contents[i].isDirectory() ? "directory" : "file")
                   + " last modified "
                   + new Date(contents[i].lastModified()));
      }
    } else {
System.out.println(myDir.getName() + " is not a directory");
    }

System.exit(0);
  }
}


 

<4> 파일 리스트 필터링

   ▣ list()와 listFiles() 메서드는 파일 리스트를 필터링하는 인자를 받도록 오버로드 되어 있다

   ▣ list() 메서드의 인자는 FilenameFilter 타입의 변수여야 하지만,

   ▣ listFiles() 메서드는 FilenameFilter와FileFilter 두 가지를 모두 사용할 수 있다

   ▣ (예) FilenameFilter  인터페이스 사용하기

(소스코드)

1) TryFile3  클래스

import java.io.File;

import java.io.FilenameFilter; 
import java.util.Date;   // Date 클래스를 사용하기 위해 포함시킴

public class TryFile3 { 
public static void main(String[] args) {

// 디렉토리를 참조하는 객체 생성 
File myDir = new File("C:/JAVA/Chapter09"); 
System.out.println(myDir.getAbsolutePath() 
                       + (myDir.isDirectory() ? " is " : " is not ") 
                       + "a directory"); 
System.out.println("The parent of " + myDir.getName() + " is " 
                       + myDir.getParent());

    // F로 시작하는 자바 소스 파일을 필터링하기 위한 필터 정의 
FilenameFilter select = new FileListFilter("F", "java");

// 디렉토리 내의 파일 리스트를 얻어옴 
File[] contents = myDir.listFiles(select);

// 파일 리스트를 출력 
if (contents != null) { 
System.out.println("\nThe " + contents.length 
                         + " items in the directory " + myDir.getName() 
                         + " are:"); 
for (int i = 0; i < contents.length; i++) { 
System.out 
          .println(contents[i] + " is a " 
                   + (contents[i].isDirectory() ? "directory" : "file") 
                   + " last modified " 
                   + new Date(contents[i].lastModified())); 
      } 
    } else { 
System.out.println(myDir.getName() + " is not a directory"); 
    }

System.exit(0); 
  } 
}

2) FileListFilter  클래스

import java.io.File; 
import java.io.FilenameFilter;

public class FileListFilter implements FilenameFilter { 
private String name;        // 파일 이름 
private String extension;   // 파일 확장자

// 생성자 
public FileListFilter(String name, String extension) { 
this.name = name; 
this.extension = extension; 
  }

public boolean accept(File directory, String filename) { 
boolean fileOK = true;

// 필터링하기 위한 파일 이름이 설정되어 있으면 파일 이름을 확인함 
if (name != null) 
      fileOK &= filename.startsWith(name);

    // 필터링하기 위한 확장자가 설정되어 있으면 확장자를 검사함 
if (extension != null) 
      fileOK &= filename.endsWith('.' + extension);

return fileOK; 
  } 
}


 

4. 파일과 디렉토리를 생성하고 수정하기

   ▣ File 클래스에는 그 파일을 읽기 전용으로 만들거나 이름을 바꾸는 등 물리적인 파일에

       변화를 줄 수 있는 메서드가 있다.

       또한 파일 또는 디렉토리를 생성하거나 삭제할 수 있게 해주는 메서드들도 있다.

   ▣ renameTo(File path)

   ▣ setReadOnly()

   ▣ mkdir()

   ▣ mkdirs()

   ▣ createNewFile()

   ▣ createTempFile(String prefix, String suffix, File directory)

   ▣ createTempFile(String prefix, String suffix)

   ▣ delete()

   ▣ deleteOnExit()

5. 파일 출력 스트림 생성하기

   ▣ 디스크에 존재하는 물리적인 파일에 무언가 쓰고자 할 때

       FileOutputStream 객체를 사용할 수 있다

   ▣ FileOutputStream 객체의 다섯 개의 생성자

       * FileOutputStream(String filename)

       * FileOutputStream(String filename, boolean append)

       * FileOutputStream(File file)

       * FileOutputStream(File file, boolean append)

       * FileOutputStream(FileDescriptor desc)

6. 파일이 존재하는 것을 보장하기

   ▣ 파일이 존재하면 이 파일에 데이터를 덧붙이고 존재하지 않는 파일이면 생성하고자 할 때

       파일 출력 스트림을 생성해야하는데, 여기서 확인해야 할 것들이 있다.

   ▣ File 객체를 사용해서 실제로 디렉토리가 아니라 파일을 나타내고 있는지 확인한다.

       만일 파일이 아니라면 더 이상 진행하지 말고 오류 메시지를 출력해 주어야 한다.

   ▣ 그 파일이 존재하는지 확인하기 위해 File 객체를 사용한다. 파일이 존재하지 않는다면

       File 객체가 절대경로를 가지고 있는지 확인해야 한다.

       이것은 부모 디렉토리를 얻어오고 확인하는 데 사용된다.

   ▣ 부모 디렉토리에 대한 경로를 얻어오고 이것을 사용해서 다른 File 객체를 생성한다.

       부모 디렉토리가 존재하는지 확인하기 위해 새로운 File 객체를 사용한다.

       만약 존재하지 않는다면 File 객체의 mkdir() 메서드를 사용해서 새로 생성한다.

   ▣ (예) 파일이 존재하는 것을 보장하기

(소스코드)

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileNotFoundException;

public class GuaranteeAFile { 
public static void main(String[] args) { 
String filename = "C:/Beg Java Stuff/Bonzo/Beanbag/myFile.txt"; 
File aFile = new File(filename);    // File 객체 생성

// 경로가 파일인지를 확인 
if (aFile.isDirectory()) {

// 오류 메세지 후에 종료함 
      // 여기에서 키보드로부터 입력을 받아 다시 시도하도록 할 수 있음 
System.out.println("The path " + aFile.getPath() 
                         + " does not specify a file. Program aborted."); 
System.exit(1); 
    }

  // 파일이 존재하지 않을 경우 
if (!aFile.isFile()) { 
// 부모 디렉토리를 확인 
      aFile = aFile.getAbsoluteFile(); 
File parentDir = new File(aFile.getParent()); 
if (!parentDir.exists()) {   // 필요하다면 디렉토리를 생성 
        parentDir.mkdirs(); 
      } 
    }

// 스트림에 대한 참조를 저장할 장소 
FileOutputStream outputFile = null; 
try {

// 데이터를 추가하는 데 사용될 스트림 생성 
      outputFile = new FileOutputStream(aFile, true); 
    } catch (FileNotFoundException e) { 
      e.printStackTrace(System.err); 
    } 
System.exit(0); 
  } 
}


 

7. 파일 덮어쓰는 것을 방지하기

   ▣ 이미 파일이 존재할 때 그 파일을 덮어쓰고 싶을 않을 때

       덮어쓰기를 막을 수 있는 방법이 있다.

       저장하려는 원래 이름을 어떠한 방법으로든 바꿔준다면

       그것이 덮어쓰기를 막을 수 있는 한 가지 방법이 될 수 있다.

   ▣ (예) 파일을 덮었는 것을 방지하기

(소스코드)

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;

public class AvoidOverwritingFile {
public static void main(String[] args) {
String filepath = "C:/Beg Java Stuff/myFile.txt";
File aFile = new File(filepath);
FileOutputStream outputFile = null;     // 스트림에 대한 참조를 저장할 장소
if (aFile.isFile()) {
File newFile = aFile;                 // 원래의 파일을 가지고 시작함

  // 유일한 이름이 될 때까지 파일 이름에 "_old"를 덧붙임
do {
String name = newFile.getName();    // 파일의 이름을 얻어옴
int period =
          name.indexOf('.');         // 확장자의 구분자를 찾음
        newFile = new File(newFile.getParent(),
                           name.substring(0, period) + "_old"
                           + name.substring(period));
      } while (newFile.exists());             // 이름이 바뀔 때까지 반복
      aFile.renameTo(newFile);              
    }

// 새로운 파일 생성
try {

// 데이터를 추가하기 위한 스트림 생성
      outputFile = new FileOutputStream(aFile);
System.out.println("myFile.txt output stream created");
    } catch (FileNotFoundException e) {
      e.printStackTrace(System.err);
    }
System.exit(0);
  }
}


 

8. FileDescriptor 객체

<1> FileDescriptor 객체

   ▣ FileOutputStream에는 FileDescriptor 타입의 객체를 리턴해주는 getFD() 메서드가 있다.

   ▣ 여기서 FileDescriptor는 물리적인 파일에 대한 현재의 연결을 나타내는 객체이다.

   ▣ 직접 FileDescriptor 객체를 생성할 수는 없고 파일 스트림을 나타내는 객체로부터

       getFD() 메서드를 호출해서 FileDescriptor 객체를 얻을 수 있다

   ▣ 스트림을 한번 닫고 나면 파일에 대한 연결이 끊어지므로 더 이상 FileDescriptor 객체를

       얻을 수 없다

<2> FileDescriptor 객체 사용

   ▣  표준 스트림에 대응되는 바이트나 문자 스트림을 만들고자 할 때 편리하게 사용할 수 있다

 

Tistory 태그: ,

'IT > Language' 카테고리의 다른 글

[javascript] 금액표시/숫자여부체크/replace  (0) 2008.09.20
[java] 날짜 구하기  (0) 2008.09.20
[java] 객체 풀의 동작 원리  (0) 2008.09.20
[JAVA] 문자열중에 한글체크 - getType  (0) 2008.09.20
javacore&heapdump  (0) 2008.09.19

- 처음에는 객체 풀에도 서버에도 아무런 객체가 존재하지 않는다.

- 최초에 클라이언트로부터 요청이 들어오면 객체가 생성 된다.

- 해당 클라이언트가 객체 사용을 완료하면 이 객체는 가비지 컬렉션 되는 것이 아니라 객체 풀에 옮겨진다.

- 객체 풀에서 다른 클라이언트가 요청하기를 기다리며 대기한다.

- 클라이언트가 요청하게 되면 새로운 객체가 생성되는 것이 아니라 객체 풀에 있는 객체를 사용한다.

- 계속해서 이러한 과정을 반복하다가 만일 클라이언트 요청이 많아서 객체 풀에 남아 있는 객체가 없다면 새로이 객체가 만들어 진다.

 

Tistory 태그:

'IT > Language' 카테고리의 다른 글

[java] 날짜 구하기  (0) 2008.09.20
[java] 파일과 디렉토리  (1) 2008.09.20
[JAVA] 문자열중에 한글체크 - getType  (0) 2008.09.20
javacore&heapdump  (0) 2008.09.19
@Override annotation  (0) 2008.09.16

Character라는 클래스에
public static int getType(char ch)
getType이라는 메소드가 문자값을 받아 character category값을 리턴해줍니다.
  String str = "dasjfl1ie ^&*으샤으샤 ㅁㄴ";
  for(int i=0;i<str.length();i++){
     if(Character.getType(str.charAt(i)) == 5) System.out.print("이건한글이넹 :: ");

     System.out.println(str.charAt(i));
  }
이런식으로 값을 찍어보면 한글의 경우는 5를 리턴합니다.

리턴되는 캐릭터 카테고리값들은 static으로 선언되어 있습니다.
COMBINING_SPACING_MARK, CONNECTOR_PUNCTUATION, CONTROL, CURRENCY_SYMBOL, DASH_PUNCTUATION, DECIMAL_DIGIT_NUMBER, ENCLOSING_MARK, END_PUNCTUATION, FORMAT, LETTER_NUMBER, LINE_SEPARATOR, LOWERCASE_LETTER, MATH_SYMBOL, MODIFIER_LETTER, MODIFIER_SYMBOL, NON_SPACING_MARK, OTHER_LETTER, OTHER_NUMBER, OTHER_PUNCTUATION, OTHER_SYMBOL, PARAGRAPH_SEPARATOR, PRIVATE_USE, SPACE_SEPARATOR, START_PUNCTUATION, SURROGATE, TITLECASE_LETTER, UNASSIGNED, UPPERCASE_LETTER

이값들을 체크해서 입력된 문자가 어떤 문자인지 체크가 가능합니다.
그리고 게시판 리스트의 제목을 보여줄때 한글일경우와 영문일 경우를 체크해서
제목테이블 사이즈 만큼 보여주는것도 가능하겠죠...

String message = a_data[i][1];
int sublen = 0;


StringBuffer sbuf = new StringBuffer();
for(int j=0;(j<message.length()&&sublen<35);j++){
         if(Character.getType(message.charAt(j)) == 5) sublen=sublen+2;//한글
         else sublen++;//기타 영문,특수문자,공백
         sbuf.append(message.charAt(j));
}
out.println(sbuf.toString()+"...");
문자열중에 한글의 갯수, 특수문자의 갯수.. 등등 원하는 문자만을 자를수도 있습니다.

정말 좋은 메소드에염.

 

Tistory 태그: ,

'IT > Language' 카테고리의 다른 글

[java] 파일과 디렉토리  (1) 2008.09.20
[java] 객체 풀의 동작 원리  (0) 2008.09.20
javacore&heapdump  (0) 2008.09.19
@Override annotation  (0) 2008.09.16
시간구하기  (0) 2008.09.16

 Heap Dump 및 Javacore 파일 분석에 대한 유용한 정보

이에 우선 AIX 서버 환경에서 운영(Runtime)환경에서 장애가 발생하였을 경우 이를 분석하여 처리할 수 있도록  다음의 파일들을 생성하여 주고 있습니다.

- Javacore 파일
- Heap Memory Dump 파일


여기에서 이 두 파일들을 분석하여 비주얼하게 SE나 개발자가 분석할 수 있도록 도와주는 툴을 소개해 드리려합니다.
이 툴들은 현재 IBM 개발자 사이트에서 제공하여 주고 있으며 상당히 버젼업이 이루어져 사용하는데 용이해 졌습니다.

각 툴들은 아래의 사이트에서 최신버젼을 다운로드 하시면됩니다.  
(별도 로그인이 필요한 관계로 첨부로 각 툴들을 첨부하였습니다.)


HeapAnalyzer for AIX
 ( 최신 버젼: 2.5)
http://www.alphaworks.ibm.com/tech/heapanalyzer


IBM Thread and Monitor Dump Analyzer for Java Technology
( 최신 버젼: 1.5)
http://www.alphaworks.ibm.com/tech/jca


위의 툴들을 다운로드 하셨으면 각 압축을 푸시면 안에 readme.zip 이 각각 있는데 이것도 풀어주시면 readme.html 이 나옵니다.
여기에 화면 캡쳐 이미지들로 사용 방법이 자세히 설명이 되어 있습니다.
대충 보셔도 대략 이해하시는데 어려움은 없으실 것입니다.

 

하지만 바로 실행을 원하시는 분들을 위하여 여기에 실행 명령어를 알려드립니다. (cmd 상에서....)

 

=> heap analyzer
     : java -Xmx1024m -jar ha25.jar
* 메모리를 분석하고자 하는 dump 파일 보다 크게 설정하여 주어야 합니다.

 

=> javacore analyzer
    : java -Xmx256m -jar jca15.jar


Solaris 상에서의 분석 가이드는 다음의 URL에 잘 설명이 되어 있습니다.
여기에서는 Heap Analysis Tool (HAT) 이라는 툴을 사용하는데 IBM에서 제공하는 툴만큼 사용하기에 용이하지는 않습니다.
(heap dump를 뜨는 것 또한 번거로운 점이 있는데 해야되면 해야 되겠지요. ^^ 자세한 사항은 아래 경로에서 확인해 주세요.)

 

사이트 경로 : http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf3.html

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

[java] 객체 풀의 동작 원리  (0) 2008.09.20
[JAVA] 문자열중에 한글체크 - getType  (0) 2008.09.20
@Override annotation  (0) 2008.09.16
시간구하기  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19

 

Annotation은 Java code만으로 전달할 수 없는 부가적인 정보를 컴파일러나 개발툴로 전달할 수 있다. @Override annotationsuper classinterface의method를 override하고 있음을 명시한다. 하지만, 사소한 syntax 실수 등으로 orverride가 구현되지 않는경우가 있는데, 이는 runtime 레벨에서 오작동 등으로 드러나게 되므로 그 원인을 찾기가 쉽지 않다. 여기에@Override annotation을 사용하면 compile 레벨에서 상위 메소드를 정확히 구현하고 있는지를 체크할 수 있다.@Override annotation이 컴파일러에게 Override method임을 알려주기 때문이다.

하지만, @Override annotation을 사용했을 때, must override a superclass method라는 에러가 발생한다면, 컴파일러의 버전을 의심할 필요가 있다. J2Se 5.0, 그러니까 JDK 1.5는 @Overrider annotation을 지원하지만, super class에 대해서 지원할뿐, Interface에 대해서는 지원하지 않는다. Interface에 대한 지원은 JDK 1.6을 사용할 때 가능하다.

Interface의 method를 override하는 경우 @Override annotation을 사용하고 싶다면, JDK 1.6버전(J2SE 6.0)을 사용하도록 하라. 그렇지 않으면, annotation을 지우는 수 밖에.

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

[JAVA] 문자열중에 한글체크 - getType  (0) 2008.09.20
javacore&heapdump  (0) 2008.09.19
시간구하기  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19
EBCDIC 변환  (0) 2008.05.19

#include <time.h>

 

struct tm *today;

 

time(&ltime);

today = localtime(&ltime);

printf("%04d-%02d-%02d %02d:%02d:%02d\n",
today->tm_year + 1900,   // tm_year는 1900을 더해야 서기 연도가 됨
today->tm_mon + 1, // tm_mon은 1월이 0, 2월이 1... 식으로 되어 있음 
today->tm_mday,
today->tm_hour,
today->tm_min,
today->tm_sec);

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

javacore&heapdump  (0) 2008.09.19
@Override annotation  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19
EBCDIC 변환  (0) 2008.05.19
JDK Bit 확인  (0) 2008.02.11

 // 이 함수를 시 delayTime 밀리 초 후에 이 함수를 무사히 빠져나온다..  1000 -> 1초
   public void MatrixTime(int delayTime){

       long saveTime = System.currentTimeMillis();
       long currTime = 0;

       while( currTime - saveTime < delayTime){
           currTime = System.currentTimeMillis();
       }
   }

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

@Override annotation  (0) 2008.09.16
시간구하기  (0) 2008.09.16
EBCDIC 변환  (0) 2008.05.19
JDK Bit 확인  (0) 2008.02.11
[JAVA] 숫자,날짜 포메팅하는 방법  (0) 2007.06.29

 

IBM의 EBCDIC 코드 문자를 자바에서 사용하기 위해서는
Extended Encoding Set (contained in lib/charsets.jar)의 Cp933을 사용합니다.

Cp933 : Korean Mixed with 1880 UDC, superset of 5029

(기존에 c로 EBCDIC을 변화하는 소스를 사용하신 분들은 한탄을 하실겁니다. 너무 간단해서. ^^)

<자바 소스>
=================================================================================

import java.lang.*;
import java.util.*;
import java.io.*;

public class ConvAsc {
public static void main(String[] args) throws Exception {

byte BUFFER[] = new byte[150];

FileInputStream in = new FileInputStream("Host.DAT");

while(in.read(BUFFER) != -1) {

String str = new String(BUFFER,"Cp933"); //Korean Mixed with 1880 UDC, superset of 5029
//String str = new String(aaa,"Cp970"); //AIX

System.out.println("str ==> " + str);
}
}
}

=================================================================================

CP933 을 써보세요.

    // EUC-KR 을 EBCDIC with Hangul 로 바꾸는 예
    byte[] bytes = new String(euckrBytes, "euc-kr").getBytes("CP933");

    // EBCDIC with Hangul 을 EUC-KR 로 바꾸는 예
    byte[] bytes = new String(ebcdicBytes, "CP933").getBytes("euc-kr");


EBCDIC with Hangul <----> EUC-KR 코드 변환
=================================================================================

java1.4에서 지원

1.3이나 1.2에서도 사용하실수 있는데.
사용하실려면.

lib/charsets.jar 를 copy하시고 classpath에 설정 해야함

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

시간구하기  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19
JDK Bit 확인  (0) 2008.02.11
[JAVA] 숫자,날짜 포메팅하는 방법  (0) 2007.06.29
[JSP] 한글 이름 파일 다운로드  (0) 2007.06.29

 AIX JDK BIT 확인

  32bit 의 경우

  PATH=/usr/java14/jre/bin:/usr/java14/bin:$PATH

  java -version
  java version "1.4.2"
  Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2)
  Classic VM (build 1.4.2, J2RE 1.4.2 IBM AIX build ca142ifx-20060209)


  64bit 의 경우
  PATH=/usr/java14_64/jre/bin:/usr/java14_64/bin:$PATH

  java -version
  java version "1.4.2"
  Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2)
  Classic VM (build 1.4.2, J2RE 1.4.2 IBM AIX 5L for PowerPC (64 bit JVM) build caix64142ifx-20060209)

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

java sleep (시간동안 수행)  (0) 2008.05.19
EBCDIC 변환  (0) 2008.05.19
[JAVA] 숫자,날짜 포메팅하는 방법  (0) 2007.06.29
[JSP] 한글 이름 파일 다운로드  (0) 2007.06.29
[JAVA] javac, java 명령어의 옵션  (0) 2007.06.29

+ Recent posts