이번에는 Java의 예외 처리에 대해서 말씀 드리겠습니다. 

 

우선 예외 처리라는 것은

 

프로그램이라는 것이 오류가 날수 도 있습니다. 

 

이 오류에 대응하는 처리입니다. 

 

예를 들면 Database에 접속하는데 실패하면 어떻게 할 것인가?

 

SQL 문에서 오류가 나면 어떻게 할 것인가?

 

원하는 파일이 해당 위치 없다면 어떻게 할 것인가?

 

같은 내용입니다. 

어제 Thread.sleep 를 알려 드리면서 

 

ymmedia.tistory.com/192?category=868738

 

위 문서에서 try catch 문이 나와 있습니다. 

 

try {

...1

} catch (Exceptoin e) {

...2

} finally {

...3

}

 

위 코드 1번에서 예외 발생이 가능한 실행문을 

 

위 코드 2번에는 오류 났을 때 실행문을

 

위 코드 3번에는 이프로그램을 실행하고 오류가나도 때려죽어도 해야할 문장을 적으시면 됩니다. 

 

5초마다 Hello 를 실행하는 프로그램을 만들겠습니다. 

 

무한루프로 만들겠습니다. 

 

무한루프를 만들고 100번째 쯤에 Exception 을 발생 시켜서 Thankyou를 찍고 나가도록 만들어 보겠습니다. 

 

package kr.ymmedia.TestProject;

public class App 
{
    public static void main( String[] args )
    {
        
    	
    	
    	try {	
    		
    		System.out.println("Hello ..");
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			System.out.println("Exit....");
		} finally {
			
			System.out.println("Thank you");
			
		}
    }
}

 

어제에 이어서 코드를 확장하면 대충 위와 같습니다. 

 

위와 같이 하면 무한 루프는 아니고 Hello를 찍고 무조건 Thank you 를 찍고 끝납니다. 

 

package kr.ymmedia.TestProject;

public class App 
{
    public static void main( String[] args )
    {
        
    	
    	
	    	try {	
	        	/* 무한 Loop */
	    		int i=0;
	        	for(;;) {
	        		
	        		System.out.println("Hello .." + i);
	        		i++;
	        		if(i == 50) {
	        			throw new Exception();
	        		}
	        		Thread.sleep(1000);
	        		
	        	}
	        	
			} catch (Exception e) {
				System.out.println("Exit....");
			} finally {
				
				System.out.println("Thank you");
				
			}
    	
    	
    }
}

자 새로운 코드는 위와 같습니다. 

저렇게 하면 무한루프가 돕니다. 

 

Hello ..25
Hello ..26
Hello ..27
Hello ..28
Hello ..29
Hello ..30
Hello ..31
Hello ..32
Hello ..33
Hello ..34
Hello ..35
Hello ..36
Hello ..37
Hello ..38
Hello ..39
Hello ..40
Hello ..41
Hello ..42
Hello ..43
Hello ..44
Hello ..45
Hello ..46
Hello ..47
Hello ..48
Hello ..49
Exit....
Thank you

C:\dev\eGovFrameDev-3.7.0-64bit\workspace\TestProject\target\classes>

위코드를 실행하면 중간에 오류가 났고 Thank you는 무조건 찍어 주고 있습니다. 

 

그리고 첫번째 코드에서는 InterruptedException 이라고 명시해 주었지만, 두번재 코드에서는 Exception e 로 범용적인 것으로 썼습니다. 

 

예외는 명시적으로 발생시켜 주는 것이 좋습니다. 

 

하지만, 범용적인 Exception 이 편합니다. ㅎㅎㅎ

 

발생할수 있는 예외처를 고려 할 수 있다면, 보통 eclipse 가 추천해 줍니다. 

 

명시하면되고, 아무래도 여기서는 오류가 날것 같아 하면, Exception 을 사용하시면 됩니다. 

 

즐거운 하루 되십시오.

 

감사합니다. 

 

 

오늘 이야기할 내용은 프로그램의 실행시에 중간에 잠시 멈출 경우에 사용하는 함수입니다. 

 

package kr.ymmedia.TestProject;

public class App 
{
    public static void main( String[] args )
    {
        
    	
    	
    	try {	
        
			Thread.sleep(1000);
            
		} catch (InterruptedException e) {
        
			System.out.println("error");
            
		}
    }
}

 

