如何使用JRuby读取Jar中的文件

时间:2011-03-31 02:45:25

标签: jar filesystems jruby

我正在为我在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)

关于如何使这项工作的任何想法?

3 个答案:

答案 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')