總網頁瀏覽量

2015年10月29日 星期四

[日常]結膜炎

結膜 是一層近乎透明之薄膜,覆蓋在鞏膜和眼瞼上。
角膜 是一透明無色且沒有血管的組織,由規則排列細胞所構成。

結膜炎 分為細菌性病毒性過敏性結膜炎

1. 細菌性急性結膜炎
會有紅眼、刺痛、燒灼感、分泌物較黏稠等症狀,
若引起角膜病變會伴有畏光現象。

最常見者為葡萄球菌和鏈球菌引起,一般用簡單的抗生素即可治癒。

2. 病毒性急性結膜炎
主要是流行性角結膜炎,常由腺病毒引起,一般症狀是急性發作之紅眼、流淚、分泌物增加和畏光現象,並有眼皮腫和耳前淋巴腺腫大,嚴重時會有結膜下出血和偽膜出現。

治療方式以抗發炎眼藥水來減輕不舒服症狀,一般病程約一至兩星期。但有些病患會有角膜混濁和異物感或畏光等症狀,這些混濁有時會持續幾個月或一兩年才消失。

3. 過敏性結膜炎
因接觸到過敏原引起,如花粉、毛髮、纖毛和塵土等,或者病人本有過敏體質如氣喘和異位性皮膚炎等。症狀為流淚、癢、結膜紅腫,分泌物較清澈。一般可見到結膜紅腫,甚至眼皮也會水腫,但角膜並不受波及。

治療方法可用巨細胞安定劑 Intal 等,比較厲害時可考慮使用短暫類固醇改善急性不適。

春季性和異位性角結膜炎則有較厲害表現,可能產生角膜糜爛或結痂等,而造成畏光和影響視力。一般需用到類固醇才能控制,但須小心使用,注意是否因此導致青光眼產生。

正常的角膜之上有上皮細胞保護不易感染,但當角膜上皮細胞受到損傷時(如外傷、戴隱形眼鏡等),微生物、病菌等會趁機侵入角膜,造成嚴重的角膜炎。一旦角 膜發炎侵入了上皮層底下的 Bowman 膜,則會留下白色混濁不透明的瘢痕,嚴重的角膜發炎引起潰瘍,甚至會導致失明。


流行性角結膜炎的傳染力極強,預防之道在於平時要維持良好的衛生習慣,常用肥皂洗手,並保持乾燥避免用手揉眼睛
要避免角膜炎方法就是要避免角膜有外傷,且在配戴隱形眼鏡有任何不適時,應儘快停止配戴,立即給眼科醫師檢查是否有角膜潰爛。早期診斷早期治療是保護靈魂之窗最好的方法。

https://www.ntuh.gov.tw/OPH/DocLib10/%E7%B0%A1%E4%BB%8B%E7%B5%90%E8%86%9C%E7%82%8E%E5%92%8C%E8%A7%92%E8%86%9C%E7%82%8E.aspx


一、眼睛紅。
二、結膜充血。
三、眼睛分泌物很多。

2015年10月27日 星期二

[Java] Dialog 的範例 showInputDialog

參考資料:
https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

import javax.swing.JOptionPane;

public class Dialog_001{
    public static void main(String args[]){
        String name = JOptionPane.showInputDialog("Name: ","AVC");
        //第二格就變程預設值, 可以字串也可以整數,試了連浮點數都行
        String message = String.format("Welcome, %s, to me",name);
        JOptionPane.showMessageDialog(null,message);
    }
}
 ------------------------------------------------------------------------------------------
 
 ------------------------------------------------------------------------------------------

Icons used by JOptionPane
Icon description Java look and feel Windows look and feel
question The Java look and feel icon for dialogs that ask questions The Windows look and feel icon for dialogs that ask questions
information The Java look and feel icon for informational dialogs The Windows look and feel icon for informational dialogs
warning The Java look and feel icon for warning dialogs The Windows look and feel icon for warning dialogs
error The Java look and feel icon for error dialogs The Windows look and feel icon for error dialogs


