Java程式員的日常——經驗貼(純乾貨)

来源:http://www.cnblogs.com/xing901022/archive/2016/04/06/5360573.html
-Advertisement-
Play Games

工作當中遇到的事情比較雜,因此涉及的知識點也很多。這裡暫且記錄一下,今天遇到的知識點,純乾貨~ 關於文件的解壓和壓縮 如果你的系統不支持tar z命令 如果是古老的Unix系統,可能並不認識tar z命令,因此如果你想要壓縮或者解壓tar.gz的文件,就需要使用gzip或者gunzip以及tar命令 ...


工作當中遇到的事情比較雜,因此涉及的知識點也很多。這裡暫且記錄一下,今天遇到的知識點,純乾貨~

關於文件的解壓和壓縮

如果你的系統不支持tar -z命令

如果是古老的Unix系統,可能並不認識tar -z命令,因此如果你想要壓縮或者解壓tar.gz的文件,就需要使用gzip或者gunzip以及tar命令了。

關於tar.gz可以這麼理解,tar結尾的壓縮包,其實只負責把文件打包,並沒有進行壓縮;而gz結尾的包,則是進行壓縮操作。

因此,tar.gz的文件可以理解為,先進行打包,再進行壓縮。

那麼,壓縮的命令就可以這樣寫:

tar -cvf abc.tar abc
gzip -c abc.tar

最終就會得出一個abc.tar.gz的文件。同理如果想要進行解壓,可以這樣:

gunzip abc.tar.gz
=>該命令會首先得出一個abc.tar的文件

tar -xvf abc.tar
=>該命令完成解壓的步驟

執行完這兩個命令,當前文件夾就會出現一個abc的文件夾了。

如果你的系統支持tar -z命令

如果你的系統級別高一點,就不用這麼費事了,tar命令直接可以對gz進行操作:

tar -zxvf 壓縮文件名.tar.gz
=>這個命令可以直接完成對壓縮文件的解壓

tar -zcvf 壓縮文件名.tar.gz 被壓縮文件名
=>這個命令可以直接完成對tar.gz的壓縮

文件句柄占用導致應用崩潰

在Java中如果執行過多的流操作或者開啟過多未關閉的Socket,並且沒有及時的關閉,就可能會出現too many open files的錯誤。這就是因為系統的文件句柄數不夠了....

在linux中可以使用命令查看文件句柄數:

ulimit -n

也可以使用這個命令,進行修改:

ulimit -n 2048

但是修改這裡,是暫時的解決辦法,如果長時間不釋放文件句柄,仍然會報錯。

所以還是應該回到程式中,檢查流操作:

BufferedReader in = null;
try{
    in = new BufferedReader(new FileReader(file));
    //你的業務邏輯
}catch(Exception e){
}finally{
    if(in != null){
        try{
            in.close();//及時的進行釋放
        }catch(Exception e){
        }
    }
}

如果是一些可以復用的流,還可以把它提取出來多次使用。

Linux系統下的亂碼問題

亂碼問題經常困擾著程式員的日常開發,關於編碼的問題就不詳細說了。有一個經常遇到的問題就是,我們開發好的一個應用,放在Linux下就會出現亂碼,仔細檢查每個編碼的配置,都是utf-8,簡直是百思不得其解。

其實這是JVM的問題,因為JVM預設會按照系統的編碼來執行,如果JVM的編碼不對,內部進行的文件處理當然也就會出現亂碼。

首先查看系統的預設編碼:

# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_MESSAGES="C"
LC_ALL=

很多系統的編碼都是這個C,在這邊博客中說,C是系統預設的Locale,預設由ANSI C來支持。也就是說預設的編碼是ANSI C!

這樣,它與我們的UTF-8肯定是不一致了。因此,可以這樣:

java -Dfile.encoding=UTF-8 xxxx

通過添加上面的參數來指定JVM使用的編碼。如果你是在tomcat中啟動的可以修改其中的java相關的參數;如果是其他的程式,那麼就依啟動時的jvm參數為準,修改對應的啟動命令即可。

使用javac以及java執行class

這個算是基礎知識了,但是一般的開發者可能只是用它試驗過helloworld。比如:

javac HelloWorld.java
=>編譯出HelloWorld.class
java HelloWorld
=>執行該類

實際情況中可能遠比這個複雜:

如何啟動eclipse中編譯出來的jar包

通過Eclipse進行打包,比較簡單:

  • 右鍵工程名字-Export
  • 選擇Jar File
  • 選擇指定的工程、以及編譯出的jar包所在的目錄
  • 點擊finish進行打包即可

這個時候,如果你直接執行java -jar xxx.jar,可能會拋出一個異常:

java -jar target.jar
fileMonitor.jar中沒有主清單屬性

這是因為這個jar中缺少了Main方法的定義。此時你可以這麼做,通過解壓工具進入到jar包中,修改META-INF下的MENIFEST.MF文件。

Manifest-Version: 1.0
Main-Class: com.test.類名

註意Main-Class後面的冒號後面要有空格、並且最後一行要空著(如果沒有最後一行的的回車,就會報找不到Main-Class這個屬性的錯誤)。

