Created a simple Class in ruby to help reading and writing property files
class JavaProps
attr :file, :properties
#Takes a file and loads the properties in that file
def initialize file
@file = file
@properties = {}
IO.foreach(file) do |line|
@properties[$1.strip] = $2 if line =~ /([^=]*)=(.*)\/\/(.*)/ || line =~ /([^=]*)=(.*)/
end
end
#Helpfull to string
def to_s
output = “File Name #{@file} \n”
@properties.each {|key,value| output += ” #{key}= #{value} \n” }
output
end
#Write a property
def write_property (key,value)
@properties[key] = value
end
#Save the properties back to file
def save
file = File.new(@file,”w+”)
@properties.each {|key,value| file.puts “#{key}=#{value}\n” }
end
end
What about escaping?
Hi! I am using your class in a project, and I would like to post it in my blog. I will put a link to here. Would you approve this? I hope to do so 🙂
Thanks!
Sure, I approve
By the way, my blog is: http://tiagoromero.wordpress.com/
If you agree, can you please post your response for me there?
Thanks again!
Good work
As a java developper , I keep my eye on other languages that can play a role in java-based systems, among them ruby.That’s why I’m really interested in learning Ruby. I found your code really helpful .
I’m expecting more useful RUBY tips from you for java developpers
Hi, if anyone interested I found this extended version based on the above.
http://github.com/axic/rsnippets/blob/master/javaproperties.rb
I improved the regular expression a little. And now it uses # for comments, which is the normal way in properties files.
properties[$1.strip] = $2.strip if line =~ /([^=#]+)=([^=#]+)/
a little improvement would be to alter your reader/writer methods to have array-like syntax:
class Props
def initialize(filename = nil)
@props = {}
if (filename) then
File.open(filename).
select { |line| not line=~/^[ \t]*(#.+)*$/ }. # ignore comments and blank lines
each { |line|
(k,v) = line.chomp.split(‘=’,2)
@props[k] = v
}
end
end
def []=(k,v)
@props[k]=v
end
def [](k)
@props[k]
end
def to_s
@props.map{ |k,v| “#{k}=#{v}”}.join(“\n”)
end
end
p = Props.new(‘test.properties’)
puts p[‘first’]
puts p.to_s
# cheers
Thanks for some other informative web site. The place else
may just I am getting that kind of info written in such an ideal manner?
I have a project that I am just now running on, and I have
been on the glance out for such information.
Its such as you read my mind! You seem to know a lot approximately this, such
as you wrote the ebook in it or something. I feel
that you just could do with a few p.c. to pressure the message house a bit, however instead
of that, this is great blog. An excellent read.
I will definitely be back.
What’s Going down i am new to this, I stumbled upon this I have discovered
It positively helpful and it has helped me out loads.
I am hoping to give a contribution & assist other users like its aided me.
Good job.
This is my version; i think it is easier to understand and to maintain. In particular it uses the regular expression as a filter and as a parser.
class Props
def initialize(filename = nil)
@props = {}
if (filename) then
File.open(filename).readlines.each do |line|
line.match(/\s*([a-zA-Z\._]+)\s*=\s*(.*)/) do |matchdata|
@props[matchdata[1]] = matchdata[2]
end
end
end
end
def []=(k, v)
@props[k]=v
end
def [](k)
@props[k]
end
def to_s
@props.map { |k, v| “#{k}=#{v}” }.join( “\n”)
end
end