showMessageDialog方法中, 針對不同的用途用不同參數來顯示User要顯示的東西.


 import javax.swing.JOptionPane;

public class Dialog_001{
    public static void main(String args[]){
        String name = JOptionPane.showInputDialog("Name: ","Ha");
        String message = String.format("Input is : %s.",name);
        JOptionPane.showMessageDialog(null,message,"Title",JOptionPane.PLAIN_MESSAGE);
    }
}

showMessageDialog 的第三個和第四個參數,
要就都要有, 不然就都不要有,不然會編譯錯誤:
Dialog_001.java:9: error: no suitable method found for showMessageDialog(<null>,String,String)
        JOptionPane.showMessageDialog(null,message,"Title");
                   ^
    method JOptionPane.showMessageDialog(Component,Object) is not applicable
      (actual and formal argument lists differ in length)
    method JOptionPane.showMessageDialog(Component,Object,String,int) is not applicable
      (actual and formal argument lists differ in length)
    method JOptionPane.showMessageDialog(Component,Object,String,int,Icon) is not applicable
      (actual and formal argument lists differ in length)
1 error

第三個參數代表在按下確定之後,
顯示出來的視窗標題, 不寫的話就只會顯示 Message,
而第四個參數則是表示視窗要用哪種方式顯示.

都沒填就會顯示:








JOptionPane.WARNING_MESSAGE:





JOptionPane.ERROR_MESSAGE:


JOptionPane.PLAIN_MESSAGE:
 

JOptionPane.INFORMATION_MESSAGE,icon

在這裡 icon是第五個參數,
要使用時要先 import javax.swing.ImageIcon ;
用 ImageIcon icon = new ImageIcon("C:\\Documents\\b.jpg");
在參數部分試圖片檔案的完整路徑,
用過jpg跟png都可以.

 


















2015年10月26日 星期一

[Crypto] diceware 密碼生成器 概念

在 https://share.inside.com.tw/posts/20241 的報導,
說一個小女孩利用diceware 產了密碼來賣人,
一組密碼 每個 2 美元.

理面對於 Diceware 解釋是講

Diceware 是一個有著幾十年曆史的生成密碼的方式。它的操作方法是擲六個面的骰子來隨機生成數字,數字會對應一串字符。這些字合併成一個無意義的字符串(大概像這樣 ample banal bias delta gist latex),因為是隨機的所以非常難破解。不過這個口令對人們來說又很容易記住。


有點不太知道在講啥, 所以另外查了一下資料
https://www.v2ex.com/t/106491

diceware 的想法是这样的, 用字母数字和标点组合的密码实在是很难记,用简短的单词反而好记。diceware.com 提供了一个66666个单词的列表, 每 个单词用数字标上序号, 然后你用骰子连掷5次得到一个数字, 比如 12345, 然后就在表中查到相应的单词apathy。然后再掷骰子5次,得到第 二个单词, 你自己决定要几个单词,一般推荐是6个单词以上。 这样就得到一个长达20个字母的密码。 虽然看上去这跟我们的“常识”相反:不是说不要用 字典里的单词吗,这说的是只用一个单词的情况。 但即使黑客知道你在使用diceware,要算出你的密码也是很困难的, 比如用6个单词,就有 66666^6种可能,比一般的短密码要可靠,而且好记。

上面這個比較清楚一點,
先擲一個均勻的骰子5次得到一個長度為5的整數, 每個整數在對應到一個單字簿上可以得到一個單詞, 如果不夠常, 在多坐幾次.

像這樣吧 我猜 顆

骰子擲五次 -> 12345
f(12345) -> apathy

但是以上面的說法, 應該只有5^5種方法阿...
至於登入網站的密碼長度限制, 反正太少就多做幾次就好,

網站底下在Q&A種也提到
差别是diceware 生成的單詞的目的有兩個:
第一整個password要夠長
第二單詞要比隨機的字母组合好記

