解压缩文件将文件转换为字节
Posted
技术标签:
【中文标题】解压缩文件将文件转换为字节【英文标题】:unzip file convert file to byte 【发布时间】:2011-08-26 14:15:23 【问题描述】:我有应用程序从 url 下载 .zip 文件并将每个文件从 .zip 文件转换为字节数组。目前我能够下载文件读取 .zip 文件并将整个 .zip 文件转换为字节,但在将 .zip 中的每个文件转换为字节数组时遇到了麻烦。任何帮助将不胜感激。我在下面附上了我的代码:
try
URL url = new URL(Url);
//create the new connection
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//set up some things on the connection
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
//and connect!
urlConnection.connect();
//set the path where we want to save the file
//in this case, going to save it on the root directory of the
//sd card.
InputStream inputStream = urlConnection.getInputStream();
dis = new DataInputStream(new BufferedInputStream(inputStream));
System.out.println("INput connection done>>>>>");
zis = new ZipInputStream(new BufferedInputStream(dis));
String targetFolder="/sdcard/";
System.out.println("zip available is"+zis.available());
int extracted = 0;
while ((entry = zis.getNextEntry()) != null)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = zis.read(buffer)) != -1)
baos.write(buffer, 0, count);
String filename = entry.getName();
System.out.println("File name is>>"+filename);
byte[] bytes = baos.toByteArray();
System.out.println("Bytes is >>>>"+bytes.toString());
// do something with 'filename' and 'bytes'...
zis.closeEntry();
extracted ++;
zis.close();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
【问题讨论】:
我不明白你有什么问题。您似乎成功地将每个 zip 文件条目作为字节数组检索,但这就是您所说的需要帮助。 我的 zip 文件包含 2 个文件,每个文件都应转换为 byte[] 并作为 2 个单独的字节数组返回给其他应用程序 这是解压zip文件的好答案我希望你能得到解决方案Click Here 【参考方案1】:您的while ((count = zis.read(buffer)) != -1)
行循环读取整个zip 文件。你想做的是count = zis.read(buffer, 0, entry.getSize())
。这将在一个命令中将每个 zip 文件条目的内容转储到缓冲区中。
你会想要使这个字节数组更大。
或者,您可以保留小缓冲区,但只需确保在主循环的每次迭代中,您只读取 entry.getSize()
字节,否则您最终会读取整个文件。
【讨论】:
这是正确的想法,但不能保证调用read
可以读取完整数据,特别是因为数据是通过http 连接到达的。仍然需要循环,但终止条件需要是读取的字节数。
我认为,对于每个转换为字节的文件,我缺少一些迭代,任何代码帮助将不胜感激。【参考方案2】:
根据 Jon7 的回答(如果这能解决您的问题,他真的应该得到赞扬),试试这个:
while ((entry = zis.getNextEntry()) != null)
String filename = entry.getName();
int needed = entry.getSize();
byte[] bytes = new byte[needed];
int pos = 0;
while (needed > 0)
int read = zis.read(bytes, pos, needed);
if (read == -1)
// end of stream -- OOPS!
throw new IOException("Unexpected end of stream after " + pos + " bytes for entry " + filename);
pos += read;
needed -= read;
System.out.println("File name is>>"+filename);
System.out.println("Bytes is >>>>"+bytes.toString());
// do something with 'filename' and 'bytes'...
zis.closeEntry();
extracted ++;
【讨论】:
我工作了这个,它显示了负数组大小异常,然后我改变了我的 prog byte[] bytes = new byte[1024];它工作正常,即使它以前工作正常,但我的概念是我应该在某处保存第一个文件字节,在某处保存第二个文件。我想我应该再使用一次迭代来分别读取 2 个文件。以上是关于解压缩文件将文件转换为字节的主要内容,如果未能解决你的问题,请参考以下文章