我正在为我在JRuby中创建的库创建一个Java包装器,但我无法读取JAR中的文件。
我已经打开了JAR,文件就在那里,位于JAR的根文件夹中。
但是,当我尝试运行时:
File.read("myfile.txt")
它会抛出以下错误:
C:\temp>java -jar c:\libraries\XmlCompare.jar
file:/C:/libraries/XmlCompare.jar!/lib/xmlcompare/app.rb:19:in `initialize':
No such file or directory - myfile.txt (Errno::ENOENT)
我甚至尝试将路径设为绝对路径(假设文本文件位于根目录,正在执行的ruby源位于lib / xmlcompare中),执行以下操作:
File.read("#{File.dirname(__FILE__)}/../../myfile.txt")
但后来我得到了:
C:\temp>java -jar c:\libraries\XmlCompare.jar
file:/C:/libraries/XmlCompare.jar!/lib/xmlcompare/app.rb:19:in `initialize':
No such file or directory -
file:/C:/libraries/XmlCompare.jar!/lib/xmlcompare/../../myfile.txt
(Errno::ENOENT)
关于如何使这项工作的任何想法?
答案 0 :(得分:5)
正如欧内斯特所指出的,这可以用JRuby以Java方式完成:
require 'java'
require 'XmlCompare.jar'
f = java.lang.Object.new
stream = f.java_class.resource_as_stream('/myfile.txt')
br = java.io.BufferedReader.new(java.io.InputStreamReader.new(stream))
while (line = br.read_line())
puts line
end
br.close()
答案 1 :(得分:1)
在Java中,您使用例如Class.getResourceAsStream()从jar中读取文件。我不知道JRuby,但我怀疑那是你将要做的事情,回到Java(但是可行)并从getResource()调用之一获取InputStream。 jar条目不可以作为Java中的文件访问,所以我不希望它在JRuby中可以访问。
答案 2 :(得分:0)
对我来说
f = java.lang.Object.new
stream = f.java_class.resource_as_stream('/myfile.txt') returned nil.
以下方式在ruby中运作良好
stream = self.to_java.get_class.get_class_loader.get_resource_as_stream('myfile.txt')