但是第二點來看, 比隨機好記就是不夠隨機,
所以還是一樣有優點有缺點的.

[Java] GUI 圖形化界面 Dialog1

GUI Graphical User Interface

用對話框 dialog boxes (dialog) 顯示資料.
通常是用來顯示重要訊息用.

JOptionPane 是一個已經有簡略且完整的 dialog 類別

JOptionPane 是 javax.swing套件中的類別.
javax.swing套件中包含了許多建構 GUI 應用程式的類別.

//Fig.  3.17:Dialog1

import javax.swing.JOptionPane; //import class JOptionPane

public class Dialog1{
    public static void main(String args[]){
        JOptionPane.showMessageDialog(null,"AS");
    } //end main
} // end Dialog1

JOptionPane類別中的showMessageDialog方法是一個(static method),
所以User不用自行呼叫函式,

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

現在分兩部分, 輸入跟輸出分開,
輸入畫面稱為 input  dialog 輸入對話框, 讓User輸入資料.

JOptionPane類別的 showInputDialog() 方法會顯示使用者輸入文字的欄位,
而 showInputDialog() 的引數就是要在對話框中顯示的提示詞,
一般用來告知使用者要輸入的資料.

其中在對話框中 User 所輸入的就是一串字元, 所以不是整數歐 !
然後以字串方式傳回, 並儲存在 name 變數中.
其中如果最後按下的鍵為 取消 Cancel button 則會以 null 回傳.

之後用 String 類別的 format() 靜態方法,
回傳經過格式化的字串, 而非顯示在 cmd 中.

//Fig.  3.17:NameDialog

import javax.swing.JOptionPane;

public class NameDialog{
    public static void main(String args[]){
        String name = JOptionPane.showInputDialog("Name: ");
        System.out.println("name: "+name);
        String message = String.format("Welcome, %s, to me",name);
        System.out.println("message: "+message);
        JOptionPane.showMessageDialog(null,message);
    }
}
----------------------------------------------------------------------------------------------------

在輸入時打入 HW                    顯示畫面 


 

在裡面加了兩行 System.out.,println

name: GGGG
message: Welcome, GGGG, to me

----------------------------------------------------------------------------------------------------

如果把
String message = String.format("Welcome, %s, to me",name);
換成
int message = String.format("Welcome, %s, to me",name);

就會跑出例外出來

NameDialog.java:7: incompatible types
found   : java.lang.String
required: int
                int num = JOptionPane.showInputDialog("num: ");
                                                     ^

Because showInputDialog just return type of string.


所以要利用轉型, 把字串轉型成整數型態,
Integer.parseInt(String s)

parseInt() 方法是一個 String 類別的靜態方法,
其中如果給了一個不是整數的字串,
就會發生例外錯誤.

以下是小小修改的範例:

import javax.swing.JOptionPane;

public class NameDialog{
    public static void main(String args[]){
        String name = JOptionPane.showInputDialog("Name: ");
        System.out.println("name: "+name);
        String old = JOptionPane.showInputDialog("oldnum : ");
        int oldnum = Integer.parseInt(old);
        System.out.println("oldnum: "+oldnum);   
        String message = String.format("Welcome, %s, to me\n You are %d year old",name,oldnum);
        System.out.println("message: "+message);
        JOptionPane.showMessageDialog(null,message);
    }
}

如果 old 不是給整數, parseInt() 會跳出例外訊息.
name: A
Exception in thread "main" java.lang.NumberFormatException: For input string: "A
"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
        at java.lang.Integer.parseInt(Integer.java:449)
        at java.lang.Integer.parseInt(Integer.java:499)
        at NameDialog.main(NameDialog.java:8)


參考Java 程式設計藝術

[Java] Ex.65

Ex.65

import java.util.*;

