指定したパスにZipファイルが存在するかどうかを確認したい。存在する場合は、同じパスでそのファイルを抽出します。
特定のパスにZipファイルが存在するかどうかを確認するにはどうすればよいですか?
ディレクトリ内のファイルの拡張子をチェックし、Zipファイルが存在する場合はファイル名を出力するこのコードを試すことができます。
public static void main(String[] args)
{
// Directory path here
String path = ".";
String files;
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
files = listOfFiles[i].getName();
if (files.endsWith(".rar") || files.endsWith(".zip"))
{
System.out.println(files);
}
}
}
}
その代わりに、AndrewThompsonが言ったように使用したい場合FilenameFilter
。
クラスにFilenameFilterを実装できます。このリンクでさらにヘルプが提供されます。これにより、ファイルの拡張子を確認する必要はありません。拡張子がパラメータとして渡されているファイルのみが表示されます。
見つかった場合にzipファイルを抽出するには、ZipInputStream
パッケージを利用できます。ここを見て、フォルダを抽出できます。
特定のパスにZipファイルが存在するかどうかを確認するにはどうすればよいですか?
これにより、ディレクトリ内のすべてのファイルが解凍されますが、特定のファイルのみを解凍するように変更するのは簡単です。
package com.wedgeless.stackoverflow;
import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* Unzips all zip files in a directory
* @author mk
*/
public final class Unzipper
{
public static final String DOT_ZIP = ".ZIP";
public static final FilenameFilter DOT_ZIP_FILTER = new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.toUpperCase().endsWith(DOT_ZIP);
}
};
public static void main(String[] args)
{
File dir = new File("/path/to/dir");
Unzipper unzipper = new Unzipper();
unzipper.unzipDir(dir);
}
public void unzipDir(File dir)
{
for (File file : dir.listFiles(DOT_ZIP_FILTER))
{
unzip(file);
}
}
protected void unzip(File file)
{
File dir = getZipDir(file);
try
{
dir.mkdirs();
ZipFile zip = new ZipFile(file);
Enumeration<? extends ZipEntry> zipEntries = zip.entries();
while (zipEntries.hasMoreElements())
{
ZipEntry zipEntry = zipEntries.nextElement();
File outputFile = new File(dir, zipEntry.getName());
outputFile.getParentFile().mkdirs();
if (!zipEntry.isDirectory())
{
write(zip, zipEntry, outputFile);
}
}
}
catch (IOException e)
{
dir.delete();
}
}
protected void write(ZipFile zip, ZipEntry zipEntry, File outputFile)
throws IOException
{
final BufferedInputStream input = new BufferedInputStream(zip.getInputStream(zipEntry));
final int buffsize = 1024;
final byte buffer[] = new byte[buffsize];
final BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(outputFile), buffsize);
try
{
while (input.available() > 0)
{
input.read(buffer, 0, buffsize);
output.write(buffer, 0, buffsize);
}
}
finally
{
output.flush();
output.close();
input.close();
}
}
protected File getZipDir(File zip)
{
File dir = zip.getParentFile();
int index = zip.getName().toUpperCase().lastIndexOf(DOT_ZIP);
String zipPath = zip.getName().substring(0, index);
File zipDir = new File(dir, zipPath);
return zipDir;
}
}
また、まれに、非標準の場合に拡張子が付いたzipファイルを取得する場合も問題ありません。file.ZIP
編集:私は質問をもっと注意深く読むべきだったと思います。パスにzipファイルが存在するかどうかを識別する方法だけを尋ね、それを抽出する方法は求めませんでした。FilenameFilterアプローチを使用してください...ヒットが発生した場合はtrueを返し、そうでない場合はfalseを返します。
File変数を取得し、director内のすべてのファイルを調べて、.zip、.tar.gz、または.rar を確認します。Javaで特定のディレクトリのファイルを反復処理するにはどうすればよいですか。
使用したいリソースの可用性をテストする最善の方法は、実際に使用してみることです。他の手法は、タイミング ウィンドウの問題、未来を予測しようとしているという批判、二重コーディングなどに対して脆弱ですFileNotFoundException
。とにかくそれをキャッチする必要があります。なぜ同じコードを 2 回書くのでしょうか。