字符串压缩 java_如何在Java中压缩字符串?
如何在Java中壓縮字符串?
我使用GZIPOutputStream或ZIPOutputStream壓縮字符串(我的2222235278130938882小于20),但壓縮結果比原始字符串長。
在某個站點上,我發現一些朋友說這是因為我的原始字符串太短,因此可以使用GZIPOutputStream壓縮更長的字符串。
因此,有人可以幫我壓縮字符串嗎?
我的功能是這樣的:
String compress(String original) throws Exception {
}
更新:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.*;
//ZipUtil
public class ZipUtil {
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
return out.toString("ISO-8859-1");
}
public static void main(String[] args) throws IOException {
String string = "admin";
System.out.println("after compress:");
System.out.println(ZipUtil.compress(string));
}
}
結果是:
11個解決方案
38 votes
壓縮算法幾乎總是具有某種形式的空間開銷,這意味著它們僅在壓縮足夠大以至于開銷小于節省的空間量的數據時才有效。
壓縮僅20個字符長的字符串并不是一件容易的事,而且并非總是可能的。 如果有重復,霍夫曼編碼或簡單的行程編碼可能可以壓縮,但可能壓縮得很少。
JesperE answered 2020-01-28T07:13:27Z
9 votes
創建字符串時,可以將其視為char的列表,這意味著對于String中的每個字符,您需要支持char的所有可能值。 來自太陽的文檔
char:char數據類型是單個16位Unicode字符。 它的最小值為'\ u0000'(或0),最大值為'\ uffff'(或65,535(含))。
如果要支持的字符集減少了,可以編寫一個簡單的壓縮算法,類似于二進制->小數->十六進制基數轉換。 您從65,536(或目標系統支持的許多字符)到26(字母)/ 36(字母數字)等。
我已經使用過幾次這個技巧,例如將時間戳記編碼為文本(目標36 +,源10)-請確保您有足夠的單元測試!
Jon Freedman answered 2020-01-28T07:14:02Z
8 votes
如果密碼或多或少是“隨機的”,那么您就不走運了,您將無法大幅度減小密碼的大小。
但是:為什么您需要壓縮密碼? 也許您需要的不是壓縮,而是某種哈希值? 如果僅需要檢查名稱是否與給定密碼匹配,則無需保存密碼,但可以保存密碼的哈希值。 要檢查鍵入的密碼是否與給定名稱匹配,您可以用相同的方式構建哈希值,并將其與保存的哈希值進行比較。 由于哈希(Object.hashCode())是一個int,您將能夠以80個字節存儲所有20個密碼哈希)。
Arne Deutsch answered 2020-01-28T07:14:28Z
6 votes
你的朋友是正確的。 gzip和ZIP均基于DEFLATE。 這是一種通用算法,并不旨在編碼小字符串。
如果需要,可能的解決方案是自定義編碼和解碼HashMap。這可以讓您進行簡單的一對一映射:
HashMap toCompressed, toUncompressed;
String compressed = toCompressed.get(uncompressed);
// ...
String uncompressed = toUncompressed.get(compressed);
顯然,這需要進行設置,并且僅適用于少量的字符串。
Matthew Flaschen answered 2020-01-28T07:14:57Z
4 votes
霍夫曼編碼可能會有所幫助,但前提是您的小字符串中有很多常用字符
Noel M answered 2020-01-28T07:15:18Z
4 votes
ZIP算法是LZW和霍夫曼樹的組合。 您可以單獨使用這些算法之一。
壓縮基于兩個因素:
原始鏈(LZW)中子字符串的重復:如果重復很多,壓縮將非常有效。 該算法具有壓縮長文本的良好性能,因為單詞經常被重復
壓縮鏈中每個字符的數量(霍夫曼):字符之間的重分配越不平衡,壓縮效率越高
在您的情況下,您應該只嘗試LZW算法。 基本上可以使用此鏈,而無需添加元信息即可對其進行壓縮:對于短字符串壓縮而言,它可能會更好。
對于霍夫曼算法,編碼樹必須與壓縮文本一起發送。 因此,由于樹的緣故,對于小的文本,結果可能大于原始文本。
Benoit Courtine answered 2020-01-28T07:16:01Z
4 votes
在此,霍夫曼編碼是一個明智的選擇。 Gzip和朋友可以這樣做,但是他們的工作方式是為輸入構建霍夫曼樹,發送該樹,然后發送使用該樹編碼的數據。 如果樹相對于數據而言較大,則可能不會不節省任何大小。
但是,可以避免發送一棵樹:相反,您安排發送者和接收者已經有一棵樹。 并不是專門針對每個字符串構建的,但是您可以使用一個全局樹來編碼所有字符串。 如果您使用與輸入字符串相同的語言(英語或其他語言)來構建它,則盡管每個輸入的自定義樹效果都不如自定義樹,但仍應獲得良好的壓縮效果。
Tom Anderson answered 2020-01-28T07:16:28Z
2 votes
如果您知道您的字符串主要是ASCII,則可以將它們轉換為UTF-8。
byte[] bytes = string.getBytes("UTF-8");
這樣可以將內存大小減少約50%。 但是,您將得到一個字節數組而不是一個字符串。 但是,如果將其寫入文件,那應該不是問題。
轉換回字符串:
private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
...
String s = new String(bytes, UTF8_CHARSET);
rghome answered 2020-01-28T07:17:03Z
0 votes
您沒有看到String發生任何壓縮,因為您至少需要數百個字節才能使用GZIPOutputStream或ZIPOutputStream進行真正的壓縮。 您的字符串太小。(我不明白為什么您需要對其進行壓縮)
檢查本文的結論:
本文還展示了如何壓縮?? 并即時解壓縮數據?? 為了減少網絡流量和?? 改善您的表現?? 客戶端/服務器應用程序。?? 即時壓縮數據,?? 提高性能?? 客戶端/服務器應用程序僅在?? 被壓縮的對象更多?? 超過幾百個字節。 您?? 將無法觀察?? 如果性能改善?? 對象被壓縮?? 傳輸的是簡單的String對象,?? 例如。
YoK answered 2020-01-28T07:17:34Z
0 votes
看看霍夫曼算法。
[https://codereview.stackexchange.com/questions/44473/huffman-code-implementation]
想法是,每個字符都將替換為位序列,具體取決于它們在文本中的出現頻率(頻率越高,序列越小)。
您可以閱讀全文并建立一個代碼表,例如:
代號
0
s 10
e 110
m 111
該算法基于文本輸入構建符號樹。 字符種類越多,壓縮效果越差。
但是,取決于您的文字,它可能是有效的。
live-love answered 2020-01-28T07:18:38Z
0 votes
Java 9可直接使用緊湊的字符串增強功能[https://openjdk.java.net/jeps/254]
java.lang.String現在具有:
私有最終字節[]值;
Anurag Sharma answered 2020-01-28T07:19:06Z
總結
以上是生活随笔為你收集整理的字符串压缩 java_如何在Java中压缩字符串?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 镜头畸变现象及其校正方法
- 下一篇: java的unicode_Java中Un