<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    amp@java

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      99 隨筆 :: 0 文章 :: 228 評(píng)論 :: 0 Trackbacks

    2015年3月10日 #

    當(dāng)年是從CSDN博客遷過(guò)來(lái)的,因?yàn)槟抢锖懿环€(wěn)定,那時(shí)候這里很火的;
    前段時(shí)間發(fā)現(xiàn),Blogjava的登錄頁(yè)面居然沒(méi)有驗(yàn)證碼了,圖片顯示錯(cuò)誤,無(wú)法登錄,預(yù)感這個(gè)地方要涼,只好到處找替代,但沒(méi)找到好用的博客,github是一個(gè)選項(xiàng),但似乎不是很適合做博客。
    現(xiàn)在終于又可以登錄了,不過(guò)首頁(yè)居然只剩一篇文章,我以為數(shù)據(jù)都沒(méi)了,登錄發(fā)現(xiàn)還是有的,不過(guò)太讓人不放心了。
    posted @ 2018-08-18 22:14 amp@java 閱讀(149) | 評(píng)論 (0)編輯 收藏

     昨天下午開(kāi)始,之前用得好好的USB鼠標(biāo),突然不能用了,找到個(gè)PS/2鼠標(biāo),卻發(fā)現(xiàn)主板沒(méi)有鼠標(biāo)的PS/2口,只有鍵盤(pán)的PS/2口,真是奇葩,幸好在用的鍵盤(pán)是PS/2口的,費(fèi)了九牛二虎之力,用鍵盤(pán)操作,Win+R,compmgmt.msc進(jìn)入計(jì)算機(jī)管理,上下箭頭移到設(shè)備管理器,發(fā)現(xiàn)右邊的USB控制器前全是黃色嘆號(hào),嘗試卸載再安裝,卻怎么也裝不上,重新啟動(dòng)發(fā)現(xiàn)鼠標(biāo)在啟動(dòng)Windows前還是亮燈的,但到了顯示W(wǎng)indows徽標(biāo)的時(shí)候燈就滅了,應(yīng)該不是硬件問(wèn)題,而是驅(qū)動(dòng)問(wèn)題。
    為了進(jìn)一步證實(shí)硬件沒(méi)問(wèn)題,找了個(gè)安裝系統(tǒng)的U盤(pán),插進(jìn)去啟動(dòng),能夠正常使用鼠標(biāo),于是目標(biāo)就聚焦在找回驅(qū)動(dòng)上。
    開(kāi)始折騰:
    1、首先是找官方驅(qū)動(dòng)啊,我這電腦是老機(jī),AMD7系列主板,找了半天,這個(gè)主板驅(qū)動(dòng)并沒(méi)有包含USB控制器,因?yàn)閁SB控制器都是Windows自帶的驅(qū)動(dòng),下載了一個(gè)南橋驅(qū)動(dòng),安裝后并沒(méi)有效果;
    2、Windows自帶的驅(qū)動(dòng)原來(lái)都是放在C:\Windows\System32\DriverStore\FileRepository下,USB控制器相關(guān)的驅(qū)動(dòng),就在usbport.inf_amd64_xxxxxxxxxx文件夾里,xxxxxxxxx是一串16進(jìn)制數(shù)字,悲催的是,安裝這個(gè)驅(qū)動(dòng)時(shí)要不提示找不到指定文件,要不說(shuō)第三方INF沒(méi)有簽名;
    3、自己折騰搞不定,找個(gè)軟件吧,第一個(gè)想到的是驅(qū)動(dòng)之家官方的驅(qū)動(dòng)精靈,下載下來(lái)發(fā)現(xiàn)是個(gè)全家桶啊,什么騰訊管家,金山毒霸,瀏覽器首頁(yè)修改一應(yīng)俱全,而且沒(méi)有鼠標(biāo)點(diǎn)擊,用TAB鍵根本移動(dòng)不到取消框,只好默認(rèn)全部安裝了,裝完啟動(dòng),檢測(cè),提示系統(tǒng)自帶驅(qū)動(dòng)缺失,于是回車修復(fù),但每次修復(fù)完,重新檢測(cè)還是那樣,而且沒(méi)有提示USB控制器驅(qū)動(dòng)安裝有問(wèn)題,有些功能用鍵盤(pán)無(wú)法操作,不知道是不是還有哪里可以操作一下,于是又搜了一下,如何用鍵盤(pán)代替鼠標(biāo),居然真的找到了!
    4、按WIN鍵,輸入設(shè)置,回車,打開(kāi)設(shè)置主頁(yè):

    移到“輕松使用”,進(jìn)去后左邊選擇“鼠標(biāo)”,在右邊啟用“使用數(shù)字小鍵盤(pán)在屏幕上移動(dòng)鼠標(biāo)”(按空格鍵開(kāi)關(guān)),最好把三個(gè)開(kāi)關(guān)都打開(kāi),如果沒(méi)有啟用CTRL鍵加速功能,鼠標(biāo)移動(dòng)非常慢:

    好了,現(xiàn)在可以用小鍵盤(pán)移動(dòng)鼠標(biāo)了;
    5、繼續(xù)回到驅(qū)動(dòng)精靈,再次修復(fù),還是不行啊,這個(gè)東西除了帶來(lái)一堆垃圾,什么作用都沒(méi)有!于是把它帶來(lái)的垃圾以及它自己卸載了。
    6、似乎360也有一個(gè)驅(qū)動(dòng)大師,于是就下載了一個(gè),這個(gè)倒是很純潔,但是功能太弱,完全沒(méi)發(fā)現(xiàn)問(wèn)題;
    7、剛才搜索“安裝驅(qū)動(dòng) 找不到指定的文件”時(shí),發(fā)現(xiàn)一個(gè)論壇提到了這個(gè),是驅(qū)動(dòng)人生的論壇,好像還有解決方案,但要注冊(cè)才能下載,難道驅(qū)動(dòng)人生可以解決?于是就下載了一個(gè)驅(qū)動(dòng)人生,安裝的時(shí)候還是附帶全家桶,不過(guò)現(xiàn)在可以用鍵盤(pán)移動(dòng)鼠標(biāo)取消了,只安裝了驅(qū)動(dòng)人生自己,跟剛才兩個(gè)軟件不同的是,它提示USB外設(shè)驅(qū)動(dòng)沒(méi)有安裝,于是點(diǎn)修復(fù),結(jié)果反反復(fù)復(fù)出現(xiàn)等待光標(biāo),就是無(wú)法完成;
    8、之前又搜索到,驅(qū)動(dòng)安裝的日志在C:\Windows\INF\setupapi.dev.log文件里,于是打開(kāi)這個(gè)文件,發(fā)現(xiàn)Driver package failed signature verification. Error = 0xE000022F,驅(qū)動(dòng)程序簽名有問(wèn)題,所以不能安裝成功;
    9、Windows10有個(gè)高級(jí)啟動(dòng)選項(xiàng)是禁用強(qiáng)制驅(qū)動(dòng)簽名,如何進(jìn)入高級(jí)啟動(dòng)選項(xiàng)呢?以前是按F8,現(xiàn)在不行了,要在設(shè)置里面,更新和安全,恢復(fù),高級(jí)啟動(dòng),立即重啟,然后設(shè)置疑難解答,高級(jí)啟動(dòng),再重啟,就可以進(jìn)入高級(jí)啟動(dòng)菜單,按7進(jìn)入禁止強(qiáng)制驅(qū)動(dòng)簽名模式,重啟后再用驅(qū)動(dòng)人生修復(fù),果然成功了;
    10、打開(kāi)驅(qū)動(dòng)人生下載目錄,DTLFolder\DriversDownLoad,發(fā)現(xiàn)它下載了USB驅(qū)動(dòng)目錄是USB_10.0.10240.16384_WHQL_107049,里面文件如下:

    除了第一個(gè)xml文件是程序自己用的外,其他都是USB驅(qū)動(dòng)用到的文件,點(diǎn)右鍵發(fā)現(xiàn)那幾個(gè)sys文件,除了usbohci.sys和usbuhci.sys外,其他都有數(shù)字簽名,而usbuhci.sys我這里沒(méi)用到,問(wèn)題就出在usbohci.sys上:


    11、難道是驅(qū)動(dòng)人生替換了未簽名的文件?圖謀不軌?為了驗(yàn)證一下,我又下載了一個(gè)Windows10安裝光盤(pán)(版本是當(dāng)前使用的1703版):
    cn_windows_10_multiple_editions_version_1703_updated_march_2017_x64_dvd_10194190.iso
    12、怎么提取安裝光盤(pán)中的內(nèi)置驅(qū)動(dòng)?找了一下,原來(lái)Windows的安裝盤(pán)從VISTA起,不再使用XP以前的I386目錄和Drivers.cab文件存放驅(qū)動(dòng),而是打包在一個(gè)Install.wim鏡像文件中,要找到驅(qū)動(dòng)文件,必須用工具提取,這個(gè)工具就是Imagex.exe,微軟自己做的命令行工具,但是我的電腦上沒(méi)有,于是下載了一個(gè)64位的,放在C盤(pán)根目錄,通過(guò)如下命令即可提取:
    c:\IMAGEX_x64 /mount f:\sources\install.wim 5 i:\1703
    其中F盤(pán)是在iso文件上點(diǎn)右鍵,打開(kāi)方式選“Windows資源管理器”打開(kāi)后虛擬出來(lái)的盤(pán)符,其實(shí)就相當(dāng)于系統(tǒng)自帶的虛擬光驅(qū),I盤(pán)是硬盤(pán),用來(lái)存放掛載的鏡像文件,5是選擇掛載哪一個(gè)版本的Windows(多合一版),如果不知道要掛哪個(gè),把這個(gè)數(shù)字改成100,會(huì)顯示xml文件內(nèi)容,并提示找不到這個(gè)索引號(hào),從xml文件內(nèi)容就能找到各版本的信息,然后再重新掛載正確的即可。這個(gè)掛載其實(shí)是個(gè)解壓縮過(guò)程,時(shí)間很長(zhǎng),提取完之后就跟安裝好了Windows一樣,目錄都列好了。
    今天又發(fā)現(xiàn)另一個(gè)圖形化的工具,Dism++,比這個(gè)操作更簡(jiǎn)單。Dism是PowerShell內(nèi)置的命令,也是與鏡像有關(guān),也能掛載提取,但用了一下似乎提示權(quán)限有問(wèn)題,Dism++是國(guó)內(nèi)開(kāi)源愛(ài)好者自己開(kāi)發(fā)的圖形化工具,與Dism沒(méi)有關(guān)系。
    13、好了,原版的Windows已經(jīng)準(zhǔn)備好,進(jìn)入Windows\System32\DriverStore\FileRepository目錄,搜索usbohci.sys,在usbport.inf_amd64_8e5f608c0111283d目錄下,點(diǎn)右鍵一看,也是沒(méi)簽名的:
    這不是坑爹嗎?你自己帶的東西都沒(méi)簽名,然后又不給用!!!!
    14、有點(diǎn)懷疑是Windows自己更新的時(shí)候修改了一些策略,導(dǎo)致之前可以用的不能用了,為了再次驗(yàn)證,又繼續(xù)下載了兩個(gè)版本的Windows10安裝光盤(pán),分別是早期的1607和最新的1709,找到usbohci.sys,如下所示:
    從左到右依次為1607,1703,1709,均未簽名,基本可以判斷是Windows自己抽風(fēng)了。
    15、昨天晚上搞到12點(diǎn)多,搞定鼠標(biāo)后沒(méi)有重啟測(cè)試,今天早上開(kāi)機(jī),果然發(fā)現(xiàn)鼠標(biāo)又不能用了,因?yàn)槲覜](méi)有選擇禁用強(qiáng)制簽名選項(xiàng)來(lái)啟動(dòng),系統(tǒng)發(fā)現(xiàn)那個(gè)沒(méi)簽名的驅(qū)動(dòng),就把它停了,嘗試卸載,結(jié)果再裝也裝不上,于是只好又設(shè)置高級(jí)啟動(dòng),重新禁止強(qiáng)制簽名,進(jìn)入系統(tǒng),裝上驅(qū)動(dòng),恰好這時(shí)Windows又在后臺(tái)偷偷摸摸地更新,不知道更新了啥,讓我重啟。
    16、重啟之后,奇跡出現(xiàn),剛才明明提示沒(méi)有簽名強(qiáng)制安裝的驅(qū)動(dòng),現(xiàn)在居然正常啟動(dòng)也沒(méi)問(wèn)題了,而且查看驅(qū)動(dòng)詳情的時(shí)候出現(xiàn)了矛盾的一幕:
    外面顯示數(shù)字簽名者:未經(jīng)數(shù)字簽名,里面的sys文件又顯示數(shù)字簽名者是Microsoft Windows,然而進(jìn)入C:\Windows\System32\drivers目錄,找到usbohci.sys,點(diǎn)右鍵,卻發(fā)現(xiàn)并沒(méi)有數(shù)字簽名:
    好吧,你開(kāi)心就好,反正不要再禁我的鼠標(biāo)就行……
    感謝這次蛋疼的折騰之旅,讓我知道了驅(qū)動(dòng)程序來(lái)自哪里,安裝日志在哪里,哪個(gè)軟件坑爹又沒(méi)用,怎么玩安裝盤(pán),怎么用鍵盤(pán)操作鼠標(biāo),怎么進(jìn)入高級(jí)啟動(dòng)界面……
    我為什么要知道這些??????????????為微軟的疏忽買(mǎi)單啊!!!!!
    啥都不說(shuō)了,它又提示我重啟了,不知道又有什么奇跡會(huì)發(fā)生……
    posted @ 2017-11-19 12:43 amp@java 閱讀(1156) | 評(píng)論 (0)編輯 收藏

     每次換手機(jī),把舊手機(jī)的數(shù)據(jù)遷移到新手機(jī)就是個(gè)很麻煩的事情,幸好最近華為的“手機(jī)克隆”APP越來(lái)越強(qiáng)大,居然能夠把微信的聊天記錄包括圖片原封不動(dòng)地遷移到新手機(jī)上,以前用微信自帶的聊天記錄轉(zhuǎn)移功能只能轉(zhuǎn)移文字信息,圖片視頻全部丟失,不知道現(xiàn)在的怎么樣。手機(jī)克隆還能把SD卡的內(nèi)容也轉(zhuǎn)移過(guò)來(lái),基本滿足了需要。
    但是要把手機(jī)上的東西傳到電腦就沒(méi)那么簡(jiǎn)單了,現(xiàn)在已經(jīng)沒(méi)有了以前的大容量存儲(chǔ)模式,只能選擇MTP模式,這種模式其實(shí)不是一個(gè)完整的文件系統(tǒng),有很多限制,所以一些傳統(tǒng)的軟件讀取不到,例如FastCopy是用不了的,用Windows自帶的文件管理器來(lái)復(fù)制,開(kāi)始計(jì)算時(shí)間就要等很久,中間出了個(gè)錯(cuò)就前功盡棄;還有通過(guò)手機(jī)上的APP訪問(wèn)電腦共享的方式,在手機(jī)上復(fù)制也可以,但是同樣會(huì)莫名其妙卡死,F(xiàn)TP同理,折騰了好久,還是覺(jué)得自己動(dòng)手比較好。
    MTP協(xié)議在維基百科里解釋得比較清楚:https://en.wikipedia.org/wiki/Media_Transfer_Protocol ,簡(jiǎn)單點(diǎn)說(shuō)就是:
    1、不是以塊設(shè)備的形式訪問(wèn),跟U盤(pán)不同;
    2、只能單線程訪問(wèn),不能同時(shí)進(jìn)行多個(gè)操作,只能一個(gè)接一個(gè);
    3、控制權(quán)在設(shè)備上,對(duì)外展示的內(nèi)容由設(shè)備決定;
    4、默認(rèn)不能直接對(duì)文件進(jìn)行部分修改,只能復(fù)制過(guò)來(lái)修改完再?gòu)?fù)制回去,但Android對(duì)協(xié)議做了擴(kuò)展,能夠修改部分文件內(nèi)容;
    5、在Linux上有些軟件能夠把它掛載為文件系統(tǒng),這樣其他軟件就能像訪問(wèn)普通文件系統(tǒng)一樣訪問(wèn)了,但是Windows下似乎沒(méi)有。

    不過(guò)有人開(kāi)發(fā)了一個(gè)在Windows下通過(guò)JNI實(shí)現(xiàn)的Java庫(kù)jmtp,項(xiàng)目托管在Google Code,被墻了,但是GitHub有人fork了一個(gè),可以下載下來(lái),我下載的是https://github.com/reindahl/jmtp
    里面包含了C++的代碼和Java的代碼,以及兩個(gè)已經(jīng)編譯好的dll文件,分別用于Win32和Win64,把其中一個(gè)dll文件放在工程目錄下,再把Java源代碼加入工程中即可使用,文檔比較簡(jiǎn)陋,但是看test目錄下的MtpTest.java,基本可以摸到如何使用了,這個(gè)協(xié)議比較簡(jiǎn)單,其實(shí)沒(méi)什么功能,我要的只是把文件復(fù)制到電腦上。
    根據(jù)MtpTest.java,稍微修改一下,做個(gè)遞歸復(fù)制即可把手機(jī)上的所有文件復(fù)制到電腦上:
    package test;

    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.math.BigInteger;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.rmi.server.SocketSecurityException;
    import java.util.ArrayList;


    import jmtp.PortableDevice;
    import jmtp.PortableDeviceFolderObject;
    import jmtp.PortableDeviceManager;
    import jmtp.PortableDeviceObject;
    import jmtp.PortableDeviceStorageObject;


    public class TestApp {

       

        
    public static void main(String[] args) {
            
    // TODO Auto-generated method stub
            
            ArrayList
    <PortableDeviceStorageObject> devices = new ArrayList<>();

            PortableDeviceManager manager 
    = new PortableDeviceManager();

            
    for (PortableDevice device : manager) {
                System.out.println(device);
                device.open();
                
                
    // Iterate over deviceObjects
                for (PortableDeviceObject object : device.getRootObjects()) {
                    String storageName
    =object.getName();
                    System.out.println(storageName);

                    
    // If the object is a storage object
                    if (object instanceof PortableDeviceStorageObject) {
                        PortableDeviceStorageObject storage 
    = (PortableDeviceStorageObject) object;
                        System.out.println(storage.getChildObjects().length);
                        
    for (PortableDeviceObject child : storage.getChildObjects()) {
                                copyall(child,
    "E:\\手機(jī)備份\\"+object.getName());
                        }
                    }
                }

                device.close();
                System.out.println(size);
            }

      
      
        }
        
        
    public static void copyall(PortableDeviceObject obj,String path) {

            if(obj instanceof PortableDeviceFolderObject) {
              

                String objName=obj.getName();
                
    if(objName.contains(":")) {
                    objName
    =objName.replace(':''');
                }
                String newPath 
    = path+"\\"+objName;
                System.out.println(
    "創(chuàng)建文件夾:"+newPath);
                
                File file = new File(newPath);
                if(!file.exists()) {
                    file.mkdirs();
                }
                for(PortableDeviceObject subObj:((PortableDeviceFolderObject) obj).getChildObjects()) {             
                    copyall(subObj,newPath);
                }
            }
            
    else {      
                
    if(obj.getName().contains(":"))
                    
    return;
                System.out.println(
    "開(kāi)始復(fù)制文件到:"+path+"\\"+obj.getName());
                File file 
    = new File(path);
                obj.copy(file.toPath());                     
                System.out.println(
    "文件復(fù)制完成!");
            }
        }

    }
    其中發(fā)現(xiàn)有點(diǎn)問(wèn)題:
    1、Android設(shè)備文件名里是可以包含冒號(hào)(:)的,但Windows是不可以的,所以復(fù)制到這些文件的時(shí)候會(huì)有問(wèn)題,于是遇到目錄名這樣就把它改為中文的冒號(hào)(:),但是遇到文件名這樣就不行了,因?yàn)檫@個(gè)庫(kù)的copy函數(shù)只需要指定目標(biāo)目錄,不需要指定目標(biāo)文件名,所以這些文件只能放棄;
    2、Android手機(jī)的MTP協(xié)議是由“媒體存儲(chǔ)”這個(gè)系統(tǒng)APP控制的,有時(shí)候手機(jī)上可以看到的文件,通過(guò)MTP訪問(wèn)卻怎么也看不到,重啟手機(jī)也不行,應(yīng)該就是這個(gè)APP沒(méi)有更新數(shù)據(jù),需要把它的系統(tǒng)數(shù)據(jù)清除掉,等它重建完重新訪問(wèn)就可以看到了,不過(guò)這個(gè)重建時(shí)間非常長(zhǎng),可以查看它數(shù)據(jù)占用的空間,剛清除之后會(huì)發(fā)現(xiàn)它占用的空間會(huì)不斷增長(zhǎng),到了不增長(zhǎng)的時(shí)候就是重建完了,就可以正常訪問(wèn)了;
    3、這個(gè)庫(kù)有時(shí)候還有點(diǎn)bug,有一次發(fā)現(xiàn)它讀取到的文件和文件夾都沒(méi)有了最后一個(gè).后面的部分,所以總是卡住,重新插拔一下手機(jī)數(shù)據(jù)線又沒(méi)問(wèn)題了;
    4、為了避免復(fù)制了半天結(jié)果發(fā)現(xiàn)不完整,又要重來(lái),最好在復(fù)制前先統(tǒng)計(jì)一下文件大小,看看跟手機(jī)上看到的占用存儲(chǔ)空間是不是一致,對(duì)于MTP設(shè)備上的文件,可以通過(guò)getSize函數(shù)得到大小,把上面復(fù)制操作改為大小累加即可,速度比復(fù)制快一些,不過(guò)由于小文件太多,也不會(huì)快很多。

    把手機(jī)里的文件復(fù)制到電腦后,通過(guò)一些簡(jiǎn)單的分析,發(fā)現(xiàn)有很多其實(shí)是垃圾來(lái)的,也可以為手機(jī)空間清理提供參考,因?yàn)樵陔娔X上分析起來(lái)比在手機(jī)上方便一些。例如一些視頻APP的緩存,居然超過(guò)1G,占用了寶貴的內(nèi)部存儲(chǔ)空間,之前一直都沒(méi)發(fā)現(xiàn),通過(guò)電腦里的按文件大小搜索才發(fā)現(xiàn)。
    posted @ 2017-11-17 14:54 amp@java 閱讀(2256) | 評(píng)論 (0)編輯 收藏

    09款老速騰,不支持USB和AUX,要聽(tīng)歌除了CD以外,就是刻錄在CD上的MP3了,以前不知道用什么軟件刻錄了一張碟,能夠完美地顯示中文文件名和ID3信息,前幾天用ImgBurn刻了一張,發(fā)現(xiàn)中文是亂碼,開(kāi)始以為是ID3信息顯示亂碼,于是下載了一個(gè)Mp3Tag,把所有ID3信息都清除,結(jié)果顯示文件名依然亂碼,重新寫(xiě)入ID3信息,發(fā)現(xiàn)ID3可以正常顯示,但文件名還是亂碼。
    于是就把原來(lái)那張可以正常顯示中文的碟拿來(lái)研究一下,發(fā)現(xiàn)它的ID3標(biāo)簽只是ID3v1,而后來(lái)重新寫(xiě)入的ID3是ID3v2.3,兩個(gè)都可以正常顯示中文,說(shuō)明ID3信息是正常的,文件名亂碼不是這個(gè)問(wèn)題。
    但是不知道用什么軟件來(lái)顯示光盤(pán)的文件系統(tǒng),只能一次次摸索。
    幸好有一張CD-RW可以反復(fù)嘗試。
    ImgBurn默認(rèn)是使用ISO9660+UDF,而ISO 9660則使用最老的ISO 9660文件系統(tǒng),也就是1988版本,文件名默認(rèn)是不支持中文的,不知道是不是這個(gè)原因,于是就把文件系統(tǒng)改為ISO 9660+Joliet,如下圖:

    并且把ISO 9660標(biāo)準(zhǔn)改為1999:

    可能是因?yàn)樽址幋a那里改為了ASCII,所以就好了。
    后來(lái)又嘗試只使用UDF文件系統(tǒng),結(jié)果認(rèn)不出碟。



    所以,目前能夠使用中文的環(huán)境其實(shí)就是:
    ImgBurn使用ISO 9660 1999標(biāo)準(zhǔn);
    ID3使用v1或v2.3都可以。

    posted @ 2017-02-10 09:17 amp@java 閱讀(402) | 評(píng)論 (0)編輯 收藏

    最近新部署了一個(gè)信息系統(tǒng),廠家居然沒(méi)有升級(jí)方案,所有數(shù)據(jù)都要重新輸入,包括用戶、角色等都要重新配置,真是操蛋。要是一個(gè)個(gè)錄入簡(jiǎn)直是日狗了,這些用戶在其他信息系統(tǒng)早已存在,但是每個(gè)都復(fù)制粘貼提交一遍也不是辦法,于是就想用程序自動(dòng)完成這些操作。步驟如下:
    1、從其他信息系統(tǒng)的數(shù)據(jù)庫(kù)導(dǎo)出用戶信息,也可以直接從其他信息系統(tǒng)的界面把所有用戶信息復(fù)制下來(lái)放在一個(gè)文本文件里,反正就是準(zhǔn)備好數(shù)據(jù)源;
    2、在需要錄入用戶信息的系統(tǒng)中,用人工操作的方式登錄系統(tǒng),并錄入一個(gè)用戶,同時(shí)用Wireshark抓包,查看整個(gè)過(guò)程要提交一些什么樣的表單數(shù)據(jù);
    3、在程序中用httpclient提交同樣的數(shù)據(jù),完成登錄,并從第1步的數(shù)據(jù)源中讀取用戶信息,然后循環(huán)提交錄入用戶所需的數(shù)據(jù),完成用戶的錄入;
    4、新系統(tǒng)沒(méi)有默認(rèn)的用戶角色,是需要一個(gè)個(gè)修改的,是根據(jù)用戶的ID來(lái)確定當(dāng)前修改的用戶,并且提交一個(gè)角色I(xiàn)D來(lái)進(jìn)行設(shè)定,因此需要首先獲取用戶的ID,然后根據(jù)該ID來(lái)提交角色I(xiàn)D,而用戶ID是通過(guò)用戶列表頁(yè)面獲取到的,因此還需要通過(guò)正則表達(dá)式來(lái)獲取所有用戶的ID,然后循環(huán)提交角色I(xiàn)D,完成角色設(shè)定。

    花了不少時(shí)間才搞定,有幾個(gè)地方需要注意:
    1、如果表單數(shù)據(jù)不包含中文,直接把表單的Name和Value加在HttpPost的URL的?后面即可,不需要專門(mén)建立NameValuePair,如下所示:
    HttpPost httppost = new HttpPost("http://1.1.1.1/test/adduser?userid=abc&username=efg");
    httpclient.execute(httppost);

    但是,如果表單數(shù)據(jù)包含中文,例如姓名,用這種方式提交的表單數(shù)據(jù)會(huì)出現(xiàn)亂碼,即使通過(guò)URLEncoder進(jìn)行編碼后再發(fā)也不行,必須建立NameValuePair,再加到HttpPost的Entity里面,如下所示:
    HttpPost httppost = new HttpPost("http://1.1.1.1/test/adduser?userid=abc");
    List
    <NameValuePair> nvps = new ArrayList<NameValuePair>();
    nvps.add(
    new BasicNameValuePair("username","張三"));
    httppost.setEntity(
    new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
    httpclient.execute(httppost);

    2、用于網(wǎng)頁(yè)內(nèi)容查找的正則表達(dá)式的使用方式一般為:
    Pattern p = Pattern.compile(".*?abc(whattoget)123.*?");
    Matcher m = p.matcher(line);
    if(m.matches()){
         String whattoget 
    = m.group(1);
    }
    ".*?abc(whattoget)123.*?"就是一個(gè)正則表達(dá)式,如果用于匹配一行的時(shí)候,由于要查找的內(nèi)容是在行中間,所以前后需要加上.*?,表示前后可以是任意字符,也可以什么都沒(méi)有,而表達(dá)式中間的(whattoget)就表示一個(gè)group,編號(hào)為1,編號(hào)為0的group是整個(gè)匹配的字符串,找到之后提取group(1)即可得到想要的內(nèi)容。
    測(cè)試正則表達(dá)式是一項(xiàng)很麻煩的工作,不過(guò)有個(gè)很好的軟件可以完成此工作:RegexBuddy,支持各種語(yǔ)言的正則表達(dá)式的調(diào)試。
    學(xué)習(xí)正則表達(dá)式的寶典是《Mastering Regular Expression》。
    posted @ 2016-01-12 15:54 amp@java 閱讀(3574) | 評(píng)論 (1)編輯 收藏

    今天遇到一個(gè)非常奇怪的問(wèn)題,有臺(tái)裝XP的電腦,插上USB鍵盤(pán)沒(méi)反應(yīng),還以為是鍵盤(pán)壞了,又找來(lái)兩個(gè)不同型號(hào)的鍵盤(pán),依然不行,又以為是USB接口壞了,結(jié)果在電腦啟動(dòng)的時(shí)候又可以按F2進(jìn)入BIOS,這樣就只有一個(gè)原因,Windows的驅(qū)動(dòng)沒(méi)裝上了。
    幸好這電腦還有傳統(tǒng)的PS/2口,而且插上就能識(shí)別,否則連Windows都進(jìn)不去,因?yàn)榘碈trl+Alt+Del沒(méi)反應(yīng)。
    進(jìn)去之后提示安裝USB鍵盤(pán)驅(qū)動(dòng),到最后一步提示安裝失敗,原因是拒絕訪問(wèn)。
    上網(wǎng)搜了一下,安裝驅(qū)動(dòng)拒絕訪問(wèn)的其中一個(gè)原因是注冊(cè)表有個(gè)鍵的權(quán)限設(shè)置有問(wèn)題,改過(guò)來(lái)即可,但是我打開(kāi)注冊(cè)表,連那個(gè)鍵都沒(méi)找到,不是這個(gè)原因。
    不過(guò)從這個(gè)解決方案中也知道了驅(qū)動(dòng)安裝的日志是在Windows目錄下的setupapi.log文件里面,于是打開(kāi)那個(gè)文件,發(fā)現(xiàn)每次安裝都有兩個(gè)拒絕訪問(wèn)的錯(cuò)誤,但并沒(méi)有說(shuō)是注冊(cè)表拒絕訪問(wèn),在拒絕訪問(wèn)之前,還提到一個(gè)叫MlCoInst.dll的文件沒(méi)有簽名。
    上網(wǎng)搜MlCoInst.dll,沒(méi)有找到任何結(jié)果,在System32目錄下找到它,看屬性,果然沒(méi)有簽名,是個(gè)三無(wú)文件,不知道為什么每次安裝驅(qū)動(dòng)都要調(diào)用它。
    日志里面還提到了“共同安裝程序”,似乎和CoInst有點(diǎn)關(guān)聯(lián),于是又查了一下,原來(lái)安裝驅(qū)動(dòng)的時(shí)候可以通過(guò)調(diào)用“共同安裝程序”來(lái)實(shí)現(xiàn)某些目的,例如修改驅(qū)動(dòng)程序的簽名狀態(tài),欺騙操作系統(tǒng),這樣就可以只安裝一次驅(qū)動(dòng)即可,不用每次插入都安裝一次。
    于是嘗試把MlCoInst.dll刪除,提示刪除失敗。
    在注冊(cè)表里面搜索MlCoInst.dll,把所有找到的鍵值都刪除,再次插拔鍵盤(pán),順利安裝完畢,刪除MlCoInst.dll,也成功了,果然是它的問(wèn)題。

    這個(gè)應(yīng)該是某個(gè)USB設(shè)備的驅(qū)動(dòng)引進(jìn)來(lái)的,而且修改了usb.inf,每次安裝任何USB設(shè)備都要調(diào)用它,但它可能與Windows的簽名機(jī)制有沖突,所以導(dǎo)致安裝失敗,真是坑爹!
    posted @ 2015-04-02 17:04 amp@java 閱讀(3605) | 評(píng)論 (0)編輯 收藏

    做GUI程序的時(shí)候,通常有個(gè)后臺(tái)工作線程在努力工作,但是中間又需要一些暫停,而關(guān)閉程序的時(shí)候,必須立即結(jié)束那個(gè)線程,退出程序,也有的時(shí)候需要停止后臺(tái)線程,但不關(guān)閉程序。例如,做一個(gè)目錄監(jiān)控程序,發(fā)現(xiàn)目錄中有文件的時(shí)候,執(zhí)行一定的操作,執(zhí)行完之后沒(méi)有文件了,就要暫停一下,過(guò)幾秒或幾分鐘再次檢測(cè),這時(shí)候就要對(duì)線程進(jìn)行暫停操作,如果在暫停的時(shí)候,用戶要關(guān)閉程序,就必須馬上停止線程,如果用戶需要暫停檢測(cè),按下某個(gè)按鈕后,需要讓線程馬上停止,但再次按下某個(gè)按鈕,線程又必須馬上開(kāi)始。

    以前我都是通過(guò)檢測(cè)停止標(biāo)記和用Thread.sleep(time)來(lái)完成的,后臺(tái)線程的每次循環(huán)都要檢查停止標(biāo)記,如果發(fā)現(xiàn)停止標(biāo)記已設(shè)定,就不再循環(huán),退出線程,在線程內(nèi)部,如果需要暫停,就執(zhí)行Thread.sleep(time)。通過(guò)把線程的setDaemon(true)方法,還可以讓線程作為后臺(tái)線程,當(dāng)圖形界面關(guān)閉后,線程也自動(dòng)退出。

    但是,這種方式有個(gè)問(wèn)題,如果我需要在圖形界面上點(diǎn)擊按鈕來(lái)停止線程,但并不退出程序,而點(diǎn)擊按鈕的時(shí)候線程正處于sleep狀態(tài),就對(duì)它沒(méi)有任何辦法,只能讓它醒過(guò)來(lái)再操作,如果sleep的時(shí)間比較長(zhǎng),例如1分鐘,那么點(diǎn)擊按鈕之后,用戶最多要等1分鐘才能把線程停下來(lái)。當(dāng)然,Thread對(duì)象有個(gè)interrupt方法,但是已經(jīng)被標(biāo)記為過(guò)期,一般不建議使用了。感謝評(píng)論中watchzerg的提醒,Thread的interrupt()并沒(méi)有標(biāo)記為過(guò)期,可以按照他的說(shuō)法來(lái)操作,更為簡(jiǎn)單。

    怎么讓線程能暫停,又能隨時(shí)叫醒呢?原來(lái)Java里最原始的對(duì)象Object就自帶此功能。

    每個(gè)Object都有wait(time)和notify()方法,前者就是讓擁有該Obejct的線程處于暫停狀態(tài),后者則讓線程馬上喚醒,通過(guò)這兩個(gè)方法,就能夠滿足上述的所有要求。

    首先,建立一個(gè)同步對(duì)象:
    Object syncObj = new Object();

    然后在線程中需要暫停的地方,調(diào)用該對(duì)象的wait(time)方法:
    synchronized (syncObj) {
           syncObj.wait(60*1000);
    }

    在圖形界面的按鈕監(jiān)聽(tīng)事件中,對(duì)該對(duì)象執(zhí)行notify()方法:
            button_1.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {

                    thread.setStop(true);
                    synchronized (syncObj) {
                            syncObj.notify();
                     }
                    //為了等待線程退出,還可以加上以下語(yǔ)句:
                    thread.join();

                }
            });

    posted @ 2015-03-10 16:52 amp@java 閱讀(7692) | 評(píng)論 (2)編輯 收藏

    Eclipse有個(gè)功能就是把整個(gè)項(xiàng)目打包成一個(gè)可執(zhí)行的Jar文件,里面包含了所有項(xiàng)目引用了的庫(kù),如果電腦上安裝了JRE,直接雙擊就可以啟動(dòng),看起來(lái)很方便,如下圖所示:

    可以選擇把所有類庫(kù)打包進(jìn)去,也就是Jar里面還包含一堆Jar:

    還可以生成ant腳本:


    生成的jar文件,可以直接通過(guò)java -jar xx.jar啟動(dòng),簡(jiǎn)單快捷。


    然而,這樣導(dǎo)出來(lái)的可執(zhí)行jar,啟動(dòng)速度卻非常慢,這跟包的大小有關(guān)。有個(gè)項(xiàng)目導(dǎo)出來(lái)的包有40MB,結(jié)果啟動(dòng)需要近一分鐘,在性能差的電腦上,甚至要幾分鐘,就是你執(zhí)行完命令后,沒(méi)有任何界面顯示,但是查看任務(wù)管理器發(fā)現(xiàn)java進(jìn)程的CPU占用率在浮動(dòng),說(shuō)明正在努力啟動(dòng),過(guò)了一段時(shí)間之后界面突然顯示出來(lái),簡(jiǎn)直讓人崩潰。可是在Eclipse里面運(yùn)行,卻是一點(diǎn)就開(kāi)。

    我開(kāi)始嘗試縮小導(dǎo)出的包。但是Eclipse的導(dǎo)出對(duì)話框并沒(méi)有提供需要打包哪些庫(kù)的選項(xiàng),都是默認(rèn)把所有庫(kù)都打包進(jìn)去,但是它可以生成ant腳本,可以通過(guò)編輯ant腳本的方式來(lái)減少不必要的庫(kù)。經(jīng)過(guò)多次嘗試,終于把40MB的包縮成了17MB,啟動(dòng)速度快了一些,但是依然需要半分鐘以上。

    后來(lái)覺(jué)得,能不能不打包直接運(yùn)行呢?于是把導(dǎo)出來(lái)的包用壓縮軟件解壓,再把里面包含的jar包繼續(xù)解壓,最后得到一堆沒(méi)有壓縮的class文件,再通過(guò)指定classpath的方式,直接運(yùn)行程序入口class,發(fā)現(xiàn)啟動(dòng)速度和在Eclipse里面一樣,一點(diǎn)就開(kāi)。

    打包的好處是部署簡(jiǎn)單,只需要一個(gè)文件,但帶來(lái)的缺點(diǎn)實(shí)在不能忍,打散的方式部署起來(lái)稍微難一點(diǎn),但是啟動(dòng)速度夠快,對(duì)普通用戶來(lái)說(shuō),這個(gè)才是最重要的。

    當(dāng)然,還有一種方式是像Eclipse那樣,啟動(dòng)時(shí)顯示一個(gè)圖片,底下一個(gè)進(jìn)度條顯示啟動(dòng)進(jìn)度,不過(guò)這樣也加大了工作量,而且每次都要等那進(jìn)度條,實(shí)際上也很煩。
    posted @ 2015-03-10 15:07 amp@java 閱讀(5143) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 99精品全国免费观看视频..| 亚洲av午夜福利精品一区人妖| 日韩欧美一区二区三区免费观看| 91精品国产免费久久国语麻豆| 无码成A毛片免费| 国产成人久久AV免费| 久久久久久AV无码免费网站 | 区久久AAA片69亚洲| 亚洲av中文无码| 亚洲日韩中文在线精品第一| 国产国拍亚洲精品福利 | 国产综合亚洲专区在线| 成人亚洲性情网站WWW在线观看| 中文字幕第一页亚洲| 亚洲AV永久无码区成人网站| 亚洲国产一区国产亚洲| 亚洲精品在线网站| 亚洲an日韩专区在线| 性色av极品无码专区亚洲| 全黄A免费一级毛片| 青青操免费在线视频| 99re6在线视频精品免费下载| 九九精品免费视频| 日本成人免费在线| 亚洲人成影院在线无码观看| 国产亚洲色婷婷久久99精品| 亚洲精品免费在线视频| 亚洲欧洲专线一区| 一级毛片大全免费播放下载 | 亚洲国产成人久久综合| 特级做a爰片毛片免费看| 免费看搞黄视频网站| 国产91色综合久久免费分享| 免费无码又爽又刺激毛片| 久久影院亚洲一区| 久久亚洲精品成人无码网站| 亚洲国产精品ⅴa在线观看| 中文字幕在线观看免费| 99国产精品永久免费视频| 日韩亚洲国产二区| 久久久久久a亚洲欧洲AV|