2011-03-12 3 views
1

다음 코드를 살펴보고 내가하고있는 일이 분명히 잘못되었거나 이상하다는 것을 알려주고 싶습니다. 나는 단지 일반적인 코딩 조언을 찾고있다. 당신이 옳은 방향으로 나를 가리킬 수 있다면 그것은 위대 할 것입니다.Java 프로그래밍 지침

나는 자바가 처음이다. 나는 다음과 같은 수십 번을 쓰고 다시 썼다. 나는 누군가가 분명히 잘못한 것이 있는지 알아보기를 원합니다.

try { 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

하드 코딩 된 경로와 같은

import net.contentobjects.jnotify.JNotify; 
import net.contentobjects.jnotify.JNotifyListener; 
import java.io.*; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.*; 
import javax.swing.JTextArea; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.JLabel; 

public class FileWatcher implements ActionListener { 
    private JTextArea textArea = new JTextArea(); 
    private JScrollPane pane = new JScrollPane(textArea); 
    private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    private JFrame frame = new JFrame(); 
    private JButton startButton = new JButton("Clear"); 
    private JPanel panel = new JPanel(); 

    public FileWatcher(String path) { 
     Font font = new Font("Arial Unicode MS", Font.PLAIN, 13); 
     this.textArea.setEditable(false); 
     this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     this.frame.add(pane); 
     this.frame.setSize(500, 200); 
     this.frame.setLocation(screenSize.width - 500, screenSize.height - 250); 
     this.frame.setTitle("Monitoring: " + path + "..."); 

     this.textArea.setFont(font); 
     this.frame.add(panel, BorderLayout.SOUTH); 
     startButton.setPreferredSize(new Dimension(450, 20)); 
     this.panel.add(startButton); 
     this.startButton.addActionListener(this); 
     this.frame.setVisible(true);   
    } 

    private void sample(String path) throws Exception { 
     int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED 
       | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED; 
     boolean watchSubtree = true; 
     JNotify.addWatch(path, mask, watchSubtree, new Listener()); 
    } 

    public void actionPerformed(ActionEvent e) { 
     this.textArea.setText("");  
    } 

    public void TouchFile(String fName) { 
     if ((fName.indexOf("Thumbs") == -1) && (fName.indexOf(".rar") == -1) 
       && (fName.indexOf(".part") == -1)) { 
      String TodayDate = ""; 
      String fModifyDate = ""; 
      String line; 
      String line2 = "error"; 
      Calendar calendar = Calendar.getInstance(); 
      SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      File filename = new File(fName); 
      try { 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      TodayDate = dateFormat.format(calendar.getTime()); 
      fModifyDate = dateFormat.format(filename.lastModified()); 
      try { 
       Thread.currentThread().sleep(1000); 

       while ((line2.indexOf("error") != -1) 
         && (!fModifyDate.equals(TodayDate))) { 
        line2 = " "; 
        line = " "; 
//     Process p = 
//     Runtime.getRuntime().exec("C:\\Users\\BLUE\\Documents\\MYDROP~1\\Utils\\WatchFolder\\touch.exe " 
//     + "\"" + fName + "\""); 
        Process p = Runtime.getRuntime().exec("touch.exe " + "\"" + fName + "\""); 
        BufferedReader input = new BufferedReader(
          new InputStreamReader(p.getInputStream())); 
        while ((line = input.readLine()) != null) { 
         line2 = line2 + line; 
         showInfo(line); 
        } 
        input.close(); 
        p.waitFor(); 
       } 
      } catch (Exception err) { 
       err.printStackTrace(); 
      } 
     } 
    } 

    String chopData(String data) { 
     File file = new File(data); 
     String fileName= file.getName(); 
     if (data.indexOf("Touched") != -1) { 
      int tIndex = data.indexOf("Touched"); 
      data = data.substring(0,tIndex+8) + "..." + fileName; 
     } 

     if ((data.indexOf("Touched") == -1) && (data.length() > 70)) { 
      data = data.substring(0, data.indexOf(" ")) + " ... " 
        + data.substring(data.length() - 55); 
     } 
     return data; 
    } 

    public void showInfo(String data) { 
     data = chopData(data); 
     this.textArea.append(data + "\n"); 
     this.frame.getContentPane().validate(); 
     this.textArea.setCaretPosition(this.textArea.getText().length()); 
    } 

    class Listener implements JNotifyListener { 
     public void fileRenamed(int wd, String rootPath, String oldName, String newName) { 
      showInfo("renamed ..." + oldName.substring(oldName.length() - 25) 
        + " -> ..." + newName.substring(newName.length() - 25)); 
     } 

     public void fileModified(int wd, String rootPath, String name) { 
      TouchFile(rootPath + "\\" + name); 
     } 

     public void fileDeleted(int wd, String rootPath, String name) { 
      showInfo("deleted " + name); 
     } 

     public void fileCreated(int wd, String rootPath, String name) { 
      TouchFile(rootPath + "\\" + name); 
      showInfo("created " + name); 
     } 

     void print(String msg) { 
      showInfo(msg); 
     } 
    } 

    public static void main(String[] args) { 

     try { 
      if (args.length > 0) { 
       FileWatcher[] fwArray = new FileWatcher[args.length]; 
       for (int i = 0; i < args.length; i++) { 
        fwArray[i] = new FileWatcher(args[i]); 
        fwArray[i].sample(args[i]); 
       } 

      } else { 
       FileWatcher watcher = new FileWatcher("H:\\download"); 
       watcher.sample("H:\\download"); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


} 

답변

3

블록

FileWatcher("H:\\download"); 

매직 번호

if ((data.indexOf("Touched") == -1) && (data.length() > 70)) { 
     data = data.substring(0, data.indexOf(" ")) + " ... " 
       + data.substring(data.length() - 55); 

최적화되지 않은 수입

import javax.swing.*; 
import javax.swing.JLabel; 
+0

감사합니다. 그 사람들은 좀 훑어 보았지만 지금은 그것을 가지고 있습니다. 당신의 도움을 주셔서 감사합니다. – zincc

2
public void TouchFile(String fName) 

방법 이름이 잘못되었습니다. 첫 번째 문자는 대문자로 사용하면 안됩니다.

TodayDate = dateFormat.format(calendar.getTime()); 

변형 된 이름이 잘못되었습니다. 첫 번째 문자는 대문자로 사용하면 안됩니다.

코드를 작성할 때 일관성이 중요합니다. 표준 규칙을 따르십시오.

+0

고마워요! 나는 조잡했다. – zincc

1

Thread.currentThread().sleep(1000);

Thread.sleep(1000);

!fName.contains("Thumbs")

대신

fName.indexOf("Thumbs") == -1

+0

감사! 나는 그것을 할 수있는 더 좋은 방법이 있어야한다고 생각하고있었습니다. – zincc

1

더 CIA 요원을 작성해야 sses - 1 등급 - 프리젠 테이션, 2 차 I/O 작업. \ 다운로드 : - 패키지를 간단 TouchFile

만들기 방법을 만들고, 별도의 파일에 내부 클래스를 이동 "(경로와 H를 최종 문자열을 생성, 이름 변경

제거 코드, 매직 넘버 댓글을 달았습니다 touchFile에, 작은 부분에 분할 ") 및 텍스트

은 당신이 기대하는이 조건이 아니라고 생각 :

if ((fName.indexOf("Thumbs") == -1) && (fName.indexOf(".rar") == -1) 
    && (fName.indexOf(".part") == -1)) 

더 좋은 방법 :

fName.toLowerCase().endsWith(".rar") ... 
+0

안녕하세요! 다들 감사 해요. 이것은 제가 기대했던 것보다 더 많은 피드백과 충고입니다. – zincc

2

안녕하세요, Zincc, StackExchange에 오신 것을 환영합니다. 그리고 자바에 오신 것을 환영합니다.

스택 교환은 현재 베타에서 특정 사이트를 갖고이 같은 질문에 대해, 당신이보고 싶을 수도 : https://codereview.stackexchange.com/ 또한

내가 정규화 된 클래스 이름을 사용하여 import 문을 사용하는 것이 좋습니다 것입니다 :

import java.awt.Toolkit; 

아니라 좋아 :

import java.awt.*; 

당신 컴파일 과정이 조금 더 많은 시간, 정말 큰 일을 할 것이지만으로 이 기사를 읽고 싶을 수도 있습니다 : Java Performance Tuning

감사합니다! 쥬 타르도

+0

와우, codereviw url에 대한 감사 - 전이 사이트에 대해 몰랐습니다. 놀라운 것 같습니다. – smas

+0

예! 그것은 베타 상태이므로, 만약 당신이 그것을 좋아한다면, 참여하고 참여하십시오! :) – jhurtado

+0

링크 및 제안 주셔서 감사합니다! :) – zincc

1

가변 범위. 변수는 하나의 큰 묶음 C++ 스타일의 맨 위에 모두 사용되지 않는 곳에서 바로 선언해야합니다. chopData()에서 filename은 if 중 하나에서만 사용됩니다. 에서 touchFile 이러한 변수의 대부분은 catch에서 범위를 참조하지 않기 때문에 try {} 내부에서 범위를 지정해야합니다.

일반적으로 잡기 유형 예외는 좋은 생각이 아닙니다. 그것은 여기에 이해 될 지 모르지만 약간의 기괴한 행동으로 이어질 수 있습니다. 다른 버블을 런타임에 놓아서 처리 할 수 ​​있다는 것을 알면 예외를 잡으십시오.

또한 이것을 몇 가지 클래스로 리팩토링하는 것도 고려할 것입니다. 코드를 분리하기 위해 MVC-esque 패턴을 사용하면 패널의 모양과 사용자/파일 시스템 이벤트에 어떻게 반응하는지 정의 할 수 있습니다.

+0

고마워요! 그것들은 모두 위대하다. MVC를 찾아야 만했습니다. 그것은 내가 마음 속에 궁금해하는 것입니다. 나는 현명한 방식으로 코드를 나누고 싶었지만, 최선의 접근 방식이 무엇인지 알지 못했습니다. 감사! – zincc