2014-10-17 2 views
0

У меня есть программа, которая требует, чтобы внутренний файл (СЛОВАРЬ) будут скопированы на компьютер пользователя в папку, определенную следующим образом:Невозможно скопировать внутренний файл на компьютер пользователя

private static final String DIC_NAME = "WordHelp.dic"; 
    private static final String DIC_FOLDER = System.getProperty("user.home"); 
    private static final String PATH_SEP = System.getProperty("file.separator"); 
    public static final String DICTIONARY = DIC_FOLDER + PATH_SEP + DIC_NAME; 

Вот что работает на моем компьютер, где все вещи Java является:

public static void createDictionaryIfNecessary() throws IOException{ 

    Path out_path = FileSystems.getDefault().getPath(DICTIONARY); 

    boolean dic_exists = Files.exists(out_path, 
            new LinkOption[]{LinkOption.NOFOLLOW_LINKS}); 
    if(dic_exists) 
     return; 

    File file = new File("src/dictionary"); // here's problem for user ************ 

    Path in_path = file.toPath(); 

    try { 
     Files.copy(in_path, out_path, 
          REPLACE_EXISTING, COPY_ATTRIBUTES, NOFOLLOW_LINKS); 
    } catch (IOException e) { JOptionPane.showMessageDialog(null, e); } 
    } 

Но пользователь получает эту ошибку:

java.nio.file.NoSuchFileException: src\dictionary 

СОУ Файл RCE (внутренний файл .jar) не найден.

Если я смотрю на in_path во время отладки, значение:

(sun.nio.fs.Windowspath) src/dictionary 

И ниже кучу информации о in_path:

enter image description here

Это все работает на моем компьютере, и я мог бы поклясться, что он один раз работал на компьютере пользователя ...

Как я могу definefile (см. строку с **********, чтобы разрешить копирование внутреннего файла (src/dictionary) на компьютер пользователя?

Вот Netbeans вид проекта:

enter image description here

+0

Вы должны открыть его в качестве ресурса, если он упакован в приложениях классов. –

+0

@ DaveNewton - здесь мне нужна помощь: синтаксис открытия ресурса. Я Googling ... это не помогает. (И что имеет отношение к классу классов приложений к компьютеру пользователя?) Я потерялся здесь ... – DSlomer64

ответ

0

Я работал вокруг него, используя Scanner читать отдельные строки из внутреннего файла вместо использования Files.copy. Вот код. (Это не совсем так быстро, используя Scanner, но это работает.)

public static void write(FileOutputStream outfile, String s) { 
    try { 
     for(int i = 0; i < s.length(); i++) 
     outfile.write(s.charAt(i)); 
     outfile.write(13); outfile.write(10); 
    } catch (IOException ex) {JOptionPane.showMessageDialog(null, ex);} 
    } 

    public static Scanner openDic(){ 
    InputStream myStream = null; 
    try { myStream = Class.forName("masterwords.Masterwords").getClassLoader() 
         .getResourceAsStream("dictionary"); 
    }catch (ClassNotFoundException ex) {/* ... */} 
    return new Scanner(myStream).useDelimiter("\r"); 
    } 

    public static void createDictionaryIfNecessary(){ 

    Path out_path = FileSystems.getDefault().getPath(DICTIONARY); 

    if(Files.exists(out_path, new LinkOption[]{LinkOption.NOFOLLOW_LINKS})) return; 

    FileOutputStream outStream = null; 
    try {outStream = new FileOutputStream(out_path.toFile());} 
    catch (FileNotFoundException ex) {JOptionPane.showMessageDialog(null,ex);} 

    Scanner scInternalDic = IO.openDic(); 
    while(scInternalDic.hasNext()){ 
     Utilities.write(outStream,scInternalDic.next()); 
    } 

    try {outStream.close();} 
    catch (IOException ex) {JOptionPane.showMessageDialog(null,ex);} 
    scInternalDic.close(); 
    } 
+0

Мне не очень нравится это решение, так как код в 3 раза длиннее того, что у меня было. Я хотел бы увидеть модификацию исходного кода, чтобы решить проблему, если это возможно. В любом случае, я закончен. – DSlomer64