위와 같이 사용하시면 됩니다. 

 

Thread.sleep(1000) 에서 1000은 밀리초 이기 때문에

 

1000초가 1초 입니다. 

 

따라서 10초는 10000초가 됩니다. 

 

우리가 생각하는 초 * 1000 하시면 일반적인 초가 됩니다. 

 

반대로 0.5초를 생각하시면 500을 넣으시면 됩니다. 

 

0.01초도 가능 합니다. 10으로 하시면 됩니다. 

 

정말 짭은 시간을 표현하기 위해서 자바는 밀리초를 사용하고 있는 것 같습니다. 

 

오늘도 즐거운 하루 되십시오.

 

double rnd = Math.random();

위코드는 0~1 사이 값을 렌덤으로 만들어 줍니다. 

 

제가 필요로 하는 것은 0~100000 사이 숫자를 random으로 만들어 주는 것이었습니다. 

 

import java.util.Random;

public class RandomTest {

	public static void main(args[]) {
    
    	Random rnd = new Random();
        
        //정수형을 리턴 할 것이기 때문에 nextInt()를 사용.
        
        int iRnd = rnd.nextInt(100000);
        
        System.out.println(iRnd);
    
    }

}

 

위와 같이 하면 Random 함수에서 원하는 값을 뽑을 수 있습니다. 

 

까먹지 말자는 취지에서 적습니다. 

 

참고 사이트 : securityspecialist.tistory.com/14

 

자바(JAVA) 랜덤(Random)값 사용 하기

랜덤값이란? 사용자가 임의적으로 값을 입력하는 것이 아니라 컴퓨터가 무작위로 값을 입력해 주는 것입니다. 자바에서 사용하는 랜덤값 이용방법을 알아보겠습니다. 자바에서 랜덤값을 이용��

securityspecialist.tistory.com

 

 

오늘의 개발일지 2020년06월11일 Java 파일(File) 이동(Move) 시키기 예제(Example)

안녕하세요 가야태자(@talkit) 입니다. 오늘은 Java에서 파일을 이동 시키는 것에 대해서 알아보도록 하겠습니다.

참고 출처 : https://huskdoll.tistory.com/304

실제로, 제가 앞에서 작성한 프로그램을 분석을 끝냈습니다. 그런데 문제는 뒤에 저 파일에 대한 분석을 또해야 하는 문제가 발생을 했습니다. T.T

그래서 이번에는 로그에 Founded 를 넣어서 찾으면 그 풀 Path를 가지고 있게 만들었습니다.

저 URL의 예제는 파일을 이동 시키는 코드만 있습니다.

그런데, 제예제는 파일을 한줄씩 읽고, 읽을 파일을 분석해서 이동 시키는 에제 입니다.

우선 제가 원하는 파일을 제대로 이동 시키는지를 보기 위해서 출력만 하는 소스 입니다.

package kr.ymmedia.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class SearchDEMMove {

    static List<File> targetFiles = null;

    static String baseFile = "/data01/ICECWRF/logs/SearchDEMLAT.log";    //분석할 로그 파일
    public static void main( String[] args ) throws Exception
    {

            BufferedReader br = null;

            // 분석할 로그파일을 읽음.
            br = new BufferedReader(new FileReader(new File(baseFile)));



            String line = "";

            //각 파일의 한 라인씩 읽어들인다.
            while((line = br.readLine()) != null) {

                //lins 을 " : " 구분해서 이동 시킬 파일 찾기

                String[] arrText= line.split(":");

                if(!arrText[0].trim().equals("Processing")) {

                    System.out.println("move file : " + arrText[2]);

                }

            }
            br.close();
        }

}

한번 돌려 보도록 하겠습니다.

잘돌아 갑니다.

그리고, 이제 실제로 이동하는 코드를 짜봤습니다.

