使用Java编写文件时权限被拒绝

时间:2016-06-06 17:49:07

标签: java lda

我正在尝试运行JGibbLDA代码,当我使用java -mx512M -cp bin:lib/args4j-2.0.6.jar jgibblda.LDA -est -alpha 0.5 -beta 0.1 -ntopics 100 -niters 1000 -savestep 100 -twords 20 -dfile /path/to/data/data.txt运行代码时,收到错误消息:

Error while writing word map /wordmap.txt (Permission denied)
java.io.FileNotFoundException: /wordmap.txt (Permission denied),

引用以下代码:

public boolean writeWordMap(String wordMapFile){
    try{
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(wordMapFile), "UTF-8"));

        //write number of words
        writer.write(word2id.size() + "\n");

        //write word to id
        Iterator<String> it = word2id.keySet().iterator();
        while (it.hasNext()){
            String key = it.next();
            Integer value = word2id.get(key);

            writer.write(key + " " + value + "\n");
        }

        writer.close();
        return true;
    }
    catch (Exception e){
        System.out.println("Error while writing word map " + e.getMessage());
        e.printStackTrace();
        return false;
    }


}
}

我不熟悉Java,但我需要运行这段代码。你能告诉我代码有什么问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

来自JGibbLDA site ...

  

JGibbLDA还保存一个名为wordmap.txt的文件,该文件包含单词和单词ID(整数)之间的映射。

wordmap.txt在源代码中的两个文件中引用:

  

LDACmdOption.java Model.java

您提到的具体错误与wordmap.txt的读取无关,但很可能源自Dictionary.java和Estimator.java:

  

src / jgibblda / Dictionary.java:public boolean writeWordMap(String wordMapFile)

     

src / jgibblda / Estimator.java: trnModel.data.localDict.writeWordMap(option.dir + File.separator + option.wordMapFileName);

更具体地说,它使用根目录/并尝试将wordmap.txt写入根上下文。如果您是非特权用户且无法写入/,那将无效。您可以尝试以root身份运行该程序,但我不建议这样做,因为破坏安全性是一个糟糕的主意。我建议的是设置:

  

option.dir

到您能够写入的位置并尝试再次运行...

从网站上的手册:

  

-dir:输入训练数据目录

然后将其添加到您的选项列表中,然后重试。我希望有所帮助。

答案 1 :(得分:1)

y使用JGibbLDA临时文件,如果您不提供文件的位置,则会尝试创建一个。{1}}。

由于您使用'wordmap.txt'运行user,因此无法创建新文件program,因此错误。

要解决要么获得用户的权限(或)通过'/wordmap.txt'选项提供位置。