【问题标题】:FileNotFoundException (The filename, directory name, or volume label syntax is incorrect)FileNotFoundException(文件名、目录名或卷标语法不正确)
【发布时间】:2018-10-31 10:34:02
【问题描述】:

我正在尝试访问这样的文件:

public class Main {

 private static class RemoteAdapter implements SpellcheckerRemoteAdapter {

  private Spellchecker spellchecker;
  private String fileName = "deutsch.txt";
  File file = new File(getClass().getClassLoader().getResource(fileName).getFile());

  private RemoteAdapter() {
   this.spellchecker = SpellcheckerFactory.createSpellchecker(file);
  }

  @Override
  public boolean check(String word) {
   return this.spellchecker.check(word);
  }

  @Override
  public List < String > getProposal(String word) {
   return this.spellchecker.getProposal(word);
  }

 }

 public static void main(String[] args) {

  System.out.println("Start Server");
  try {
   Registry registry = LocateRegistry.createRegistry(1088);

   SpellcheckerRemoteAdapter adapter = new RemoteAdapter();
   UnicastRemoteObject.exportObject(adapter, 0);
   registry.rebind(SpellcheckerRemoteAdapter.NAME, adapter);
  } catch (RemoteException re) {
   System.out.println(re.getMessage());
  }

  System.out.println("Server is running!");
 }
}

当我在 Eclipse 中运行我的代码时,它工作得很好。但是,如果我将项目导出为可运行的 jar,我会收到以下错误:

java.io.FileNotFoundException: file:\C:\Users\Linsane\Desktop\server\SpellcheckerServer.jar!\deutsch.txt(文件名、目录名或卷标语法不正确)

虽然我知道该文件位于此位置,并且由于我自己没有构建路径,但我并没有真正了解问题所在。

【问题讨论】:

  • 资源不是文件。您有 URL:使用它直接获取输入流。
  • @EJP 你能解释一下你的确切意思吗?我真的不明白。对不起
  • 错误,getClass().getClassLoader().getResource(fileName).openStream()?还是 getClass().getClassLoader().getResourceAsStream(fileName)`?这些都有记录。

标签: java java-io filenotfoundexception


【解决方案1】:

尝试删除 getClassLoader() 调用:

  File file = new File(getClass().getResource(fileName).getFile());

您也可以手动打开jar文件,查看该文件是否真的打包到jar文件中。

【讨论】:

  • 如果删除 getClassLoader() 我会收到 NullPointerException。是的,该文件实际上是在 jar 中,
【解决方案2】:

我用 EJP & What's the difference between a Resource, URI, URL, Path and File in Java? 的提示解决了它

而不是像这样传递文件:

private String fileName = "deutsch.txt";
  File file = new File(getClass().getClassLoader().getResource(fileName).getFile());

  private RemoteAdapter() {
   this.spellchecker = SpellcheckerFactory.createSpellchecker(file);
  }

我现在像这样将 URL 传递给文件:

private String fileName = "deutsch.txt";
URL url = ClassLoader.getSystemClassLoader().getResource(fileName);
private RemoteAdapter() {
        this.spellchecker = SpellcheckerFactory.createSpellchecker(url);
}

在 Spellchecker 构造函数中,我只需获取 URL 的 Inputstream 并从中读取。

【讨论】:

  • 'Instead of' 不是答案。你输入的是一个答案,但你没有提供它。
  • 我不小心点击了“发布你的答案”,因为我点击了标签然后空白,实际上标签到“发布你的答案” - 按钮然后发布它。
猜你喜欢
  • 2014-06-30
  • 2019-05-24
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多