.NET Framework 早期版本內建無 Zip 壓縮類別。雖有第三方庫(如 SharpZipLib),但穩定度與授權皆有考量。J# 實作了 JDK 1.1.4 的 java.util.zip 命名空間,透過 .NET 語言互通性(CLS),C# 可直接引用 J# 組件 vjslib.dll 使用成熟的 Java 壓縮 API。
C:\WINDOWS\Microsoft.NET\Framework\v1.0.4205\vjslib.dll(路徑視 Windows 目錄而定)。java.util.zip 命名空間類別。| Java 類別 | 用途 |
|---|---|
java.util.zip.ZipFile | 讀取現有 Zip 檔案、列舉條目 |
java.util.zip.ZipEntry | 單一壓縮條目資訊(檔名、大小、CRC、壓縮方法等) |
java.util.zip.ZipOutputStream | 建立/寫入 Zip 檔案 |
java.util.zip.Deflater / Inflater | 低層級資料壓縮/解壓縮(非檔案層級) |
Java Enumeration 與 .NET IEnumerator 行為不同:
nextElement() 同時「取得目前元素」並「移至下一個」MoveNext() 移至下一個,Current 取得目前元素Reset() 方法,無法重新列舉解決方案:撰寫 EnumerationAdapter 實作 IEnumerable,封裝 Java 列舉器,支援 C# foreach。
// 取得輸入串流
InputStream input = zipFile.getInputStream(entry);
// 複製到檔案
FileOutputStream output = new FileOutputStream(targetPath);
CopyStream(input, output); // 自訂輔助方法
// 目錄結構處理:ZipEntry 包含完整路徑,需自行建立子目錄
if (entry.isDirectory()) continue; // 略過目錄條目
Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
注意:不支援密碼保護,若需加密請使用 System.Security.Cryptography 自行實作(產生的檔案將不相容 WinZip 等標準工具)。
Java Zip API 不支援隨機存取,修改(新增/刪除條目)需:
ZipOutputStream 寫入暫存檔putNextEntry() 並寫入資料壓縮方法常數:ZipEntry.DEFLATED(壓縮)、ZipEntry.STORED(僅儲存)。
// 壓縮字串
public static byte[] CompressString(string text)
{
var deflater = new java.util.zip.Deflater(compressionLevel);
deflater.setInput(JavaStructMarshalHelper.convertToByteArray(text));
deflater.finish();
var bos = new java.io.ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (!deflater.finished())
{
int count = deflater.deflate(buffer);
bos.write(buffer, 0, count);
}
return bos.toByteArray();
}
// 解壓縮字串
public static string DecompressString(byte[] data)
{
var inflater = new java.util.zip.Inflater();
inflater.setInput(data);
var bos = new java.io.ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (!inflater.finished())
{
int count = inflater.inflate(buffer);
bos.write(buffer, 0, count);
}
return JavaStructMarshalHelper.convertToString(bos.toByteArray());
}
關鍵點:Java byte 為有號數,J# 使用 sbyte;透過 com.ms.vJSharp.struct.JavaStructMarshalHelper 轉換陣列。
com.ms.win32 命名空間提供 User32、Kernel32、Gdi32 等核心 API。常數定義在 winX 介面(如 wins.SW_SHOW)。
因介面含欄位不符 CLS,C# 編譯器無法直接存取,需用反射:
private int GetWin32Constant(string name)
{
var asm = Assembly.GetAssembly(typeof(com.ms.win32.wina));
var type = asm.GetType("com.ms.win32.win" + char.ToLower(name[0]), true);
var field = type.GetField(name);
return int.Parse(field.GetValue(null).ToString());
}
java.math.BigDecimal、BigInteger 支援任意精度數值運算,適用加密演算法、科學計算。可包裝為 C# 友善型別並多載運算子。
J# 運行庫提供免費、微軟官方支援、功能完整的 Zip 壓縮、Win32 API、高精度數學等功能,是 .NET 早期版本缺乏這些功能時的最佳補完方案。即使現代 .NET 已內建 System.IO.Compression,理解跨語言互通機制仍具架構參考價值。