java FileNotFoundException(没有这样的文件或目录)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11084823/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
FileNotFoundException (no such file or directory)
提问by androidu
I'm writing an android app and I need to read several files from several folders and add them to several zip archives. I need to limit the max size of the archives to lets say 16mb. So at runtime while adding the files to the archive if the size of it exceeds 16 mb create another archive with the same size limit and so on. I'm using the following wrapper class:
我正在编写一个 android 应用程序,我需要从几个文件夹中读取几个文件并将它们添加到几个 zip 档案中。我需要将档案的最大大小限制为 16mb。因此,在运行时将文件添加到存档时,如果它的大小超过 16 mb,则创建另一个具有相同大小限制的存档,依此类推。我正在使用以下包装类:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ChunkedZippedOutputStream {
private ZipOutputStream zipOutputStream;
private String path;
private String name;
private long currentSize;
private int currentChunkIndex;
private final long MAX_FILE_SIZE = 16 * 1000 * 1024; // 16mb limit
private final String PART_POSTFIX = ".part";
private final String FILE_EXTENSION = ".zip";
public ChunkedZippedOutputStream(String path, String name) throws FileNotFoundException {
this.path = path;
this.name = name;
constructNewStream();
}
public void addEntry(ZipEntry entry) throws IOException {
long entrySize = entry.getCompressedSize();
if ((currentSize + entrySize) > MAX_FILE_SIZE) {
closeStream();
constructNewStream();
} else {
currentSize += entrySize;
zipOutputStream.putNextEntry(entry);
}
}
private void closeStream() throws IOException {
zipOutputStream.close();
}
private void constructNewStream() throws FileNotFoundException {
zipOutputStream = new ZipOutputStream(new FileOutputStream(new File(path, constructCurrentPartName())));
currentChunkIndex++;
currentSize = 0;
}
private String constructCurrentPartName() {
// This will give names is the form of <file_name>.part.0.zip, <file_name>.part.1.zip, etc.
StringBuilder partNameBuilder = new StringBuilder(name);
partNameBuilder.append(PART_POSTFIX);
partNameBuilder.append(currentChunkIndex);
partNameBuilder.append(FILE_EXTENSION);
return partNameBuilder.toString();
}
}
and I use it like this:
我像这样使用它:
String zipPath = Environment.getExternalStorageDirectory() + "/MyApp/MyFolder/Zip/";
String zipName = "MyZipFle";
ChunkedZippedOutputStream zippedOutputStream = new ChunkedZippedOutputStream(zipPath, zipName);
....
zippedOutputStream.addEntry(new ZipEntry("ZipEntry" + i));
but an instantiation of the ChunkedZippedOutputStream object I get this error:
但是在 ChunkedZippedOutputStream 对象的一个实例化我得到这个错误:
java.io.FileNotFoundException: /mnt/sdcard/MyApp/MyFolder/Zip/MyZipFle.part0.zip (No such file or directory)
I know I'm doing something wrong with the path input or the name but I can't figure it out what.
我知道我的路径输入或名称有问题,但我不知道是什么。
Also if the code snippet is not correct please tell me, I got it from here How to split a huge zip file into multiple volumes?
另外,如果代码片段不正确,请告诉我,我从这里得到它如何将一个巨大的 zip 文件拆分为多个卷?
If there is a simpler solution to my problem please tell me. Thank you
如果我的问题有更简单的解决方案,请告诉我。谢谢
回答by user207421
The output directory doesn't exist. See File.mkdirs()
for the solution.
输出目录不存在。请参阅File.mkdirs()
解决方案。
回答by Ajay
This worked for me
这对我有用
Project
|->src
| |-->MyClass.java
| |-->MyFile1.txt
|->res
|->files
|-->MyFile2.txt
Example:
例子:
for MyFile1, you can use new File("MyFile1.txt");
for MyFile2, you can use new File("./res/files/MyFile2.txt");
对于 MyFile1,您可以使用 new File("MyFile1.txt");
对于 MyFile2,您可以使用 new File("./res/files/MyFile2.txt");