728x90
반응형

파일 존재여부확인하여 시퀀스번호를 붙이는 유틸


파일 을 복사하여 사용자에게 zip 으로 묶어주는 프로그램을 만들던중 동일한 파일명을 가진 파일에 대한 처리가 필요하여 만들어본 유틸이다.

작업중인 디렉토리에 동일한 파일명이 존재한다면 recursive 하게 메서드를 호출하여 _1,_2,_3 ... 같이 파일명뒤에 시퀀스를 카운트해준다.


테스트 케이스는 아래와 같다. 

test_ - 복사본.txt

test_.txt

test.txt

test_1.txt

_test_1.txt

_.txt

_1.txt

위 와 같은 테스트 형식의 파일이 들어올경우에 대해서도 테스트 가 끝난 코드이므로 일반적인 예에서의 버그는 적을꺼라 보긴하나

추가적으로 버그가 리포팅된다면 소스도 변경하도록하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    /**
     * 동일한 파일명의 파일이 존재하는지 확인하여 존재한다면 파일명 뒤에 "_숫자" 를 
     * 붙이고 "_숫자"가 존재한다면 "_숫자" +1 을 더한값을 재귀적으로 카운트
     * @author digimon1740
     * */
    public static String appendSuffixName(String orgFileName, int seq) {
        String retFileName = "";
        // 파일이 존재하는지 확인한다.
        if (new File(orgFileName).exists()) {
            int plusSeq = 1;
 
            String seqStr = "_" + seq;
            String firstFileName = orgFileName.substring(0,
                    orgFileName.lastIndexOf("."));
            String extName = orgFileName
                    .substring(orgFileName.lastIndexOf("."));
 
            // 만약 파일명에 _숫자가 들어간경우라면..
            if (orgFileName.lastIndexOf("_") != -1
                    && !firstFileName.endsWith("_")) {
                String numStr = orgFileName.substring(
                        orgFileName.lastIndexOf("_") + 1,
                        orgFileName.lastIndexOf(extName));
                try {
                    plusSeq = Integer.parseInt(numStr);
                    plusSeq = plusSeq + 1;
                    
                    retFileName = firstFileName.substring(0,
                            firstFileName.lastIndexOf("_"))
                            + "_" + plusSeq + extName;
                } catch (NumberFormatException e) {
                    retFileName = firstFileName + seqStr + extName;
                    return appendSuffixName(retFileName, ++plusSeq);
                }
                
            } else {
                retFileName = firstFileName + seqStr + extName;
            }
            // 재귀
            return appendSuffixName(retFileName, ++plusSeq);
        } else {
            return orgFileName;
        }
    }


728x90
반응형
728x90
반응형

SWING 개발시 클립보드에 내용을 복사하기 


JAVA 의 Swing 을 이용한 GUI 어플리케이션 개발시 아래의 소스를 응용해 클립보드에 지정한 문자열의 복사가 가능하다


String str = "복사할 문자열";

Toolkit toolkit = Toolkit.getDefaultToolkit();

Clipboard clipboard = toolkit.getSystemClipboard();

StringSelection strSel = new StringSelection(str);

clipboard.setContents(strSel, null);


나같은 경우는 "클립보드에 복사" 라는 버튼을 만들어 그 버튼이 눌렸을 경우에 위의 소스가 동작하게 하였다.

728x90
반응형
728x90
반응형

Runtime 클래스를 이용한 외부파일 실행

개발 업무를 진행하다 보면 특정 배치 모듈이나 버튼을 웹에서 눌렀을때 데몬등이 수행되게 해달라는 요청이 들어올때가 있다.

이때 간단하게 Runtime클래스를 사용하여 외부파일을 실행할수있다.

아래와 같이 커맨드를 인자로 하고 exec() 메서드를 수행하면 외부파일이 실행된다.


1
2
3
4
5
6
7
8
9
10
11
12
  public class {
    public static void main(String arg[]) {
            String[] cmd = new String[2];
             cmd[0] = "sh";
             cmd[1] = "/usr/local/bin/start.sh";
 
           Process p = Runtime.getRuntime().exec(cmd);
    }
  }


몇가지 주의할점이 있다면 외부인자를 받아서 (예: request에 명령어를 담는다던가) 하는 프로그램을 작성하게되면 보안상 취약해질수있으므로 명령커맨드는 하드코딩이나 별도 설정파일로 따로 관리하도록 해야하며 현재 프로그램이 수행중인 

시스템계정으로 작동하기 때문에 리눅스나 유닉스같이 권한에 대한 관리를 하는 OS의 경우 권한이 맞지않으면 

예외가 발생할 수 있다. 

추가로  exec() 메서드의 리턴 타입은 Process 인데 이 를 활용하여 출력된 스트림을 가져올수도 있고 여러가지 

처리가 가능하다.

 

728x90
반응형
728x90
반응형

Lombok 을 이용한 getter,setter 자동생성

우연히 인터넷을 돌아다니던중 http://projectlombok.org/ 이라는 곳을 발견하게 되었다.

내용을 보니 자바의 DTO 혹은 Entity 혹은 Beans 혹은 VO (참 이름도많다..-_-;;;;) 를 만들시에 private 필드를 만들고

@Data 어노테이션만 선언해주면 컴파일시에 자동으로 getter,setter 를 생성해준다고한다. 

음.. 물론 요즘의 IDE들 이클립스나 인텔리J 등은 단축키만 이용해서 getter,setter 를 만들어 주긴 하지만

Lombok 을 이용하면 해당 클래스내에 코드가 일단 줄고 체크나 로직이 들어갈 getter,setter 메소드만 직접 만들어주면 된다고하니

어느정도 유지보수성 과 가독성은 좋아질것같다.

아래의 링크는 Maven 사용시 참고하길바란다.

http://projectlombok.org/mavenrepo/index.html 


- 메이븐 의존성 추가

<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.14.4</version> <scope>provided</scope> </dependency> 

</dependencies>


- DTO 생성

import lombok.Data;

@Data

public class UserDTO {

private String UserId;

private String UserPwd;

private String UserName;

private String UserAddr;

private String UserTelNo;

private String UserEmail;

}


728x90
반응형

+ Recent posts