我的文件结构:
这就是使用netbeans项目的方式:
-src
-images
-*.jpg
-stock
-*.java
-images (exact copy of -images)
这是我的罐子
-jar
-images
-*.jpg
-stock
-*.java
-images (folder is created but files don't get copied)
我的文件imagesCopy是我创建的,ImagesOrg是里面的.jar / src
File imagesCopy = new File("images");
File imagesOrg = new File(URLDecoder.decode(getClass().getResource("/images").getPath()));
if (!imagesCopy.exists()) {
imagesCopy.mkdir();
for(final File child : imagesOrg.listFiles()) {
try{
Files.copy(child.toPath(), Paths.get(imagesCopy.getAbsolutePath()+"/"+child.getName()), REPLACE_EXISTING);
}catch(Exception e){
System.out.println(e);
}
}
}
问题肯定在于:
File imagesOrg = new File(URLDecoder.decode(getClass().getResource("/images").getPath()));
编译时,它给了我,这是正确的目录
D:\Code\build\classes\images
这是正确的目录,但是当从jar文件中使用这个程序时,我得到:
D:\Code\dist\file:\D:\Code\dist\egz.jar!\images
我认为它应该只是:
D:\Code\dist\egz.jar!\images
没有第一部分
答案 0 :(得分:2)
最简单的方法可能就是这样:
public static void main(String[] args) throws URISyntaxException, IOException {
File imagesCopy = new File("C:\\Users\\<YOURNAMEHERE>\\images");
URI uri = ImageCopy.class.getResource("/images").toURI();
if (!uri.toString().startsWith("file:")) {
Map<String, String> env = new HashMap<>();
env.put("create", "true");
FileSystems.newFileSystem(uri, env);
}
Path imagesOrg = Paths.get(uri);
System.out.println(imagesOrg);
if (!imagesCopy.exists()) {
imagesCopy.mkdir();
try(DirectoryStream<Path> paths = Files.newDirectoryStream(imagesOrg)) {
for (final Path child : paths) {
System.out.println(child);
try {
String targetPath = imagesCopy.getAbsolutePath() + File.separator + child.getFileName().toString();
System.out.println(targetPath);
Files.copy(child, Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
它不是超级漂亮,但它有效。如果你有嵌套目录,可能需要摆弄代码。
请注意,必须在访问文件系统之前创建文件系统(根据Oracle Docs)。我不知道为什么这是必需的,但我们去了。
我已经对此进行了测试,它会将文件从您的JAR内部复制到您想要的任何位置。
答案 1 :(得分:1)
这是一个简单的代码。您可以根据需要进行调整。
package br.com.jjcampos.main;
//imports here
public class CopyImage {
private static ClassLoader loader = CopyImage.class.getClassLoader();
public static void main(String[] args) throws IOException {
InputStream stream = loader.getResourceAsStream("br/com/jjcampos/images/test.jpg");
OutputStream outputStream =
new FileOutputStream(new File("c:/temp/newImage.jpg"));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = stream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
outputStream.close();
}
}
了解您无法将流(您的jar)中的源复制为文件列表。除非你想先解压缩它。我的建议是你添加一个包含图像列表的txt文件,然后你阅读这个文件并使用建议的代码来复制每个文件。
这样的事情:
public class CopyImage {
private static ClassLoader loader = CopyImage.class.getClassLoader();
public static void main(String[] args) throws IOException {
copyImages("c:/temp/");
}
public static void copyImages(String pathDestiny) throws IOException{
InputStream listOfFiles = loader
.getResourceAsStream("br/com/jjcampos/images/listImages.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(listOfFiles));
String line;
while ( (line = reader.readLine())!=null ){
InputStream stream = loader.getResourceAsStream("br/com/jjcampos/images/"
+ line);
OutputStream outputStream =
new FileOutputStream(new File(pathDestiny + line));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = stream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
outputStream.close();
}
}
}
你的listImages.txt
和
test.jpg
您应该决定是否在文本文件中放置完整路径,或者不在代码中使用。