我可以在编译的jar文件中创建一个Netbeans“空文件”吗?

时间:2013-11-25 01:26:37

标签: java netbeans java.util.scanner

我有80,000个单词用于填字游戏(以及其他)拼图单词模式匹配器。 (用户输入“ba ??”并获得“球,婴儿,银行......等”或输入“ba *”并获得上述以及“蝙蝠,篮子,babboon ......”。 )

我把这些文字粘贴在一个Netbeans“空文件”中,并将其命名为“字典”。文件的内容只有(80,000)个单词,每行一个。这段代码就像一个读取字典的魅力(省略了过滤器的代码):

  static void showMatches(String pattern, String legal, String w) throws IOException
  {
    Path p = Paths.get("C:\\Users\\Dov\\Documents\\NetBeansProjects\\Masterwords\\src\\masterwords\\dictionary");

    String word;

    Scanner sc = new Scanner(p).useDelimiter("\r"); 

      while(sc.hasNext()){ 

          word = sc.next().substring(1);
          gui.appendOutput(word);
      }

    sc.reset();
  } 

有没有办法让文件(名为“dictionary”)成为已编译的jar文件的一部分,这样我只需要将一个文件“发送”给新的(很大程度上无助的)用户?

另一个好奇心问题......

是否可以将Paths.get(...)的参数设置为“masterwords / src / dictionary”,以使Scanner对象的连接能够读取它? I我想知道这是否与我第一个问题的答案有关。 (如果有办法,我无法绊倒它。无论我使用什么类似的字符串,我都没有错误,没有输出,没有“构建成功” - 点击运行>停止构建/运行。)

2 个答案:

答案 0 :(得分:1)

我不确定,根据您的描述,我的解决方案可以解决您的问题,但让我按照我的理解重述问题:您有一个依赖于字典资源的.jar文件。该资源可能会发生变化,您希望能够更新它,而无需发布包含新字典的全新.jar。

如果我正确地读你,你需要这样的东西:

private File getInstallPath()
{
    return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
}

这将返回.jar文件的安装目录,您可以在其中放置字典资源,以便.jar知道在哪里找到它。当然,现在您有一些培训问题,因为用户可以移动,删除或错放您的字典文件。

第二部分:

现在你已经澄清了你的问题,让我再说一遍:你希望能够读取.jar文件中包含的任意文件。精细。您可能正在尝试将文件作为文件打开,但是一旦文件位于.jar中,您就需要将其视为资源。

尝试使用:

Class myClass = Class.forName("MyClass");
ClassLoader myLoader = myclass.getClassLoader();
InputStream myStream = myLoader.getResourceAsStream(myFile);

你真的需要我解释一下“myClass”,“myLoader”等是什么意思吗?提示:“myClass”是您的类需要读取文件的任何内容。

答案 1 :(得分:0)

在沮丧地离开这个帖子几个星期之后,昨天我在这个论坛上发现了一个类似的问题,这导致我使用Google“java资源文件”并访问((this URL))

在两者之间,我想出了如何读取名为'dictionary'的文件,该文件是作为Netbeans“空Java文件”创建的,该文件位于源包... [默认包] (如Netbeans Projects窗口中所示)并存储为 C:\ Users \ Dov \!Docs \ Documents \ NetBeansProjects \ WordPatternHelp \ src \ dictionary

File file = new File("src/dictionary");

...

p = file.toPath();
sc = new Scanner(p).useDelimiter("\r");

成功。万岁。

但是在从DOS命令行编译并执行.jar文件后,找不到“字典”。所以上面只能在Netbeans IDE中运行。

在上述“成功”引起的大多数错误尝试之后,我终于使用@Mars的第二个建议成功了:

package masterwords;
public class Masterwords

...

InputStream myStream =  Class.forName("masterwords.Masterwords").
    getClassLoader().getResourceAsStream("dictionary");

sc = new Scanner(myStream).useDelimiter("\r");   // NULL PTR EXCEPTION HERE

所以,对于任何它可能值得,对@Mars的非常迟来的谢谢(和另一个道歉)。这和他指出的一样简单。希望我在2周前尝试过,但我从未见过任何方法,也不想花时间了解它们如何与当时其他更紧迫的问题一起工作。所以我不知道Mars实际上已经编写了我需要的确切代码(除了字符串参数)。男孩,我现在知道这些方法是如何运作的。