如果你使用Javac以及java編譯類

如果你有一個類,這個類依賴於其他的jar包,比如:test.java依賴a.jar、b.jar。
那麼可以執行javac進行編譯:

javac -cp a.jar;b.jar test.java
=>註意如果是Linux,分號要換成冒號
javac -cp a.jar:b.jar test.java

然後使用java執行:

java -cp .;a.jar;b.jar test
=>如果是linux,分號換成冒號
java -cp .:a.jar:b.jar test

編寫shell腳本

經常有人會編寫一些類似tomcat一鍵啟動的腳本,這裡以linux為例:

#!/bin/sh
PRG="$0"
PRGDIR=`dirname "$PRG"`

[ -z "$ROOT_PATH" ] && ROOT_PATH=`cd "$PRGDIR/.." >/dev/null; pwd`
echo "設置 ROOT_PATH為 $ROOT_PATH"

[ -z "$JRE_HOME" ] && JRE_HOME=`cd "$ROOT_PATH/jre" >/dev/null; pwd`
echo "設置 JRE_HOME 為 $JRE_HOME"

"$JRE_HOME"/bin/java -Dfile.encoding=UTF-8 -jar "$AGENT_PATH"/lib/test.jar

有幾個可以值得借鑒的地方:

  • 第一點,就是如何設置環境變數,比如使用內置的jre

    PRG="$0"
    PRGDIR=`dirname "$PRG"`
    這兩句話是為了獲取啟動腳本所在的目錄。
    [ -z "$ROOT_PATH" ] && ROOT_PATH=`cd "$PRGDIR/.." >/dev/null; pwd`
    這句話是設置了該啟動腳本所處的應用的根目錄
    [ -z "$JRE_HOME" ] && JRE_HOME=`cd "$ROOT_PATH/lib/jre" >/dev/null; pwd`
    這句話是最終設置環境變數的命令。粗俗JRE_HOME就指定為應用內置的jre了。
  • 第二點,是如何啟動我們自己的類

    "$JRE_HOME"/bin/java -Dfile.encoding=UTF-8 -jar "$AGENT_PATH"/lib/test.jar

    上面這命令,是執行內置的jre中的java命令,使用java命令啟動了一個可執行的jar包,並且設置好了它的編碼。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 發佈/訂閱 在之前的案例中我們創建了一個工作隊列,這個工作隊列的實現思想就是一個把每一個任務平均分配給每一個執行者,在這個篇文章我們會做一些不一樣的東西,把一個消息發送給多個消費者,這種模式就被稱作"發佈/訂閱". 為了說明這個模式,我們將要創建一個簡單的日誌系統,一個負責發佈消息,另外一個負責接收 ...
  • 分類:Unity、C#、VS2015 創建日期:2016-04-06 一、簡介 Unity自帶的資源包也稱為標準資源包。換言之,Unity自帶的所有標準資源包導入到Unity項目中以後,都會放在Project視圖的Standed Assets文件夾下。如果是多平臺,除了Standed Assets文... ...
  • 今天剛剛明白ref和out的區別,只限於個人理解如有不同請賜教,謝謝 首先我感覺ref和out是針對於值類型來說,以前一直認為是針對於引用類型看下麵的一段代碼 1.首先結果 i=0;ints[0]=0 i=0;ints[0]=100 2.ints作為一個引用類型在傳入方法後,對ints[0]進行了賦 ...
  • vs2005針對datatable已經有封裝好的去重覆方法: 1 //去掉重覆行 2 DataView dv = table.DefaultView; 3 table = dv.ToTable(true, new string[] { "name", "code" }); 4 5 此時table 就 ...
  • c# 正則表達式筆記 估計要寫幾天 看得一個不錯的正則教程包括字元串教程 C#字元串和正則表達式參考手冊.pdf 正則所需要的命名空間是 using System.Text.RegularExpressions 它包含了8個類,用得最多是的Regex; Regex不僅可以用來創建正則表達式,而且提供 ...
  • 下圖👇是我在CodeL公眾號菜單上設置的特殊符號,你也可以關註CodeL公眾號查看。 網頁打開圖標可能是黑白的 ,微信查看是彩色的。 是不是很漂亮 🚶 🚼 🙌 👈看,不只是菜單,內容裡面也可以加入這些特殊符號,接下來我們就來看看是如何實現的 下麵這張特殊符號的表來源:土錘哥 有了這份寶典, ...
  • 異常就是指成員沒有完成它的名稱所宣示的行動。 上面這段代碼會有異常,因為Troy去執行Love這個函數,然而其中girl根本就沒有賦值。本來Troy預期完成愛一個姑娘這個行動,結果發生了異常的事情,姑娘離開了Troy。 異常要解決的問題 很多行為(比如方法和屬性)很多時候都沒法返回錯誤代碼(比如vo ...
  • 本文地址為:http://www.cnblogs.com/ADTL/p/5357259.html XLog為XCode的日誌組件,為系統基本功能。 使用示例: 1、新建WinForm程式 2、引用NewLife.Core.dll文件 3、系統啟動前聲明用於WinForm程式,在Program.cs中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...