Javaでファイルパスを含めずにファイルを圧縮するにはどうすればよいですか
質問
たとえば、/Users/me/Desktop/image.jpg に保存されているファイルを圧縮したいとします。
私はこのメソッドを作りました:
public static Boolean generateZipFile(ArrayList<String> sourcesFilenames, String destinationDir, String zipFilename){
// Create a buffer for reading the files
byte[] buf = new byte[1024];
try {
// VER SI HAY QUE CREAR EL ROOT PATH
boolean result = (new File(destinationDir)).mkdirs();
String zipFullFilename = destinationDir + "/" + zipFilename ;
System.out.println(result);
// Create the ZIP file
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFullFilename));
// Compress the files
for (String filename: sourcesFilenames) {
FileInputStream in = new FileInputStream(filename);
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filename));
// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// Complete the entry
out.closeEntry();
in.close();
} // Complete the ZIP file
out.close();
return true;
} catch (IOException e) {
return false;
}
}
しかし、ファイルを解凍すると、解凍されたファイルにはフルパスが含まれます。
zip内の各ファイルのフルパスは不要で、ファイル名のみが必要です。
どうすればこれを作ることができますか?
解決
ここます:
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filename));
あなたは、全体のパスを使用して、そのファイルのエントリを作成しています。あなただけの(パスなし)の名前を使用する場合は、あなたが必要なものがあります:
// Add ZIP entry to output stream.
File file = new File(filename); //"Users/you/image.jpg"
out.putNextEntry(new ZipEntry(file.getName())); //"image.jpg"
他のヒント
あなたは同じことにエントリを設定し、その後、ファイルへの相対パスを使用して、ソースデータを見つけることです。代わりに、Fileオブジェクトに源をオンにして、
を使用する必要がありますputNextEntry(新しいまたはZipEntry(sourceFile.getName()))
それはあなたのパスのちょうど最後の部分をあげる(すなわち、実際のファイル名)
する ジェイソンが言ったように, または、メソッドの署名を保持したい場合は、次のようにします。
out.putNextEntry(new ZipEntry(new File(filename).getName()));
または、を使用して ファイル名Utils.getName Apache commons/io から:
out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename)));
あなたは可能性がおそらく GET離れの新しいFileInputStreamを(新しいファイル(sourceFilePath、SourceFileNameは))を介してソースファイルにアクセスしてます。
// easy way of zip a file
輸入java.io。*;
import java.util.zip.*;
public class ZipCreateExample{
public static void main(String[] args) throws Exception {
// input file
FileInputStream in = new FileInputStream("F:/ZipCreateExample.txt");;
// out put file
ZipOutputStream out =new ZipOutputStream(new FileOutputStrea("F:/tmp.zip"));
// name of file in zip folder
out.putNextEntry(new ZipEntry("zippedfile.txt"));
byte[] b = new byte[1024];
int count;
// writing files to new zippedtxt file
while ((count = in.read(b)) > 0) {
System.out.println();
out.write(b, 0, count);
}
out.close();
in.close();
}
}
try {
String zipFile = "/locations/data.zip";
String srcFolder = "/locations";
File folder = new File(srcFolder);
String[] sourceFiles = folder.list();
//create byte buffer
byte[] buffer = new byte[1024];
/*
* To create a zip file, use
*
* ZipOutputStream(OutputStream out) constructor of ZipOutputStream
* class.
*/
//create object of FileOutputStream
FileOutputStream fout = new FileOutputStream(zipFile);
//create object of ZipOutputStream from FileOutputStream
ZipOutputStream zout = new ZipOutputStream(fout);
for (int i = 0; i < sourceFiles.length; i++) {
if (sourceFiles[i].equalsIgnoreCase("file.jpg") || sourceFiles[i].equalsIgnoreCase("file1.jpg")) {
sourceFiles[i] = srcFolder + fs + sourceFiles[i];
System.out.println("Adding " + sourceFiles[i]);
//create object of FileInputStream for source file
FileInputStream fin = new FileInputStream(sourceFiles[i]);
/*
* To begin writing ZipEntry in the zip file, use
*
* void putNextEntry(ZipEntry entry) method of
* ZipOutputStream class.
*
* This method begins writing a new Zip entry to the zip
* file and positions the stream to the start of the entry
* data.
*/
zout.putNextEntry(new ZipEntry(sourceFiles[i].substring(sourceFiles[i].lastIndexOf("/") + 1)));
/*
* After creating entry in the zip file, actually write the
* file.
*/
int length;
while ((length = fin.read(buffer)) > 0) {
zout.write(buffer, 0, length);
}
/*
* After writing the file to ZipOutputStream, use
*
* void closeEntry() method of ZipOutputStream class to
* close the current entry and position the stream to write
* the next entry.
*/
zout.closeEntry();
//close the InputStream
fin.close();
}
}
//close the ZipOutputStream
zout.close();
System.out.println("Zip file has been created!");
} catch (IOException ioe) {
System.out.println("IOException :" + ioe);
}
同じ名前のが、異なるパスを持つ2つのファイルを圧縮した場合、
あなたはかかわらず、重複したファイルの入力エラーに実行されます。
所属していません StackOverflow