JAVA如何在项目中引用文件

JAVA如何在项目中引用文件,java,visual-studio-code,apache-flink,embedded-resource,Java,Visual Studio Code,Apache Flink,Embedded Resource,我正在用VS代码创建一个简单的Java项目,下面是项目结构。 我想在我的代码中引用wordcount.txt,但它找不到文件 以下是我的测试代码: public class BatchJob { public static void main(String[] args) throws Exception { // set up the batch execution environment final ExecutionEnvironment env = Execution

我正在用VS代码创建一个简单的Java项目,下面是项目结构。

我想在我的代码中引用
wordcount.txt
,但它找不到文件

以下是我的测试代码:

public class BatchJob {

public static void main(String[] args) throws Exception {
    // set up the batch execution environment
    final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
    //URL url = BatchJob.class.getClassLoader().getResource("resources/wordcount.txt");
    DataSource<String> dataset = env.readTextFile("wordcount.txt");
    DataSet<Tuple2<String, Integer>> result = dataset.flatMap(new Tokenizer())
                                                    .filter(new FilterFunction<Tuple2<String, Integer>>(){
                                                        @Override
                                                        public boolean filter(Tuple2<String, Integer> arg0){
                                                            return arg0.f1 >0;
                                                        }
                                                    })
                                                    .groupBy(0)
                                                    .sum(1);
                                                    result.print();
    
}
public static class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>>{
    @Override
    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
        String[] tokens = value.toLowerCase().split(",");
        for (String token : tokens) {
            if ( !token.isEmpty() && token.length() > 0) {
                out.collect(new Tuple2<String, Integer>(token, 1));
            }
        }
    }
}
公共类批处理作业{
公共静态void main(字符串[]args)引发异常{
//设置批处理执行环境
final ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
//URL URL=BatchJob.class.getClassLoader().getResource(“resources/wordcount.txt”);
DataSource dataset=env.readTextFile(“wordcount.txt”);
DataSet结果=DataSet.flatMap(新标记器())
.filter(新的FilterFunction(){
@凌驾
公共布尔过滤器(Tuple2 arg0){
返回arg0.f1>0;
}
})
.groupBy(0)
.总数(1);
result.print();
}
公共静态类标记器实现FlatMapFunction{
@凌驾
公共void flatMap(字符串值,收集器输出)引发异常{
String[]tokens=value.toLowerCase().split(“,”);
for(字符串标记:标记){
如果(!token.isEmpty()&&token.length()>0){
out.collect(新的Tuple2(令牌,1));
}
}
}
}

}

应用程序资源在部署时将成为嵌入式资源,因此现在就开始访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见

感谢您的工作,请使用
getResource
。这是工作票 代码

URL=BatchJob.class.getClassLoader().getResource(“wordcount.txt”);
DataSource dataset=env.readTextFile(
解码(url.getFile(),“UTF-8”);
不幸的是,此修复程序在
url.getFile()
处出错


回到原始建议的粗体部分。。“.必须通过URL而不是文件进行访问”:这不是一个建议或仅仅是一个好的编程实践,而是一个要求。问题是,一旦应用程序启动。构建时,资源将位于Jar中,不再是
文件。它将无法作为
文件访问。因此,当从IDE运行它时(当URL指向是一个文件时),它可能会工作,构建的Jar将失败。

执行Java程序时,当前工作目录是什么?是否尝试提供文件的完整路径?文本文件似乎与类BatchJob位于同一文件夹/包中。因此,您应该使用getResource(“wordcount.txt”)@Sascha访问您的资源。您应该使用getResource(“wordcount.txt”)访问您的资源。这是正确的。如果IDE在构建应用程序时生成的最终Jar中包含此类文件。需要注意的原因是,大多数IDE都要求非Java源(类)文件位于特定路径中才能包含。对于Eclipse和Netbeans,这将是
resources/
(来自内存)。@MollyWang感谢您的建议,我将等待
AndrewThompson
先发布答案,如果他没有发布答案,我将在短时间内再次共享。请查看更新以获得答案!
URL url = BatchJob.class.getClassLoader().getResource("wordcount.txt"); 
DataSource<String> dataset = env.readTextFile(
    URLDecoder.decode(url.getFile(),"UTF-8") );