public class WrappedString {
    private String s;
    public WrappedString(String s ) {
        this.s = s;
    }
    public static void main(String args[]){
        HashSet<Object> hs = new HashSet<Object>();
        WrappedString ws1 = new WrappedString("aardvark");
        WrappedString ws2 = new WrappedString("aardvark");
        String s1 = new String("aardvark");
        String s2 = new String("aardvark");
       
        hs.add(ws1);
        hs.add(ws2);
        hs.add(s1);
        hs.add(s2);
        System.out.print(hs.size());
       
    }
}

---------------------------------
output is 3
---------------------------------


import java.util.*;

public class WrappedString {
    private String s;
    public WrappedString(String s ) {
        this.s = s;
    }
    public static void main(String args[]){
        HashSet<Object> hs = new HashSet<Object>();
        WrappedString ws1 = new WrappedString("aardvark");
        WrappedString ws2 = new WrappedString("aardvark");
        String s1 = new String("aardvark");
        String s2 = new String("aardvark");
       
        hs.add(ws1);
        hs.add(ws2);
        hs.add(s1);
        hs.add(s2);
        System.out.print(hs.size());
       
    }
   
    public boolean equals(Object o){
        if(this.s.equals(((WrappedString)o).s))
            return true;
        else
            return false;
    }
   
    public int hashCode(){
        return this.s.hashCode();
    }

}


---------------------------------
output is 2
---------------------------------

2015年10月22日 星期四

[C] 2-5: 迴圈與測試資料讀取 4 - 檔尾封 File_stern_transom.cpp

2-5: 迴圈與測試資料讀取 4 - 檔尾封

這個題目和前三題的差別在於如何指定輸入資料有幾組案例

請撰寫一個程式運用 stdio 函式庫的 scanf 和 printf 函式讀取測試資料並且計算兩數之和、整數除法的商和餘數、浮點數除法的商, 請練習下列迴圈控制

    nitems = scanf(...); // 讀入 a 和 b
    while (nitems==2) // 或是 nitems != EOF
    {
        ...
        nitems = scanf(...); // 讀入 a 和 b
    }

請注意:

  1. 下面的測試用範例中, 輸入測試資料由第一列開始, 每一列是一個案例, 包含兩個整數, 請讀入此兩個整數資料並且完成指定的運算
  2. 請注意觀察輸出測試資料, 程式需要輸出 n 列, 每一列是一個測試案例的測試結果, (假設 a + b = c, a / b = d, a % b = e, a / b = f) 列印的格式是每一列四個數字 c, d, e, f 以逗點和一個空格隔開, 其中 c, d, e 三個整數都列印在 5 格的欄位中, 浮點數 f 列印在 10 格的欄位中, 小數點後印 5 位數字
  3. 在你自己機器上測試時有兩種方法
  •         執行程式 prog.exe, 輸入資料, 按 <ctrl>-Z <enter>
  •         編輯一個資料檔案 test.txt, 打開 cmd.exe 視窗, 執行 prog < test.txt 或是 cat test.txt | prog 
  1. 另外你也可以練習運用 stdio 的 feof(stdin) 函式測試輸入是否已經結束, 試試看能不能來取代 while (nitems==2) 的測試, 如果執行前一個輸入指令時發現串流已經結束, 接下來的 feof() 函式會回傳 1 代表串流已經結束, 在你自己的機器應該是可以運作的, 不過因為 e-Tutor 是線上的測試系統, 他不接受檔案操作的相關命令, 例如 fopen, fclose, fflush 所以 feof 有可能也不接受





輸入測試資料:

73 56↵
28 27↵
185 30↵
1412 345↵
210 -75↵
-3123 -4215↵
-4703 1014↵
輸出測試資料:
  129,     1,    17,    1.30357↵
   55,     1,     1,    1.03704↵
  215,     6,     5,    6.16667↵
 1757,     4,    32,    4.09275↵
  135,    -2,    60,   -2.80000↵
-7338,     0, -3123,    0.74093↵
-3689,    -4,  -647,   -4.63807↵
 

 ----------------------------------------------------------------

 #include <stdio.h>