package kr.ymmedia.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class SearchDEMMove {

    static List<File> targetFiles = null;

    static String baseFile = "/data01/ICECWRF/logs/SearchDEMLAT.log";    //분석할 로그 파일
    static String targetFolder ="/data01/LIDAR/gj/result_process/";
    public static void main( String[] args ) throws Exception
    {

            BufferedReader br = null;

            // 분석할 로그파일을 읽음.
            br = new BufferedReader(new FileReader(new File(baseFile)));



            String line = "";

            // 날짜 형식을 String으로 혹은 String을 날짜 형식으로 변환하기 위한 포맷형식이다.
            DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");

             // Calendar형식에서 날짜를 가져온다. 특이점은 Calendar가 singleton 형식이다.
             // Date 값을 가져와서 String으로 변환한다.
             String datestr = format.format(Calendar.getInstance().getTime());
            // 혹시나 해서 현재 시간의 폴더를 만들어서 넣습니다. 


            File dir = new File(targetFolder + "/" + datestr  + "/");
            // 중복 방지를 위해서 폴더를 생성 합니다. 
            if (!dir.exists()) { //폴더 없으면 폴더 생성
                dir.mkdirs();
            }

            //각 파일의 한 라인씩 읽어들인다.
            while((line = br.readLine()) != null) {

                //lins 을 " : " 구분해서 이동 시킬 파일 찾기

                String[] arrText= line.split(":");

                if(!arrText[0].trim().equals("Processing")) {
                    System.out.println(line);
                    System.out.println("move file : " + arrText[2]);
                    // 분석된 파일을 File로 읽어 드립니다.  
                    try{
                    File file = new File(arrText[2].trim());
                    //기존 파일명만 가져옵니다. 
                    String targetFileName = file.getName();

                    System.out.println(targetFolder + "/" + datestr  + "/"  + targetFileName);

                    // 실제로 이동 시킨는 코드 입니다. 

                       if(file.renameTo(new File(targetFolder + "/" + datestr  + "/"  + targetFileName))){ //파일 이동
                            //return filePath; //성공시 성공 파일 경로 return
                        }else{
                            //return null;
                        }

                    }catch(Exception e){
                        e.printStackTrace();
                        // 파일이 없으면 오류를 뿌리기 while 문을 계속 합니다.
                        continue;
                    }



                }




            }
            br.close();
        }

}

그리고, 날짜 형식 관련 소스는 https://nowonbun.tistory.com/502 의 글을 참고 했습니다.

오늘은 여기 까지 입니다.

오늘도 즐거운 하루 되십시오.

감사합니다.

안녕하세요 가야태자(@talkit) 입니다. 오늘도 정규식을 구하기 위해서 다른 분 소스를 참고 했습니다.

출처 : https://offbyone.tistory.com/400

오늘 제가 찾아서 GIS에 넣고자하는 자료는

경도, 위도,높이

자료 형식이 위와 같이 되어 있습니다.

DEM 이라고 해서 디지털 수치 표고 자료 입니다.

저기서 제가 생각한 약 8km 반격의 위경도의 높이만을 찾아야해서 ^^

어제 작성한 프로그램으로 경도 값은 제가 필요 한 값으로 찾아 놓은 상태 입니다.

그런데, 위도 값도 어제 작성한 프로그램을 조금 수정해서 쓰려고 했는데 불행하게도 높이 자료가 35.으로 시작하는 값이 있어서 제가 원하는 위도가 아닌데 파일에 찍히는 것을 확인 했습니다. ^^

그래서 옛날 습관으로 찾은 것이 정규식입니다.

제가 정규식을 설명해도 좋겠지만,

위 주소에 정규식이 잘 정리 되어 있습니다.

단, 오늘 제가 작성한 정규식만 설명 드리겠습니다.

Pattern pattern = Pattern.compile("12[0-9]\\.[0-9]+," + words[j]);

12라는 숫자로 시작해서 한자의 숫자가오고 // 우리나라는 120도대의 경도에 위치해 있습니다.
그리고, 무조건 . 기호가 중간에 오고 그위에 숫자가 연속되다가 제가 입력한 35.14 정도의 값이 오면 파일에 적도록 구현 했습니다.

아래는 Full 소스 입니다.


