JAVA字符串写入文件再压缩(java字符串压缩算法)
发布时间:2025-05-20 09:39:25 发布人:远客网络
一、JAVA字符串写入文件再压缩(java字符串压缩算法)
Java字符串压缩与解压
给你提供个思想
首先你这不是物理上的告芹压缩,也就是说袜袜毕它是一个逻辑上的我们好禅认同上的压缩。
你需要写一个算法来对你所要处理的数据进行统计,然后按照算法来改变结果。
最后达到一个后台的虚拟压缩(实际上不是压缩,只是算法)。
packagejavase1.day02;\x0d\x0a/**\x0d\x0a*1)一种字符串压缩算法\x0d\x0a*str="aaaabbccccddeaaa"\x0d\x0a*压缩为:"4a2b4c2d1e3a"\x0d\x0a*原理实现:\x0d\x0a*str="aaaabbccccddeaaa"\x0d\x0a*\x0d\x0a*c=str.charAt(i)//c是每个字符\x0d\x0a*1)初始化拆中\x0d\x0a*StringBuilderbuf=newStringBuilder();\x0d\x0a*intcount=0;代表相同的字符个数\x0d\x0a*charch=str.charAt(0);代表正在统计的相同字符'a'\x0d\x0a*2)从i=1开始迭代每个字符\x0d\x0a*c=str.charAt(i);//c是每个兄拍当前字符\x0d\x0a*3)检查当前字符c与羡御羡被统计ch是否一致\x0d\x0a*如果一致count++\x0d\x0a*否则(不一致)\x0d\x0a*向缓冲区buf增加count+ch\x0d\x0a*count=0,ch=c;\x0d\x0a*3)没有下个字符就结束\x0d\x0a*4)还有字符串吗?回到2)\x0d\x0a*\x0d\x0a*2)实现还原算法\x0d\x0a*str="4a2b4c2d1e3a";\x0d\x0a*i\x0d\x0a*/\x0d\x0apublicclassDemo5{\x0d\x0apublicstaticvoidmain(String[]args){\x0d\x0aStrings=comp("aaaawwwwe");\x0d\x0aSystem.out.println(s);\x0d\x0a//System.out.println(decomp(s));\x0d\x0a\x0d\x0a}\x0d\x0apublicstaticStringcomp(Stringstr){\x0d\x0ainti=1;\x0d\x0aStringBuilderbuf=newStringBuilder();\x0d\x0aintcount=1;\x0d\x0acharch=str.charAt(0);\x0d\x0afor(;;){\x0d\x0acharc=i==str.length()?'\10':str.charAt(i);\x0d\x0aif(c==ch){\x0d\x0acount++;\x0d\x0a}else{\x0d\x0aif(count==1)\x0d\x0abuf.append(ch);\x0d\x0aelse\x0d\x0abuf.append(count).append(ch);\x0d\x0acount=1;\x0d\x0ach=c;\x0d\x0a}\x0d\x0ai++;\x0d\x0aif(i==str.length()+1){\x0d\x0abreak;\x0d\x0a}\x0d\x0a}\x0d\x0areturnbuf.toString();\x0d\x0a\x0d\x0a}\x0d\x0a}
1.可以考虑引入字符A~Z,加上0~9,形成36进制(更进一步可以大小写敏感扰颤,加上a~z,形成62进制);
2.将上述字符串除以36取余;作为个位数;上述字符串除以36取整,作为结果缓春败,重复本步森侍取余计算。
4.反向解析,将上述结果,分别按位数乘以36;
5.最后合并相加,获得原字符串。
Stringstr="aaaaaasssscccccdddddddwsaaasdcas";intlength=str.length();List弯迹Integerindex=newArrayListInteger隐闹乱();for(inti=0;ilength-1;i++){if(str.charAt(i)!=str.charAt(i+1)){index.add(i);}}if(str.charAt(length-2)!=str.charAt(length-1)){index.add(length-1);}intstart=0;StringBufferresult=newStringBuffer();for(inti=0;i灶档index.size();i++){intend=index.get(i)+1;if(i!=0){start=index.get(i-1)+1;}Stringtemp=str.substring(start,end);result.append(temp.charAt(0)).append(end-start);}System.out.println(result.toString());最终结果是:a6s4c5d7w1s1a3s1d1c1a1s1
Java编写方法实现字符串压缩的功能,连续的n个字符x表示为xn,例如aaaa表示为a4,
package?demo1;
????public?static?String?reduceString(final?String?str)?{??
????????StringBuffer?result?=?new?StringBuffer();??
????????final?int?count?=?str.length();??
????????char?山答c1?=?str.charAt(0);??
????????for?(int?i?=?1;?i??count;?i++)??{??
????????????char?c2?=?str.charAt(i);??
????????????if?岁没(c1?==?c2)??
????????????result.append(c1).append(sum);??
????????result.append(sum).append(c1);??
????????return?result.toString();??
????public?static?void?main(String[]?args)??{??
????????System.out.println(reduceString("aaaaaaaabbbccdddeeebbba"));??
二、用java小应用程序实现文件压缩、解压缩
FileInputStream fis=new FileInputStream(%%1);
FileOutputStream fos=new FileOutputStream(%%2);
ZipOutputStream zipOut=new ZipOutputStream(fos);
ZipEntry entry=new ZipEntry(args[0]);
while((nNumber=fis.read(buffer))!=-1)
zipOut.write(buffer,0,nNumber);
String%%1=System.getProperty("user.dir");
FileInputStream fis=new FileInputStream(%%1);
//创建ZIP压缩格式输入流对象实例
ZipInputStream zipin=new ZipInputStream(fis);
FileOutputStream fos=new FileOutputStream(%%2);
ZipEntry entry=zipin.getNextEntry();
while((nNumber=zipin.read(buffer,0,buffer.length))!=-1)
ArrayList<String> folderList= new ArrayList<String>();
for(int j= 0; j< folderList.size(); j++){
File file= new File(folderList.get(j));
File[] files= file.listFiles();
ArrayList<File> fileList= new ArrayList<File>();
for(int i= 0; i< files.length; i++){
folderList.add(files[i].getPath());
import org.apache.tools.zip.ZipOutputStream;//这个包在ant.jar里,要到官方网下载
//java.util.zip.ZipOutputStream
String zipFileName=%%2;//打包后文件名字
ZipOutputStream out= new ZipOutputStream(new FileOutputStream(zipFileName));
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base+"/"));
base= base.length()== 0?"": base+"/";
for(int i= 0; i< fl.length; i++){
zip(out, fl[i], base+ fl[i].getName());
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
FileInputStream in= new FileInputStream(f);
切,我刚好写了个压缩的,但没写解压的
1.解压的(参数两个,第一个是你要解压的zip文件全路径,第二个是你解压之后要存放的位置)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public static void main(String[] args){
extZipFileList(args[0],args[1]);
private static void extZipFileList(String zipFileName, String extPlace){
ZipInputStream in= new ZipInputStream(new FileInputStream(
while((entry= in.getNextEntry())!= null){
String entryName= entry.getName();
File file= new File(extPlace+ entryName);
System.out.println("创建文件夹:"+ entryName);
FileOutputStream os= new FileOutputStream(extPlace
// Transfer bytes from the ZIP file to the output file
while((len= in.read(buf))> 0){
System.out.println("解压文件成功");
压缩的(参数最少传两个,第一个是你压缩之后的文件存放的位置以及名字,第二个是你要压缩的文件或者文件夹所在位置,也可以传多个文件或文件夹)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public static String zipFileProcess(ArrayList outputZipFileNameList, String outputZipNameAndPath){
ArrayList fileNames= new ArrayList();
ArrayList files= new ArrayList();
FileOutputStream fileOut= null;
ZipOutputStream outputStream= null;
FileInputStream fileIn= null;
StringBuffer sb= new StringBuffer(outputZipNameAndPath);
// FileInputStream fileIn=null;
if(outputZipNameAndPath.indexOf(".zip")!=-1){
outputZipNameAndPath= outputZipNameAndPath;
outputZipNameAndPath= sb.toString();
fileOut= new FileOutputStream(outputZipNameAndPath);
outputStream= new ZipOutputStream(fileOut);
int outputZipFileNameListSize= 0;
if(outputZipFileNameList!= null){
outputZipFileNameListSize= outputZipFileNameList.size();
for(int i= 0; i< outputZipFileNameListSize; i++){
File rootFile= new File(outputZipFileNameList.get(i).toString());
listFile(rootFile, fileNames, files,"");
for(int loop= 0; loop< files.size(); loop++){
fileIn= new FileInputStream((File) files.get(loop));
outputStream.putNextEntry(new ZipEntry((String) fileNames.get(loop)));
byte[] buffer= new byte[1024];
while(fileIn.read(buffer)!=-1){
public static void main(String[] args){
ArrayList outputZipFileName=new ArrayList();
for(int i=1;i<argSize;i++){
outputZipFileName.add(args[i]);
ZipFileOther instance=new ZipFileOther();
instance.zipFileProcess(outputZipFileName,savePath);
private static void listFile(File parentFile, List nameList, List fileList, String directoryName){
if(parentFile.isDirectory()){
File[] files= parentFile.listFiles();
for(int loop= 0; loop< files.length; loop++){
listFile(files[loop], nameList, fileList, directoryName+ parentFile.getName()+"/");
nameList.add(directoryName+ parentFile.getName());
三、java怎么读取Zip和RAR里面的文件啊
1、ZipInputStream是一个指向ZIP文件的流,这个流最重要的方法就是getNextEntry方法,一个zip文件可以包含好几个被压缩的文件,这个方法的功能就是返回下一个目录项,也就是返回zip文件中的下一项,并且把流指向这个目录文件项。getNextEntry的返回值是ZipEntry,它表示zip文件中的一个项,它可以返回这个文件项的大小、名称等。你可以根据它返回的文件大小调用ZipInputStream的read方法来读取需要的字节。给你一个例子:public class ZipTest{
2、 public static void main(String args[]) throws FileNotFoundException, IOException{
3、 ZipInputStream zis= new ZipInputStream(new FileInputStream("c://a.zip"));//生成读取ZIP文件的流
4、 ZipEntry ze= zis.getNextEntry();//取得下一个文件项
5、 long size= ze.getSize();//取得这一项的大小
6、 FileOutputStream fos= new FileOutputStream("c://"+ze.getName());//产生输出文件对象
7、 for(int i= 0;i<size;i++){//循环读取文件并写入输出文件对象