#include <stdlib.h>
int main(void) {

    int a=1, b=1;  
    int nitems = scanf("%d %d%*[^\n]",&a,&b);
    while (nitems!= EOF) // a 和 b 為前一列 scanf 讀入的資料
    {
        int add=0, div=0, mid=0;
        float div2=0.0;
        printf("%5d,%6d,%6d,%11.5f\n",add = a+b, div = a/b, mid = a%b, div2 = (float)a/b);
        nitems = scanf("%d %d%*[^\n]",&a,&b);
    }

    return 0;
}





 ----------------------------------------------------------------


nitems!= EOF

EOF很像是-1, 而scanf輸出的值則是 一個整數,表示輸入的參數數量,
而如果使用feod可以參考
http://yume-o-tsukamu.blogspot.tw/2013/03/cfeof.html




2015年10月21日 星期三

[C] 2-4: 迴圈與測試資料讀取 3 - 零尾封 Zero_tail_closure.cpp

2-4: 迴圈與測試資料讀取 3 - 零尾封


這個題目和前兩題的差別在於如何指定輸入資料有幾組案例

請撰寫一個程式運用 stdio 函式庫的 scanf 和 printf 函式讀取測試資料並且計算兩數之和、整數除法的商和餘數、浮點數除法的商, 請練習下列迴圈控制

    scanf(...); // 讀入 a 和 b
    while (!((a==0)&&(b==0))) // a 和 b 為前一列 scanf 讀入的資料
    {
        ...
        scanf(...); // 讀入 a 和 b
    }

請注意:
  1. 下面的測試用範例中, 輸入測試資料由第一列開始, 每一列是一個案例, 包含兩個整數, 請讀入此兩個整數資料並且完成指定的運算
  2. 最後一列不是測試案例, 兩個整數 0 0 代表測試案例的結束
  3. 請注意觀察輸出測試資料, 程式需要輸出 n 列, 每一列是一個測試案例的測試結果, (假設 a + b = c, a / b = d, a % b = e, a / b = f) 列印的格式是每一列四個數字 c, d, e, f 以逗點和一個空格隔開, 其中 c, d, e 三個整數都列印在 5 格的欄位中, 浮點數 f 列印在 10 格的欄位中, 小數點後印 5 位數字









輸入測試資料:

73 56↵
28 27↵
185 30↵
1412 345↵
210 -75↵
-3123 -4215↵
-4703 1014↵
0 0↵
輸出測試資料:
  129,     1,    17,    1.30357↵
   55,     1,     1,    1.03704↵
  215,     6,     5,    6.16667↵
 1757,     4,    32,    4.09275↵
  135,    -2,    60,   -2.80000↵
-7338,     0, -3123,    0.74093↵
-3689,    -4,  -647,   -4.63807↵
 

---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
int main(void) {

    int a=1, b=1;   
    scanf("%d %d%*[^\n]",&a,&b);
    while (!((a==0)&&(b==0))) // a 和 b 為前一列 scanf 讀入的資料
    {
        int add=0, div=0, mid=0;
        float div2=0.0;
        printf("%5d,%6d,%6d,%11.5f\n",

        add = a+b, div = a/b, mid = a%b, div2 = (float)a/b);
        scanf("%d %d%*[^\n]",&a,&b);
    }
    return 0;
}


--------------------------------------------------------------------------- 


要說要注的東西應該是scanf放置位置吧

http://140.116.249.152/e-Tutor/mod/programming/view.php?a=12711

[C] 2-3: 迴圈與測試資料讀取 2 - 起手數 Number_of_hands_2.cpp

這個題目基本上和前一題幾乎是一樣的, 唯一不一樣的地方是輸入資料的格式, 每一列的兩個整數資料之後一直到那一列的結尾是一些說明文字 (很多時候輸入資料和撰寫程式是不同的人, 輸入資料可能是用一個編輯器直接編輯檔案, 這個時候如果只有一堆數字, 很容易輸入錯誤, 所以常常在製作資料檔案的時候希望檔案裡有一些額外的說明文字, 可以使得人可以比較輕鬆地檢查資料), 這些說明文字是你的程式需要運用 scanf 的功能 跳過去不要處理的

