我有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我想知道这是否与我第一个问题的答案有关。 (如果有办法,我无法绊倒它。无论我使用什么类似的字符串,我都没有错误,没有输出,没有“构建成功” - 点击运行>停止构建/运行。)
答案 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实际上已经编写了我需要的确切代码(除了字符串参数)。男孩,我现在知道这些方法是如何运作的。