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

kol*_*rie 6 filesystems jar jruby

我正在为我在JRuby中创建的库编写Java包装器,我无法读取JAR中的文件.

我已经打开了JAR,文件就在那里,位于JAR的根文件夹中.

但是,当我尝试运行时:

File.read("myfile.txt")
Run Code Online (Sandbox Code Playgroud)

它会引发以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

我甚至试图使路径绝对(假设文本文件位于根目录,正在执行的ruby源位于lib/xmlcompare中),通过执​​行以下操作:

File.read("#{File.dirname(__FILE__)}/../../myfile.txt")
Run Code Online (Sandbox Code Playgroud)

但后来我得到:

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)
Run Code Online (Sandbox Code Playgroud)

我对如何使这项工作有任何想法?

Séb*_*nec 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()
Run Code Online (Sandbox Code Playgroud)