2011-11-16 30 views
1

誰かが自分が実行中のJARファイルを特定のディレクトリにコピーする方法を提案できますか? ファイルはJavaで自分自身をコピーします

はあなた

は、ここに私がしようとしています何ありがとう:それは私に次のコンパイルエラーを与えている

import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

public class ahker { 
    public static void main(String[] args) throws IOException { 
    File inputFile = new   
File(ahker.class.getProtectionDomain().getCodeSource().getLocation().getFile()); 
    File outputFile = new File("C:\\TEST.jar"); 

    FileReader in = new FileReader(inputFile); 
    FileWriter out = new FileWriter(outputFile); 
    int c; 

    while ((c = in.read()) != -1) 
     out.write(c); 

    in.close(); 
    out.close(); 
    } 
} 

Exception in thread "main" java.io.FileNotFoundException: 
C:\Users\---------------\bin (Access is denied) 
+0

私はクワインについて読んだことがあるが、それが私の目標を達成することはありません全く異なる概念です。そのソースコードを出力するプログラムを持つことは何かであり、プログラム自体をコピーすることは全く異なります。ソースコードを含む配列は一度しか使用できないので、誰かが出力をコンパイルして再度実行すると、そのプログラムはコードを再び出力しません。 – Batzi

+0

[この解決法] [1]は、jarファイルとjarファイル内の内容をコピーします。 [1]:コードのhttp://stackoverflow.com/questions/1386809/copy-a-directory-from-a-jar-file/2993908#2993908 –

答えて

3
MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath() 

これはあなたのjarファイルのパスです。
、あなたはこれを使用してファイルをコピーすることができます - > http://download.oracle.com/javase/tutorial/essential/io/copy.html

Files.copy(sourcePath, targetPath, REPLACE_EXISTING); 

またはこの - >

File inputFile = new File("input.txt"); 
File outputFile = new File("output.txt"); 

FileReader in = new FileReader(inputFile); 
FileWriter out = new FileWriter(outputFile); 
int c; 

while ((c = in.read()) != -1) 
    out.write(c); 

in.close(); 
out.close(); 
+0

おかげで、私はちょうどことに気づきました最初の行はJARのパスを出力しますが、これは私の問題を解決しません。その実行中のJARを出力パスにコピーする必要があります。 – Batzi

+0

2つの例はファイルをコピーする方法を示しています。最初の例ではsourcePathではなく、2番目の例では「input.txt」の代わりにJARのパスを取得してください。 – shift66

+0

まだ作成されていないJARファイルをチェックしているかのように、 "FileNotFoundException"を与えています。 – Batzi

1

This solutionはjarファイル内のjarファイルだけでなく、コンテンツをコピーします。

public void copyResourcesRecursively(URL originUrl, File destination) throws Exception { 
    URLConnection urlConnection = originUrl.openConnection(); 
    if (urlConnection instanceof JarURLConnection) { 
     copyJarResourcesRecursively(destination, (JarURLConnection) urlConnection); 
    } else if (urlConnection instanceof FileURLConnection) { 
     FileUtils.copyFilesRecusively(new File(originUrl.getPath()), destination); 
    } else { 
     throw new Exception("URLConnection[" + urlConnection.getClass().getSimpleName() + 
       "] is not a recognized/implemented connection type."); 
    } 
} 

public void copyJarResourcesRecursively(File destination, JarURLConnection jarConnection) throws IOException { 
    JarFile jarFile = jarConnection.getJarFile(); 
    for (JarEntry entry : CollectionUtils.iterable(jarFile.entries())) { 
     if (entry.getName().startsWith(jarConnection.getEntryName())) { 
      String fileName = StringUtils.removeStart(entry.getName(), jarConnection.getEntryName()); 
      if (!entry.isDirectory()) { 
       InputStream entryInputStream = null; 
       try { 
        entryInputStream = jarFile.getInputStream(entry); 
        FileUtils.copyStream(entryInputStream, new File(destination, fileName)); 
       } finally { 
        FileUtils.safeClose(entryInputStream); 
       } 
      } else { 
       FileUtils.ensureDirectoryExists(new File(destination, fileName)); 
      } 
     } 
    } 
} 

Refer Here

関連する問題