To force JVM load classes already loaded

How to force JVM, from java code, to load any classes already loaded, in order to reload a class modified in time the java program is runnig.

You have to do it yourself by loading the classes from your own ClassLoader. Everytime you want to reload you classes just create a new instance of your ClassLoader and load the class again from that ClassLoader. This is how servlet and jsp engines like Tomcat do it.

Similar Messages

  • Is there any way to force jvm load a new class?

    I write a standalone command line program. This program calls a function which I added to an existing class. the existing class has run run for a while by other processes.
    When I run my command line program, it can not find the function I added to the existing class. But I am 100% sure I have overwrote the existing class file with my new copy. It looks like the old class file is still in effect.
    How can I instruct the JVM to load my new class file, not using the old one(maybe it is cached in memory, and didn't get refreshed)
    Welcome any suggestions. I have run out of idea. (BTW: It is infeasible for me to restart the computer)

    Classes are loaded by an object called a ClassLoader which stores all the classes it loads in some kind of internal Map object. If you ask the same ClassLoader for a class it's already loaded it will given you the old one.
    The only way to drop a class is to drop the ClassLoader which loaded it and create a new one to load a new version.
    What you need to do is to put the class file in question is a directory or jar which isn't on the class path. And make sure that no class file of the same name exists on the classpath (because that will be loaded in preference).
    Then you create a java.net.URLClassLoader pointing to the directory or jar (use FIle.toURL() to turn a file into a URL).
    Then call loadClass on that to load your class file. Then you'll probably have to call newInstance() on the class object to create an instance.
    Of course, if new method signatures are added you'll have to access them using Method objects, since they won't be know about at compile time.

  • Force the loading of a class from disk

    Is it possible to force the loading of a class from disk ? The assumption here is that the class we want to load will be continuously updated so we want the latest version of the class(on disk) rather than the one already in memory.
    Thank you.

    You have to implement a custom loader.
    public class MyLoader extends URLClassLoader
      public (URL[] urls)
        super(urls);
      public synchronized loadClass(String className) throws ClassNotFoundException
        // first check built in JDK 1.2 class cache
        Class clazz = findLoadedClass(className);
        if (null == clazz)
          // Didn't find it in cache, so check our custom
          // URL[] classpath, added at the constructor.
          clazz = findClass(className);
          if (null == clazz)
            // Didn't find it in our classpath, so either
            // throw a ClassNotFoundException, or call to
            // the parent if we want to go that way.
            throw new ClassNotFoundException();
        return clazz;
    }In the above, you can do all sort of things. We don't delegate to the parent at all, so if the class being looked for is NOT in any of the URL[] objects passed in when created, then a ClassNotFoundException is thrown. The normal delegation checks cache, then the parent loader, then the findClass(). We simply remove the check to the parent, and try the findClass() right away. Because URLClassLoader implements findClass() to look for a .class in ALL of the URL[] objects passed to it, we don't need to bother with that at all.
    Does that help? Ask away if you have more questions.

  • JVM Loads Class fine-- MVM says classNotFoundError

    I have written a simple applet for use on my personal web site. When using the JVM the class loads fine, but the Microsoft VM won't load the class and when I check the console I find the classNotFoundError. Can anyone tell me why? (not just that M sucks)

    Thanks so much for your attention to my little dilemma. here is the applet and HTML:
    import java.applet.Applet;
    import java.awt.*;
    import java.awt.event.*;
    public class ImgView extends java.applet.Applet {
    public Image imgList[];
    public Image imgChoice;
    private Button btnNext, btnPrev;
    private String loc;
    private int totImgs;
    private int imgIndex;
    public void init() {
    setBackground(Color.black);
    String temp = getParameter("nimgs");
    totImgs = Integer.valueOf(temp).intValue();
    imgIndex = totImgs - 1;
    imgList = new Image[totImgs];
    for (int i = 0; i < totImgs; ++i) {
    imgList[i] = getImage(getDocumentBase(), "G" + i + ".jpg");
    imgChoice = imgList[imgIndex];
    Panel p = new Panel(new FlowLayout(FlowLayout.LEFT));
    p.add(btnPrev = new Button("Prev Image"));
    btnPrev.addActionListener(
    new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
         if (imgIndex == totImgs - 1) {
         imgIndex = 0;
         imgChoice = imgList[imgIndex];
         else {
         imgIndex++;
         imgChoice = imgList[imgIndex];
         repaint();
    p.add(btnNext = new Button("Next Image"));
    btnNext.addActionListener(
         new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
         if (imgIndex == 0) {
         imgIndex = totImgs - 1;
         imgChoice = imgList[imgIndex];
         else {
         imgIndex--;
         imgChoice = imgList[imgIndex];
         repaint();
    add(p);
    public void paint(Graphics g) {
    g.clearRect(0,0,500,400);
    g.drawImage(imgChoice, 40, 45, this);          
    and the HTML:
    <td width=500 background="appGrfx/appbgcolor.jpg">
    <applet code="ImgView.class" width=500 height=400>
    alt="Your browser can not display this Applet."
    <param name=nimgs value="4">
    Your browser can not recognize Applets.
    </applet>
    </td>
    Thanks again for any advice!

  • Forcing JVM to unload bytecode at runtime, to allow reloading of new class?

    Hi all,
    I would like to know a few things about classes once they are loaded. I believe a loaded class is nothing more than an Object in terms of its lifecycle, correct? If so, then to make a class "unload", you simply have to make sure there are no references to the class correct? So, what are the rules for making sure nothing references a class instance?
    Below I'll list a couple of examples. In Example 1 below, I have class A, B and C. Class A creates a instance variable to class B. In the constructor of class A, it creates a temporary class C, passing to it a reference of itself, which C stores in a local variable. Now, in class C, since it is only created in a Constructor (or method) in class A, it goes out of scope at the end of the method/constructor, and thus its reference to class A is no longer any good, correct? Therefore, at this point, there are no references to class A and thus setting A = null (assuming a "central" class loads class A, B and C like a plugin engine would do) should properly dispose of class A. I know, the GC does NOT necessarily remove the class A bytecode from memory right away. So I guess a question here is in need. When does the class A bytecode actually get removed from the JVM memory, in such a way that a "new" call to create it would effectively tell the JVM to have to open the .class file, read its byte code and create a new instance of it in memory? The purpose of these questions is to figure out how, at runtime to reload a class AND get the actual new version of the code. The reason is, if you do everything possible to unload a class, but the JVM doesn't discard the bytecodes of the class before you tell it to load the same class, it will use the "old" bytecode it has in memory, rather than load the bytecode off the HD or URL location and discard the old bytecode. I need a way to get the JVM to discard the bytecode to reload a newer version of a class. But the reason for the examples below is to also help me understand how a class is actually permitted to be unloaded by the JVM. This is also so that the JVM is not wasting memory with multiple versions of the same class, if it even does that. I want to definitely reclaim any memory used by the older version of the class, before loading a newer version.
    So, in example 2 below, the situation changes slightly. A is now keeping a reference to the class C it creates in the constructor. Because C also creates a reference back to A since the A instance is passed in to C's constructor, A can now not be freed and made available for unloading until the reference to A in C is set to null, is this correct? I seem to lack basic understanding of how the whole reference counting thing works for objects and when a JVM can actually unload the bytecode of an object, thus freeing up memory. I suppose a good book on the JVM would clear this up, but I am hoping one of you reading this will know and can help me understand this process. So in this example, am I correct in that the C reference to A must be set to null, then the A instance must be set to null to tell the JVM there is no more use for the A class? I do realize that if other classes also use A, that the bytecode for A would be kept in memory. Let's assume this is the only use of A, B and C (and looking at the examples, B serves no real purpose anyway, but I already wrote it down so I'll leave it).
    So once again, my goal here is to understand the lifecycle of an object, specifically a Class object (they are one and the same, correct, in terms of lifecycle?), and when the JVM actually removes the bytecode from memory so that if a new version of the same class is now available at runtime, the JVM loads the new bytecode into memory.
    Thanks very much for taking the time to read this and reply.
    Example 1:
    class A
    B b = new B();
    public A()
    C c = new C(this);
    class B
    public B()
    class C
    A a = null;
    public C(A a)
    this.a = a;
    Example 2:
    class A
    B b = new B();
    C c = null;
    public A()
    c = new C(this);
    class B
    public B()
    class C
    A a = null;
    public C(A a)
    this.a = a;
    }

    Cross post (numerous times.)
    http://forum.java.sun.com/thread.jsp?thread=292465&forum=37&message=1152136

  • JVM Loader Error: Unable to find supported JDK or JRE version

    Hello,
    I am trying to use Visibroker (Borland version 6.5) with JDK 1.5.2
    When I try to run idl2java, it gives me the following message:
    JVM Loader Error:
    Unable to find a supported JDK or JRE version. The JVM Version should be either 1.3.1 or 1.4.1 and above.
    Check your installation and use -VBJjavavm or -javahome(vbj only) to specify the JDK or JRE location
    I am using eclipse IDE - i created an external tool configuration for idl2java giving the argument *.idl
    I looked in the forum and tried the suggestions given in this thread
    http://forum.java.sun.com/thread.jspa?threadID=376403&messageID=3052413
    Where am I going wrong. Can someone help me?
    Thaks
    Manju

    Hi,
    I don't know if you got an answer to this problem. It looks like you need to install Borland Service Pack 1 (for BES 6.5) to fix this issue. I spent a couple of days squirming, trying to figure out this issue.
    Hope this helps.
    Regards,
    Sony.

  • INVALID CLASS:model_cmd_bean as model class already exists.

    Hello all,
    I am gettin the following error:INVALID CLASS:model_cmd_bean as model class already exists. while creating a java bean Model.
    but this is the 1st time i m using these wraper class and cmd class for creating a model.
    Sugest what shoul i do?

    Hi,
    Welcome to SDN Community
    Check these forum links,
    Import JavaBean Error : Invalid Class
    invalid class - ..as Model Class already exist
    Hope this helps.
    Regards
    Srinivasan T

  • JVM PermGen Class Loading & Unloading Concern

    Hi All,
    My application is spitting out lot of following statements periodically:
    [Loaded sun.reflect.GeneratedMethodAccessor833 from __JVM_DefineClass__] ..
    and ocassionally,
    [Unloading class sun.reflect.GeneratedMethodAccessor1220]
    My application uses lot of RMI and serialization & desrialization process. Initially, it was causing my application to slow down and later on we did the following:
    - Increased the PermGen space.
    - Tune the Garbage Collection Policy for Heap (Enabled ConcurrentMarkSweepGC and ParNewGC)
    After making above changes, we have restarted the application and not experienced slowness again (though we are still monitoring the application). But above statements are still visible, I have following questions:
    - Why "GeneratedMethodAccessor" is being loaded again and again? I guess these are required for accessing or invoking methods on serialized objects and proxy. But aren't they cached as reference in the main class that was loaded by JVM?
    - Does "Unloading class sun.reflect.GeneratedMethodAccessor1220" happen only after full GC runs? In actual, when it actually starts unloading these references?
    Any help shall be really appreciated?

    To add to the above, the classes get unloaded if they are collected.  To be collected they must be eligible.  And the only way that happens if the following are both true.
    1. The class loader is eligible for collection.
    2. There are no active references.

  • The NYT website won't stop loading whenever it does an auto-update. While this loading continues, other websites are unresponsive until I force the loading to terminate. This started happening with FF 4.0.1.

    When I do a manual refresh on certain sites like NY Times or CNN, or when sites like NYT periodically push an update through, the updates won't stop loading. It's as though the update never completes. The rotating circle icon on the affected tab just continues indefinitely. While this is happening, other websites that I try to open or update are either very slow or unresponsive.
    My fix has been to force the update to terminate by using the red X button next to the website name. Then other websites respond normally but often the one that I have manually stopped becomes unresponsive.

    Start Firefox in <u>[[Safe Mode]]</u> to check if one of the extensions is causing the problem (switch to the DEFAULT theme: Firefox (Tools) > Add-ons > Appearance/Themes).
    * Don't make any changes on the Safe mode start window.
    * https://support.mozilla.com/kb/Safe+Mode
    If it does work in Safe-mode then disable all extensions and then try to find which is causing it by enabling one at a time until the problem reappears.
    * Use "Disable all add-ons" on the [[Safe mode]] start window to disable all extensions.
    * Close and restart Firefox after each change via "File > Exit" (Mac: "Firefox > Quit"; Linux: "File > Quit")
    In Firefox 4 you can use one of these to start in <u>[[Safe mode]]</u>:
    * Help > Restart with Add-ons Disabled
    * Hold down the Shift key while double clicking the Firefox desktop shortcut (Windows)
    * https://support.mozilla.com/kb/Troubleshooting+extensions+and+themes

  • JVM loads slowly

    I'm an amateur developer who's been trying to learn Java because I've heard a lot of good things about Java on the Mac, making me question my bad experiences with Java on Macs.
    Any time I try to start a Java app, there is a 3-4 minute delay between the time I activate it and the time the icon appears in the application switcher (the thing that pops up when you hit Apple-Tab). During this time the icon appears in the Dock without a black triangle underneath. Java applets take a similar amount of time to load (so I'm now intimately familiar with the coffee cup Icon), as does javac at the command line. This startup time, however, is only for the first time I run any Java application or javac; it's much shorter the second time. The only thing that doesn't take this much time to load is OpenOffice under X11.
    My hypothesis is that JVM startup time is causing this load. Is this just an inherent problem with the way the JVM is implemented in OSX, or is this just a quirk on my system? If it's a problem with my setup, any suggestions for what I can do? Could it be the fact that I have too many old versions of Java on my computer?
    14" iBook G4   Mac OS X (10.4.9)  

    Hi fractals
    Before we go any further we need to find out which version of Java is causing the problem. In the Terminal program, type "java -version" (without the quotes) and observe the behaviour. Hopefully, you'll get the long delay you mentioned earlier, but it will eventually print out the java version. This should serve to identify exactly which Java version has the problem. If you don't get the long delay, or it hangs without ever printing out the version then you need to follow these steps. In Terminal type:
    cd /System/Library/Frameworks/JavaVM.framework/Versions/1.3/Commands
    ./java -version
    cd /System/Library/Frameworks/JavaVM.framework/Versions/1.4/Commands
    ./java -version
    cd /System/Library/Frameworks/JavaVM.framework/Versions/1.5/Commands
    ./java -version
    (you can cut and paste these commands from here)
    With any luck this will identify the faulty Java version. Come back when you know which one it is.
    Bob

  • Java.policy code delays JVM loading

    Hello All!!
    My java.policy code has 46 grant lines due to different permissions of different applets and servers.
    When I want to run some of this applets I've a delay of 90 seconds to load the JVM.
    I think I'm verifying that exist all of my servers in java.policy because i've a very high delay, but I think it wouldn't be that way.
    My questions are: will do I encrease the delay if I encrease the number of applets or servers? I'm working with JDK1.3, does anybody knows if this verssion is limited?

    Nowhere. Use the -Xbootclasspath option of 'java'.

  • How to find JVM load.

    Is there anyway to calculate the % of load the JVM is using? I think Runtimeexec() will help. but i dont know how to use it. Somebody please help me. Thanks in advance....

    sowndar wrote:
    Sorry for insufficient data. I am gonna provide priority to other processes and allocating 50% of CPU for java. So when my java program consumes more than 50% CPU load, it shud terminate. Is it possible to measure JVM's consumption of load?It is possible, but when ever your program is using the CPU it is momentarily using 100% of the CPU load. i.e. when your program runs it uses a whole core. (never half a core)
    If you see a 50% load it means an average over some period of time. Depending on the period of time effects the average. e.g. if you take the average cpu since the machine booted you might not get more than 5% and if you average over 10 ms, you will get 100% whenever the process does something which takes 10 ms.
    You need to workout what your period of time is.
    However it sounds like a hack when you should be trying solve whatever you problem is a better way.

  • How to force SQL*Loader to assign the same SYSDATE for all rows?

    I want to use SQL*Loader to load some rows and a "SYSDATE" generated column, but making sure this date is THE SAME for all rows. I have seen that if I load HUNDREDS of rows there is a little difference between them (in terms of seconds). I guess it is "the moment each row entered the DB", but I need the same value for all rows (preferably, "the moment SQL*Loader was launched"). Is there any way to achieve this?
    Thank you very much.

    Hello user2393320.
    Given some thought, using a date value to identify all records from a single load isn't very wise.
    Are you able to create a procedure on the database that could be executed during SQL*Loader's execution? If so, you could develop the procedure to take in the record number of the row being loaded as an input parameter and output this unique date value for all rows loaded. The procedure would need to store the date value in a table when the first row is being loaded and return the stored date value as its output. This obviously assumes that only one sqlldr session is running at any time.
    I highly recommend using a numeric sequence in the control file instead of a date to identify each file load:
    , file_load_seq SEQUENCE(MAX, 1)
    Another approach would be to load the record number being loaded in addition to the sysdate:
    , record_number RECNUM
    Hope this helps,
    Luke

  • Adding Phidgets force sensor ( load cell ) to a Labview VI...

    I have an exiting Labview VI, program has been running for a few years, now I need to add the Phidgets sensor ( load cell ).
    I don't write programs very often. I've added the channel and looked at some examples, but having issues finding the icons needed
    to make the load cell functional.

    There are several examples and help info:
    1) "Bridge - Continuous Input.VI" from labview help>find examples
    2) http://zone.ni.com/devzone/cda/epd/p/id/5902
    3) http://www.ni.com/white-paper/7138/en
    4) depending on what hardware you are using.. https://decibel.ni.com/content/docs/DOC-2018
    I hope this helps. If you give more specific info that might help. What do you have the load cell connected to?

  • Force jvm to use UTF8 encoding for properties?

    hi,
    my problem is i cannot display turkish characters that are retrieved from properties file [(key, value) pair].The value may contain turkish characters.
    reference : java toc
    "..When saving properties to a stream or loading them from a stream, the ISO 8859-1 character encoding is used. For characters that cannot be directly represented in this encoding, Unicode escapes are used; however, only a single 'u' character is allowed in an escape sequence..."
    instead of iso 8859-1 or directly representing non-conforming characters in the form of UTF8 encoding , i want to use UTF8 . i dont know is there a way to enforce the encoding to UTF8 .is it possible ?
    note : javac -encoding or java -Djava.encoding has no use..
    thanx in advance

    Hi,
    I did a lot of testing with the method of my last posting and ran into the following problem: each character, that is not available in iso 8859-1 is discarded and replaced by a '?'. So when e.g. loading arabic characters you get just "?????" as your property's value.
    The only possibility to enable other encodings of Property Files is to replace the encoding of the reader to one that is better suited. So I created a customized class, that inherits from java.util.Properties, and supports loading and storing to any encoding. This class I give here:
    * Properties.java
    * Created on 11. Juni 2003, 14:08
    package xy;
    * The <code>Properties</code> class represents a persistent set of
    * properties. The <code>Properties</code> can be saved to a stream
    * or loaded from a stream. Each key and its corresponding value in
    * the property list is a string.
    * <p>
    * A property list can contain another property list as its
    * "defaults"; this second property list is searched if
    * the property key is not found in the original property list.
    * <p>
    * Because <code>Properties</code> inherits from <code>Hashtable</code>, the
    * <code>put</code> and <code>putAll</code> methods can be applied to a
    * <code>Properties</code> object.  Their use is strongly discouraged as they
    * allow the caller to insert entries whose keys or values are not
    * <code>Strings</code>.  The <code>setProperty</code> method should be used
    * instead.  If the <code>store</code> or <code>save</code> method is called
    * on a "compromised" <code>Properties</code> object that contains a
    * non-<code>String</code> key or value, the call will fail.
    * <p>
    * <a name="encoding"></a>
    * When saving properties to a stream or loading them from a stream, the
    * ISO 8859-1 character encoding can be used. For characters that cannot be directly
    * represented in this encoding,
    * <a href="http://java.sun.com/docs/books/jls/html/3.doc.html#100850">Unicode escapes</a>
    * are used; however, only a single 'u' character is allowed in an escape sequence.
    * The native2ascii tool can be used to convert property files to and from
    * other character encodings.
    * </p>
    * <p>
    * This Properties class is an extension of the default properties class an supports the
    * loading and saving from and into other encodings than ISO 8859-1.
    * </p>
    * @see <a href="../../../tooldocs/solaris/native2ascii.html">native2ascii tool for Solaris</a>
    * @see <a href="../../../tooldocs/win32/native2ascii.html">native2ascii tool for Windows</a>
    * @author  Gregor Kappler, extended the class of JDK by
    * @author  Arthur van Hoff
    * @author  Michael McCloskey
    * @version 1.64, 06/26/00
    * @since   JDK1.0
    public class Properties extends java.util.Properties {
        private static final String keyValueSeparators = "=: \t\r\n\f";
        private static final String strictKeyValueSeparators = "=:";
        private static final String specialSaveChars = "=: \t\r\n\f#!";
        private static final String whiteSpaceChars = " \t\r\n\f";
        /** Creates a new instance of Properties */
        public Properties() {
         * Reads a property list (key and element pairs) from the input stream.
         * The stream is assumed to be in the specified character encoding.
         * <p>
         * Every property occupies one line of the input stream. Each line
         * is terminated by a line terminator (<code>\n</code> or <code>\r</code>
         * or <code>\r\n</code>). Lines from the input stream are processed until
         * end of file is reached on the input stream.
         * <p>
         * A line that contains only whitespace or whose first non-whitespace
         * character is an ASCII <code>#</code> or <code>!</code> is ignored
         * (thus, <code>#</code> or <code>!</code> indicate comment lines).
         * <p>
         * Every line other than a blank line or a comment line describes one
         * property to be added to the table (except that if a line ends with \,
         * then the following line, if it exists, is treated as a continuation
         * line, as described
         * below). The key consists of all the characters in the line starting
         * with the first non-whitespace character and up to, but not including,
         * the first ASCII <code>=</code>, <code>:</code>, or whitespace
         * character. All of the key termination characters may be included in
         * the key by preceding them with a \.
         * Any whitespace after the key is skipped; if the first non-whitespace
         * character after the key is <code>=</code> or <code>:</code>, then it
         * is ignored and any whitespace characters after it are also skipped.
         * All remaining characters on the line become part of the associated
         * element string. Within the element string, the ASCII
         * escape sequences <code>\t</code>, <code>\n</code>,
         * <code>\r</code>, <code>\\</code>, <code>\"</code>, <code>\'</code>,
         * <code>\  </code>  (a backslash and a space)
         * are recognized and converted to single
         * characters. Moreover, if the last character on the line is
         * <code>\</code>, then the next line is treated as a continuation of the
         * current line; the <code>\</code> and line terminator are simply
         * discarded, and any leading whitespace characters on the continuation
         * line are also discarded and are not part of the element string. <br>
         * Note:
         * <code>\u</code><i>xxxx</i> is not supported if the encoding is not
         * ISO 8859-1!
         * <p>
         * As an example, each of the following four lines specifies the key
         * <code>"Truth"</code> and the associated element value
         * <code>"Beauty"</code>:
         * <p>
         * <pre>
         * Truth = Beauty
         *     Truth:Beauty
         * Truth               :Beauty
         * </pre>
         * As another example, the following three lines specify a single
         * property:
         * <p>
         * <pre>
         * fruits                    apple, banana, pear, \
         *                                  cantaloupe, watermelon, \
         *                                  kiwi, mango
         * </pre>
         * The key is <code>"fruits"</code> and the associated element is:
         * <p>
         * <pre>"apple, banana, pear, cantaloupe, watermelon, kiwi, mango"</pre>
         * Note that a space appears before each <code>\</code> so that a space
         * will appear after each comma in the final result; the <code>\</code>,
         * line terminator, and leading whitespace on the continuation line are
         * merely discarded and are <i>not</i> replaced by one or more other
         * characters.
         * <p>
         * As a third example, the line:
         * <p>
         * <pre>cheeses
         * </pre>
         * specifies that the key is <code>"cheeses"</code> and the associated
         * element is the empty string.<p>
         * @param      inStream   the input stream.
         * @exception  IOException  if an error occurred when reading from the
         *               input stream.
        public synchronized void load(java.io.InputStream inStream, java.nio.charset.Charset encoding) throws java.io.IOException {
            if (encoding.equals (encoding.forName("8859_1"))) {
                super.load (inStream);
                return;
            java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(inStream, encoding));
         while (true) {
                // Get next line
                String line = in.readLine();
                if (line == null)
                    return;
                if (line.length() > 0) {
                    // Continue lines that end in slashes if they are not comments
                    char firstChar = line.charAt(0);
                    if ((firstChar != '#') && (firstChar != '!')) {
                        while (continueLine(line)) {
                            String nextLine = in.readLine();
                            if(nextLine == null)
                                nextLine = "";
                            String loppedLine = line.substring(0, line.length()-1);
                            // Advance beyond whitespace on new line
                            int startIndex=0;
                            for(startIndex=0; startIndex<nextLine.length(); startIndex++)
                                if (whiteSpaceChars.indexOf(nextLine.charAt(startIndex)) == -1)
                                    break;
                            nextLine = nextLine.substring(startIndex,nextLine.length());
                            line = new String(loppedLine+nextLine);
                        // Find start of key
                        int len = line.length();
                        int keyStart;
                        for(keyStart=0; keyStart<len; keyStart++) {
                            if(whiteSpaceChars.indexOf(line.charAt(keyStart)) == -1)
                                break;
                        // Blank lines are ignored
                        if (keyStart == len)
                            continue;
                        // Find separation between key and value
                        int separatorIndex;
                        for(separatorIndex=keyStart; separatorIndex<len; separatorIndex++) {
                            char currentChar = line.charAt(separatorIndex);
                            if (currentChar == '\\')
                                separatorIndex++;
                            else if(keyValueSeparators.indexOf(currentChar) != -1)
                                break;
                        // Skip over whitespace after key if any
                        int valueIndex;
                        for (valueIndex=separatorIndex; valueIndex<len; valueIndex++)
                            if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1)
                                break;
                        // Skip over one non whitespace key value separators if any
                        if (valueIndex < len)
                            if (strictKeyValueSeparators.indexOf(line.charAt(valueIndex)) != -1)
                                valueIndex++;
                        // Skip over white space after other separators if any
                        while (valueIndex < len) {
                            if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1)
                                break;
                            valueIndex++;
                        String key = line.substring(keyStart, separatorIndex);
                        String value = (separatorIndex < len) ? line.substring(valueIndex, len) : "";
                        // Convert then store key and value
                        key = loadConvert(key);
                        value = loadConvert(value);
                        put(key, value);
         * Writes this property list (key and element pairs) in this
         * <code>Properties</code> table to the output stream in a format suitable
         * for loading into a <code>Properties</code> table using the
         * <code>load</code> method.
         * The stream is written using the ISO 8859-1 character encoding.
         * <p>
         * Properties from the defaults table of this <code>Properties</code>
         * table (if any) are <i>not</i> written out by this method.
         * <p>
         * If the header argument is not null, then an ASCII <code>#</code>
         * character, the header string, and a line separator are first written
         * to the output stream. Thus, the <code>header</code> can serve as an
         * identifying comment.
         * <p>
         * Next, a comment line is always written, consisting of an ASCII
         * <code>#</code> character, the current date and time (as if produced
         * by the <code>toString</code> method of <code>Date</code> for the
         * current time), and a line separator as generated by the Writer.
         * <p>
         * Then every entry in this <code>Properties</code> table is written out,
         * one per line. For each entry the key string is written, then an ASCII
         * <code>=</code>, then the associated element string. Each character of
         * the element string is examined to see whether it should be rendered as
         * an escape sequence. The ASCII characters <code>\</code>, tab, newline,
         * and carriage return are written as <code>\\</code>, <code>\t</code>,
         * <code>\n</code>, and <code>\r</code>, respectively. Characters less
         * than <code>\u0020</code> and characters greater than
         * <code>\u007E</code> are written as <code>\u</code><i>xxxx</i> for
         * the appropriate hexadecimal value <i>xxxx</i>. Leading space characters,
         * but not embedded or trailing space characters, are written with a
         * preceding <code>\</code>. The key and value characters <code>#</code>,
         * <code>!</code>, <code>=</code>, and <code>:</code> are written with a
         * preceding slash to ensure that they are properly loaded.
         * <p>
         * After the entries have been written, the output stream is flushed.  The
         * output stream remains open after this method returns.
         * @param   out      an output stream.
         * @param   header   a description of the property list.
         * @exception  IOException if writing this property list to the specified
         *             output stream throws an <tt>IOException</tt>.
         * @exception  ClassCastException  if this <code>Properties</code> object
         *             contains any keys or values that are not <code>Strings</code>.
         * @exception  NullPointerException  if <code>out</code> is null.
         * @since 1.2
        public synchronized void store(java.io.OutputStream out, java.nio.charset.Charset encoding, String header)
        throws java.io.IOException
            if (encoding.equals (encoding.forName("8859_1"))) {
                super.store (out,header);
                return;
            java.io.BufferedWriter awriter;
            awriter = new java.io.BufferedWriter(new java.io.OutputStreamWriter(out,encoding));
            if (header != null)
                writeln(awriter, "#" + header);
            writeln(awriter, "#" + new java.util.Date().toString());
            for (java.util.Enumeration e = keys(); e.hasMoreElements();) {
                String key = (String)e.nextElement();
                String val = (String)get(key);
                key = saveConvert(key, true);
             /* No need to escape embedded and trailing spaces for value, hence
              * pass false to flag.
                val = saveConvert(val, false);
                writeln(awriter, key + "=" + val);
            awriter.flush();
         * changes special saved chars to their original forms
        private String loadConvert (String theString) {
            char aChar;
            int len = theString.length();
            StringBuffer outBuffer = new StringBuffer(len);
            for(int x=0; x<len; ) {
                aChar = theString.charAt(x++);
                if (aChar == '\\') {
                    aChar = theString.charAt(x++);
                    if (aChar == 't') aChar = '\t';
                    else if (aChar == 'r') aChar = '\r';
                    else if (aChar == 'n') aChar = '\n';
                    else if (aChar == 'f') aChar = '\f';
                    else if (aChar == '\\') aChar = '\\';
                    else if (aChar == '\"') aChar = '\"';
                    else if (aChar == '\'') aChar = '\'';
                    else if (aChar == ' ') aChar = ' ';
                    else
                        throw new IllegalArgumentException ("error in Encoding: '\\"+aChar+" not supported");
                    outBuffer.append(aChar);
                } else
                    outBuffer.append(aChar);
            return outBuffer.toString();
         * writes out any of the characters in specialSaveChars
         * with a preceding slash
        private String saveConvert(String theString, boolean escapeSpace) {
            int len = theString.length();
            StringBuffer outBuffer = new StringBuffer(len*2);
            for(int x=0; x<len; x++) {
                char aChar = theString.charAt(x);
                switch(aChar) {
              case ' ':
                  if (x == 0 || escapeSpace)
                   outBuffer.append('\\');
                  outBuffer.append(' ');
                  break;
                    case '\\':outBuffer.append('\\'); outBuffer.append('\\');
                              break;
                    case '\t':outBuffer.append('\\'); outBuffer.append('t');
                              break;
                    case '\n':outBuffer.append('\\'); outBuffer.append('n');
                              break;
                    case '\r':outBuffer.append('\\'); outBuffer.append('r');
                              break;
                    case '\f':outBuffer.append('\\'); outBuffer.append('f');
                              break;
                    default:
    //                    if ((aChar < 0x0020) || (aChar > 0x007e)) {
    //                        outBuffer.append(aChar);
    //                    } else {
                            if (specialSaveChars.indexOf(aChar) != -1)
                                outBuffer.append('\\');
                            outBuffer.append(aChar);
            return outBuffer.toString();
         * Returns true if the given line is a line that must
         * be appended to the next line
        private boolean continueLine (String line) {
            int slashCount = 0;
            int index = line.length() - 1;
            while((index >= 0) && (line.charAt(index--) == '\\'))
                slashCount++;
            return (slashCount % 2 == 1);
        private static void writeln(java.io.BufferedWriter bw, String s) throws java.io.IOException {
            bw.write(s);
            bw.newLine();
    }I hope you can use this class for your needs as I can. For me it supports any characters so far. If you find some bugs on it, let me know
    Regards,
    Gregor Kappler

Maybe you are looking for