gpt4 book ai didi

java - 在 Android 中以编程方式解压缩文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:50:01 32 4
gpt4 key购买 nike

我正在下载一个 zip 文件夹并保存在我的 Android 设备中的特定文件夹中。我的应用程序在压缩文件夹时未访问该文件夹。我想在从服务器下载后解压缩文件夹并保存在特定文件夹中。

我的代码在这里:

public void DownloadDatabase(String DownloadUrl, String fileName) {
try {
File root = android.os.Environment.getExternalStorageDirectory();
File dir = new File(root.getAbsolutePath() + "/timy/databases");
if(dir.exists() == false){
dir.mkdirs();
}

URL url = new URL("http://myexample.com/android/timy.zip");
File file = new File(dir,fileName);

long startTime = System.currentTimeMillis();
Log.d("DownloadManager" , "download url:" +url);
Log.d("DownloadManager" , "download file name:" + fileName);

URLConnection uconn = url.openConnection();
uconn.setConnectTimeout(TIMEOUT_SOCKET);

InputStream is = uconn.getInputStream();

ZipInputStream zipinstream = new ZipInputStream(new BufferedInputStream(is));
ZipEntry zipEntry;

while((zipEntry = zipinstream.getNextEntry()) != null){
String zipEntryName = zipEntry.getName();
File file1 = new File(file + zipEntryName);
if(file1.exists()){

}else{
if(zipEntry.isDirectory()){
file1.mkdirs();
}
}
}

BufferedInputStream bufferinstream = new BufferedInputStream(is);

ByteArrayBuffer baf = new ByteArrayBuffer(5000);
int current = 0;
while((current = bufferinstream.read()) != -1){
baf.append((byte) current);
}

FileOutputStream fos = new FileOutputStream( file);
fos.write(baf.toByteArray());
fos.flush();
fos.close();
Log.d("DownloadManager" , "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + "sec");
}
catch(IOException e) {
Log.d("DownloadManager" , "Error:" + e);
e.printStackTrace();
}

}

我的 logcat 显示错误。只是文件夹正在我的设备中创建,没有文件正在下载解压缩。如果不使用 inputZipStream 方法,那么我的压缩文件夹正在下载并保存在 sdcard 中。当我想解压缩它时,它没有发生。

最佳答案

这篇文章是关于如何使用内置的 Java API 编写一个实用程序类来提取压缩 zip 存档中的文件和目录。

java.util.zip 包提供了以下用于从 ZIP 存档中提取文件和目录的类:

ZipInputStream:这是主要类,可用于读取 zip 文件以及提取存档中的文件和目录(条目)。下面是这个类的一些重要用法:- 通过其构造函数 ZipInputStream(FileInputStream) 读取 zip- 通过方法 getNextEntry() 读取文件和目录的条目- 通过 read(byte) 方法读取当前条目的二进制数据- 通过方法 closeEntry() 关闭当前条目- 通过方法 close() 关闭 zip 文件

ZipEntry:此类表示 zip 文件中的条目。每个文件或目录都表示为一个 ZipEntry 对象。它的方法 getName() 返回一个表示文件/目录路径的字符串。该路径采用以下形式:folder_1/subfolder_1/subfolder_2/…/subfolder_n/file.ext

基于 ZipEntry 的路径,我们在解压缩 zip 文件时重新创建目录结构。

下面的类用于解压缩下载 zip 和提取文件并存储您想要的位置。

  public class UnzipUtil
{
private String zipFile;
private String location;

public UnzipUtil(String zipFile, String location)
{
this.zipFile = zipFile;
this.location = location;

dirChecker("");
}

public void unzip()
{
try
{
FileInputStream fin = new FileInputStream(zipFile);
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null)
{
Log.v("Decompress", "Unzipping " + ze.getName());

if(ze.isDirectory())
{
dirChecker(ze.getName());
}
else
{
FileOutputStream fout = new FileOutputStream(location + ze.getName());

byte[] buffer = new byte[8192];
int len;
while ((len = zin.read(buffer)) != -1)
{
fout.write(buffer, 0, len);
}
fout.close();

zin.closeEntry();

}

}
zin.close();
}
catch(Exception e)
{
Log.e("Decompress", "unzip", e);
}

}

private void dirChecker(String dir)
{
File f = new File(location + dir);
if(!f.isDirectory())
{
f.mkdirs();
}
}
}

MainActivity.Class:

       public class MainActivity extends Activity
{
private ProgressDialog mProgressDialog;

String Url="http://hasmukh/hb.zip";
String unzipLocation = Environment.getExternalStorageDirectory() + "/unzipFolder/";
String StorezipFileLocation =Environment.getExternalStorageDirectory() + "/DownloadedZip";
String DirectoryName=Environment.getExternalStorageDirectory() + "/unzipFolder/files/";

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

DownloadZipfile mew = new DownloadZipfile();
mew.execute(url);

}

//-This is method is used for Download Zip file from server and store in Desire location.
class DownloadZipfile extends AsyncTask<String, String, String>
{
String result ="";
@Override
protected void onPreExecute()
{
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Downloading...");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}

@Override
protected String doInBackground(String... aurl)
{
int count;

try
{
URL url = new URL(aurl[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
InputStream input = new BufferedInputStream(url.openStream());

OutputStream output = new FileOutputStream(StorezipFileLocation);

byte data[] = new byte[1024];
long total = 0;

while ((count = input.read(data)) != -1)
{
total += count;
publishProgress(""+(int)((total*100)/lenghtOfFile));
output.write(data, 0, count);
}
output.close();
input.close();
result = "true";

} catch (Exception e) {

result = "false";
}
return null;

}
protected void onProgressUpdate(String... progress)
{
Log.d("ANDRO_ASYNC",progress[0]);
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}

@Override
protected void onPostExecute(String unused)
{
mProgressDialog.dismiss();
if(result.equalsIgnoreCase("true"))
{
try
{
unzip();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{

}
}
}
//This is the method for unzip file which is store your location. And unzip folder will store as per your desire location.



public void unzip() throws IOException
{
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Please Wait...");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
new UnZipTask().execute(StorezipFileLocation, DirectoryName);
}


private class UnZipTask extends AsyncTask<String, Void, Boolean>
{
@SuppressWarnings("rawtypes")
@Override
protected Boolean doInBackground(String... params)
{
String filePath = params[0];
String destinationPath = params[1];

File archive = new File(filePath);
try
{
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries(); e.hasMoreElements();)
{
ZipEntry entry = (ZipEntry) e.nextElement();
unzipEntry(zipfile, entry, destinationPath);
}


UnzipUtil d = new UnzipUtil(StorezipFileLocation, DirectoryName);
d.unzip();

}
catch (Exception e)
{
return false;
}

return true;
}

@Override
protected void onPostExecute(Boolean result)
{
mProgressDialog.dismiss();

}


private void unzipEntry(ZipFile zipfile, ZipEntry entry,String outputDir) throws IOException
{

if (entry.isDirectory())
{
createDir(new File(outputDir, entry.getName()));
return;
}

File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists())
{
createDir(outputFile.getParentFile());
}

// Log.v("", "Extracting: " + entry);
BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));

try
{

}
finally
{
outputStream.flush();
outputStream.close();
inputStream.close();
}
}

private void createDir(File dir)
{
if (dir.exists())
{
return;
}
if (!dir.mkdirs())
{
throw new RuntimeException("Can not create dir " + dir);
}
}}
}

Note: Do not forgot to add below permission in android Manifest.xml file.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />

Read More

关于java - 在 Android 中以编程方式解压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16142311/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com