請撰寫一個程式運用 stdio 函式庫的 scanf 和 printf 函式讀取測試資料並且計算兩數之和、整數除法的商和餘數、浮點數除法的商, 請練習下面的迴圈控制

    scanf(...); // 讀取案例個數至整數變數 n
    for (i=0; i<n; i++)
    {
        ...
    }

請注意:

    下面的測試用範例中, 輸入測試資料的第一列為一個整數 n, 代表接下來有 n 個測試案例
    每一列是一個案例, 包含兩個整數, 請讀入此兩個整數資料並且完成指定的運算, 這兩個數字之後一直到這一列的結束是程式不需要的註解
    請注意觀察輸出測試資料, 程式需要輸出 n 列, 每一列是一個測試案例的測試結果, (假設 a + b = c, a / b = d, a % b = e, a / b = f) 列印的格式是每一列四個數字 c, d, e, f 以逗點和一個空格隔開, 其中 c, d, e 三個整數都列印在 5 格的欄位中, 浮點數 f 列印在 10 格的欄位中, 小數點後印 5 位數字

輸入測試資料:

7↵
73 56 this the first set of data↵
28 27     這是第二組測試案例↵
185 30the third↵
1412 345 )*&^&(^ (*&^↵
210 -75↵
-3123 -4215    both negative↵
-4703 1014↵
輸出測試資料:
  129,     1,    17,    1.30357↵
   55,     1,     1,    1.03704↵
  215,     6,     5,    6.16667↵
 1757,     4,    32,    4.09275↵
  135,    -2,    60,   -2.80000↵
-7338,     0, -3123,    0.74093↵
-3689,    -4,  -647,   -4.63807↵
 
---------------------------------------------------- 
 
#include <stdio.h>
#include <stdlib.h>
int main(void) {

 int n, i, a, b; 
 scanf("%d",&n);
 for(i = 0 ; i < n ; i++){
  scanf("%d %d%*[^\n]",&a,&b);
  int add=0, div=0, mid=0;
  float div2=0.0;
  printf("%5d,%6d,%6d,%11.5f",add = a+b, div = a/b, mid = a%b, div2 = (float)a/b);
   printf("\n");
 }
 return 0;
}


----------------------------------------------------
 
這裡比較特別的式正規表示法,
scanf("%d %d%*[^\n]",&a,&b);
中的 %*[^\n] 表示從前一個輸入之後到換行符號出線為止都不列入input中.

[C] 2-2: 迴圈與測試資料讀取 1 - 起手數 Number_of_hands

請撰寫一個程式運用 stdio 函式庫的 scanf 和 printf 函式讀取測試資料並且計算兩數之和、整數除法的商和餘數、浮點數除法的商, 請練習下面的迴圈控制
    scanf(...); // 讀取案例個數至整數變數 n
    for (i=0; i<n; i++)
    {
        ...
    }
 

  1. 下面的測試用範例中, 輸入測試資料的第一列為一個整數 n, 代表接下來有 n 個測試案例
  2. 每一列是一個案例, 包含兩個整數, 請讀入此兩個整數資料並且完成指定的運算
  3. 請注意觀察輸出測試資料, 程式需要輸出 n 列, 每一列是一個測試案例的測試結果, (假設 a + b = c, a / b = d, a % b = e, a / b = f) 列印的格式是每一列四個數字 c, d, e, f 以逗點和一個空格隔開, 其中 c, d, e 三個整數都列印在 5 格的欄位中, 浮點數 f 列印在 10 格的欄位中, 小數點後印 5 位數字
  4. 請特別注意觀察整數除法 a / b 和餘數 a % b 在 a 或是 b 為負數時的結果
  5. 因為開始練習迴圈, 提交程式就有限定執行時間, 否則萬一你的迴圈不結束, 就很浪費系統資源了
輸入測試資料:

7↵
73 56↵
28 27↵
185 30↵
1412 345↵
210 -75↵
-3123 -4215↵
-4703 1014↵
 

輸出測試資料:

  129,     1,    17,    1.30357↵
   55,     1,     1,    1.03704↵
  215,     6,     5,    6.16667↵
 1757,     4,    32,    4.09275↵
  135,    -2,    60,   -2.80000↵
-7338,     0, -3123,    0.74093↵
-3689,    -4,  -647,   -4.63807↵
 
------------------------------------------------------------ 
Number_of_hands.cpp
 
#include <stdio.h>
#include <stdlib.h>
int main(void) {

 int n, i, a, b; 
 scanf("%d",&n);
 for(i = 0 ; i < n ; i++){
  scanf("%d%d",&a,&b);
  int add=0, div=0, mid=0;
  float div2=0.0;
  printf("%5d,%6d,%6d,%11.5f\n",add = a+b, div = a/b, mid = a%b, div2 = (float)a/b);
 }

 return 0;
}
 
------------------------------------------------------------ 
 
 
該注意的就是, 第一筆資料後的小數點位置,
因為會把前一個數字的 "," 算進去, 所以後面顯示的時候要多加一位才可以.


題目來源
http://140.116.249.152/e-Tutor/mod/programming/submit.php?a=12709 

[Java] 移動檔案

日常生活中的小小實做,
依照日期把檔案分類到專屬的資料夾中.

程式很簡單但是卻寫了一整天 = = ,
分三部分, 第一部分 main 就是定資料夾, 在用第二部分的 print 印出來,
印的同時利用第三部分 settime 把每個檔案的建立時間顯示出來, 以方便做比較,
在比較建造日期後, 比對成功就呼叫第四部分, 把檔案移至對應的資料夾中.

可以在改進的地方應該是,
1. 把輸入目前路徑, 目標路徑, 單獨列出讓使用者好修改
2. 日期借面 A日到B日的檔案坐轉移
3. 函式寫得很醜, 可以在改進囉~


import java.io.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class File_mvoe_2{
    public static void main(String args[])throws IOException{
        String path = "M:\\FTP";   
        File f = new File(path);
        print(f,1,path);
    }
   
    private static void print(File f, int level,String path){
        String pl = "";
        for(int i = 0 ; i < level ; i++){
            pl +="\t";
        }
       
        File[] child = f.listFiles();
        for(int i = 0; i < child.length ; i++){
            String s = child[i].getName();
           
            settime(path,s);
            if(child[i].isDirectory()){
                path = path +"\\"+ child[i].getName();
                print(child[i], level+1, path);
            }
        }
    }
   
    private static void settime(String inputpath, String name){
       
        try{
            File file = new File(inputpath+"\\"+name);
           
            Calendar c = Calendar.getInstance();
            c.setTimeInMillis(file.lastModified());
           
            Path path = Paths.get(inputpath+"\\"+name);
            BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
           
            c.setTimeInMillis(attrs.creationTime().toMillis());
            String da = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
            //System.out.println("DA: "+da);
           
            int i = 0;
            if(da.equals("2015-10-21") ){
                move(inputpath, name, i);
            }

        }catch(IOException e){
            e.printStackTrace();
        }
    }
   
    private static void move(String inputpath, String name, int i ){
        File source = null;
        File destFile = null;
        File directory = null;
        boolean rt = false;
       
        try{
            source = new File(inputpath+"\\"+name);
            String Target = "M:\\ftp TMP\\08.21";   
            directory = new File(Target);
            if(!directory.isDirectory()){
                directory.mkdirs();
            }
            destFile = new File(Target+"\\"+name);
            rt = source.renameTo(destFile);
            //System.out.println("rt: "+rt+" : "+name);
        }catch(Exception e){
           
        }
       
    }
   
}



參考資料:
顯示基本資料
http://bioankeyang.blogspot.tw/2015/01/java.html
顯示資料夾資料
http://ced425.pixnet.net/blog/post/3368206-java.io.file%E9%A1%9E%E7%B7%B4%E7%BF%92
移動資料
http://blog.csdn.net/lfdfhl/article/details/8302605


這是比較簡單的檔案移動程式

 import java.io.*;

public class File_mvoe{
    public static void main(String args[]){
        File source = null;      //  想要移動的檔案
        File directory = null;   // 想要移動到的目的地資料夾
        File destFile = null;    //  移動過去的資料夾路徑+檔案名稱(可以自取)
        boolean rt = false;
      
        try{
            source = new File("M:\\A\\DCS-9202009010502073601.jpg");
            directory = new File("M:\\B");
            destFile = new File("M:\\B\\DCS-9202009010502073601.jpg");
            //判斷目標資料夾是否存在, 不存在就建立新的
            if (directory.isDirectory()) {
             System.out.println("Directory is exist.");
            }else{
                directory.mkdirs();
                System.out.println("Directory is not exist, so creat .");
            }
          
           // 要移動的檔案是不是存在
            if(source.exists()){
                System.out.println("File is exists");
            }else{
                System.out.println("File is not exists");
            }
          
            // 用rename 方法移動檔案, 會回傳booblean 回去, 才知道是不是有移動成功
            rt = source.renameTo(destFile);
            System.out.println("File renamed: "+ rt); 
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}   

[Java] 顯示指定資料夾下的檔案和資料夾

參考資料:
http://ced425.pixnet.net/blog/post/3368206-java.io.file%E9%A1%9E%E7%B7%B4%E7%BF%92

import java.io.*;

public class File_Print{
    public static void main(String args[]){
        File f = new File("c:\\Documents");
        System.out.print("Directory Name: "+f.getName()+"\n");
        print(f,1);
    }
   
    private static void print(File f, int level){
        String pl = "";
        for(int i = 0 ; i < level ; i++){
            pl +="\t";
        }
       
        File[] child = f.listFiles();
        for(int i = 0; i < child.length ; i++){
            String s = child[i].getName();
            System.out.println(pl+" ("+s+")");
            if(s.equals("a.java")){
                File fc = child[i];
                File toFile = new File("C:\\Documents\\abcd"+"\\"+"child[i].getName()");
                fc.renameTo(toFile);
                System.out.println("-------------------------------------------------");
            }
            if(child[i].isDirectory()){
                System.out.print("*");
                print(child[i], level+1);
            }
        }
    }
}

[Java] File_move 檔案移動

import java.io.*;

public class File_mvoe{
    public static void main(String args[]){
        File source = null;
        File directory = null;
        File destFile = null;
        boolean rt = false;
       
        try{
            source = new File("c:\\Documents\\abcda\\803_009_5jg.jpg");
            directory = new File("c:\\Documents\\abcda\\phone");
            destFile = new File("c:\\Documents\\abcda\\phone\\803_009_5jg.jpg");
           
            //判斷資料夾是否存在, 不在則新增一個
            if (directory.isDirectory()) {
             System.out.println("Directory is exist.");
            }else{
                directory.mkdirs();
                System.out.println("Directory is not exist, so creat .");
            }
           
            //判斷要移動的檔案是否存在
            if(source.exists()){
                System.out.println("File is exists");
            }else{
                System.out.println("File is not exists");
            }
           
            // 用rename移動檔案, 移動結果會回傳一個boolean值
            rt = source.renameTo(destFile);
            System.out.println("File renamed: "+ rt);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

source = new File("c:\\Documents\\abcda\\803_009_5jg.jpg");
要移動的檔案, 連同路徑一起寫入
directory = new File("c:\\Documents\\abcda\\phone");
要移至的資料夾 , 以便接下來判斷資料夾是否存在
destFile = new File("c:\\Documents\\abcda\\phone\\803_009_5jg.jpg");
要移入的資料夾, 檔案名稱要相同, 路徑一樣要寫上