package kr.ymmedia.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class SearchDEMLAT {

    static List<File> targetFiles = null;

    static String baseDir = "/data01/LIDAR/gj/result";    //검색할 디렉토리
    static String word = "35.14,35.15,35.16,35.17,35.18,35.19,35.20";         //검색할 단어
    static String save = "/data01/LIDAR/gj/result2/lat"; //검색결과가 저장된 파일명

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

        File Dir = new File(baseDir);
        File[] Files = Dir.listFiles();

        //읽어들일 파일 input stream 선언
        BufferedReader br = null;
        String[] words = word.split(",");
        for(int i = 0; i < Files.length; i++){

             //파일이 아닌 경우 continue
            if(!Files[i].isFile()) {
                continue;
            }

          //input stream object 생성
            br = new BufferedReader(new FileReader(Files[i]));
            String line = "";

          //저장할 파일 output stream 생성

            String message = "";
            //각 파일의 한 라인씩 읽어들인다.
            while((line = br.readLine()) != null) {


                //라인 내용중 검색하고자  단어가 하나라도 있으면 파일에 기록한다.

                for(int j=0; j<words.length;j++) {
                    Pattern pattern = Pattern.compile("12[0-9]\\.[0-9]+," + words[j]);

                    Matcher matcher = pattern.matcher(line);

                    //if(line.startsWith("" + words[j])) {

                    if(matcher.find()) {

                        //writer.write(word + "=" + Files[i].getAbsolutePath());
                        //System.out.println(line.trim() + ":" + Files[i].getAbsolutePath());
                        message= message + line.trim() +"\n";
                        continue;

                    }else {
                        //System.out.println("");
                    }
                }
            }
            if(!message.equals("")) {
                System.out.println(i + " : Founded : " + Files[i].getAbsolutePath() );
                PrintWriter writer = new PrintWriter(new FileWriter(save+"_" + i +".txt"));
                writer.write(message);
                writer.flush();
                writer.close();
            }else {
                System.out.println(i + " : No results. : " + Files[i].getAbsolutePath() );
            }


            //input stream close.
            br.close();

            //output stream close.

        }






    }

}

예쁘지는 않지만 도움이 되셨으면 합니다.

감사합니다.

오늘도 즐거운 하루 되십시오.

안녕하세요 가야태자(@talkit) 입니다.

오늘은 java에서 원하는 문자열을 찾는 프로그램을 짤일이 있어서 검색을 했습니다.

출처 : http://blog.naver.com/PostView.nhn?blogId=rararara00&logNo=80054434809&widgetTypeCall=true

일단 원본 프로그램은 위를 참고 했습니다.

아래는 제가 작성한 프로그램 입니다.

package kr.ymmedia.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class SearchDEM {

    static List<File> targetFiles = null;

    static String baseDir = "폴더위치";    //검색할 디렉토리
    static String word = "126.84,126.85,126.86,126.87,126.88,126.89,126.90";         //검색할단어를,로 구분해서 나열
    static String save = "저장위치/result";       //검색결과가 저장된 파일명
                                                                                         // 저장 위치는 미리 만들어 두셔야 합니다. 
                                                                                         // mkdir -p 저장위치

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

        File Dir = new File(baseDir);
        File[] Files = Dir.listFiles();

        //읽어들일 파일 input stream 선언
        BufferedReader br = null;
        String[] words = word.split(",");
        for(int i = 0; i < Files.length; i++){

             //파일이 아닌 경우 continue
            if(!Files[i].isFile()) {
                continue;
            }

          //input stream object 생성
            br = new BufferedReader(new FileReader(Files[i]));
            String line = "";

          //저장할 파일 output stream 생성
            PrintWriter writer = new PrintWriter(new FileWriter(save+"_" + i +".txt"));

            //각 파일의 한 라인씩 읽어들인다.
            while((line = br.readLine()) != null) {


                //라인 내용중 검색하고자  단어가 하나라도 있으면 파일에 기록한다.

                for(int j=0; j<words.length;j++)
                if(line.indexOf(words[j]) != -1) {
                    //writer.write(word + "=" + Files[i].getAbsolutePath());
                    System.out.println(line.trim() + ":" + Files[i].getAbsolutePath());
                    writer.write(line.trim() + ":" + Files[i].getAbsolutePath());
                }
            }

            writer.flush();

            //input stream close.
            br.close();

            //output stream close.
            writer.close();
        }

    }

}

저는 실제로 엄청 많은 파일들 사이에서 원하는 위경도를 뽑아서 다른 파일에 적고 싶어서 이렇게 만들어 있습니다.

현재 보이는 파일은 경도만을 뽑아서 넣고 있습니다.

저기에 또 위도도 검색하는 프로그램이 추가 되면 공개해 보겠습니다.

감사합니다.

오늘도 즐거운 하루 되십시오.

+ Recent posts