Home > جافا Java > Reading From Resources in Java Archive File

Reading From Resources in Java Archive File

سبتمبر 12th, 2009 Wajdy Essam

بسم الله الرحمن الرحيم

أغلب المستخدمين لا يفضلوا التعامل مع الكثير من الإعدادت والملفات عند التعامل مع البرامج ، فقط يريدوا عمل البرنامج بالشكل المطلوب بمجرد النقر دبل كليك على البرنامج . ونتيجه لذلك فجافا وفرت طريقة لعمل البرامج قابلة للتشغيل مباشره بدون الذهاب لسطر الأوامر وتشغيل الjvm وهذه الأمور المملة للمستخدم والمبرمج أيضا :) .

في جافا 6 تستطيع انشاء ملف الجار وتحديد الملف الذي سيعمل مباشره من خلال الأمر التالي :
jar cvfe YourJarFileName.jar YourMainClass file1 file2 …. fileN

وعند تشغيل البرنامج في أي منصه سواء Windows/Mac OS/Solaris سوف يعمل مباشره ، وفي الحقيقة لكل نظام تشغيل طريقة معينة للتشغيل تختلف عن الأخر فمثلا في Windows عند تنزيل الجافا على الجهاز سوف يقوم بعمل نوع امتداد جديد بالإسم .jar وعند تشغيلك لأي ملف من هذا النوع سوف ينفذ الأمر التالي javaw وهو أيضا لتشغيل الjvm مثله مثل java ولكن الأول يختلف بأنه لا ينشئ Shell/Console Window . وهناك برامج تحول ملف الجار الى ملف تنفيذي native execute file مثل Launch4j أو JSmooth أو IzPack وغيرها من البرمجيات .

موضوعنا في هذه التدوينة هو كيفية قرائه الResources (سواء صور أو ملفات صوت أو ملفات نصية ) من ملف الجار بطريقة صحيحه حيث يجب استدعاء الدالة getResource من الكلاس الحالي الذي يعمل .

ولكي نوضح الموضوع بشكل أكبر ، سنأخذ مثال عادي على قرائه نص من ملف ووضعه في JTextArea اضافة لوضع أيقونه في التطبيق ومن ثم تحويله لملف جار ..

المثال كالتالي :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Read Resources from Jar File

import java.awt.Toolkit ;
import java.awt.Dimension ;
import java.awt.EventQueue;
import java.awt.Image ;
import javax.swing.JFrame ;
import javax.swing.JTextArea ;
import java.util.Scanner ;
import java.io.File ;
import java.io.FileNotFoundException ;

public class TestResource {
    public static void main (String [] args ) {
        EventQueue.invokeLater( new Runnable() {
            public void run () {
                TestResourceFrame frame  = new TestResourceFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class TestResourceFrame extends JFrame {
    public TestResourceFrame() {
        // get environment properities
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        int width = screenSize.width ;
        int height = screenSize.height ;
       
        // set size for application
        setSize ( width/2 , height/2);
       
        // set location of application
        setLocationByPlatform(true);
       
        // set Icon for application
        Image img = kit.getImage("clicknrun.png");
        setIconImage(img) ;
       
        // set Title of Application
        setTitle("Simple Test");
       
        // setResizable
        //setResizable(false);
       
        // add TextArea
        try {
            addText();
        }
        catch ( FileNotFoundException fnfe ) {
            fnfe.printStackTrace() ;
        }
    }
   
    public void addText() throws FileNotFoundException {
        JTextArea area =  new JTextArea();
        File input = new File("a.txt");
        Scanner in = new Scanner(input);
       
        while ( in.hasNext() )
            area.append( in.nextLine() + "\n" ) ;
           
        add ( area ) ;  // add to JFrame
    }
}

عند تشغيلك المثال (ضع الصورة + الملف + ملف الجافا في ملف واحد) سوف يخرج المخرج التالي :
jarFile

الأن لكي نحوله الى ملف جار ، نكتب الأمر التالي :
jarFile2

نجرب ملف الجار ، ونقوم بأخذه في مجلد أخر في بارتيشين أخر ونقوم بالتشغيل ووو !! لن يعمل الملف بكل تأكيد ..والسبب أننا لم نقوم بقرائه هذه المصادر من ملف الجار بشكل صحيح ..

المثال بعد التعديل :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Read Resources from Jar File

import java.awt.Toolkit ;
import java.awt.Dimension ;
import java.awt.EventQueue;
import java.awt.Image ;
import javax.swing.JFrame ;
import javax.swing.JTextArea ;
import java.util.Scanner ;
import java.io.InputStream ;
import java.io.FileNotFoundException ;
import java.net.URL ;

public class TestResource2 {
    public static void main (String [] args ) {
        EventQueue.invokeLater( new Runnable() {
            public void run () {
                TestResource2Frame frame  = new TestResource2Frame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class TestResource2Frame extends JFrame {
    public TestResource2Frame() {
        // get environment properities
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        int width = screenSize.width ;
        int height = screenSize.height ;
       
        // set size for application
        setSize ( width/2 , height/2);
       
        // set location of application
        setLocationByPlatform(true);
       
        // set Icon for application
        //Image img = kit.getImage("clicknrun.png");
        URL url = getClass().getResource("clicknrun.png");
        Image img = kit.getImage(url);
        setIconImage(img) ;
       
        // set Title of Application
        setTitle("Simple Test");
       
        // setResizable
        //setResizable(false);
       
        // add TextArea
        try {
            addText();
        }
        catch ( FileNotFoundException fnfe ) {
            fnfe.printStackTrace() ;
        }
    }
   
    public void addText() throws FileNotFoundException {
        JTextArea area =  new JTextArea();
       
        //File input = new File("a.txt");
        InputStream input = getClass().getResourceAsStream("a.txt");
        Scanner in = new Scanner(input);
       
        while ( in.hasNext() )
            area.append( in.nextLine() + "\n" ) ;
           
        add ( area ) ;  // add to JFrame
    }
}

قم الأن بتحويله الى ملف جار ، ونقله لأي مسار أخر وسيعمل بدون مشاكل ..

الى لقاء قريب في أفكار وتلميحات أخرى :) .

Categories: جافا Java Tags:
  1. أغسطس 2nd, 2010 at 08:12 | #1

    Very well written!

  2. أغسطس 2nd, 2010 at 11:13 | #2

    Somewhere I read it already. It is possible that you reprint.

  3. أغسطس 2nd, 2010 at 13:39 | #3

    Is it possible that this is all so. As will be detailed during write.

  4. أغسطس 2nd, 2010 at 17:29 | #4

    Thanks for such a good blog! Recommend friends.

  5. أغسطس 2nd, 2010 at 23:35 | #5

    How much you have interesting things on the blog.

  6. أغسطس 3rd, 2010 at 01:45 | #6

    Yes, all true. It is again read.

  7. أغسطس 3rd, 2010 at 05:04 | #7

    That’s right I said! Author fellow. Nothing to add ….

  8. أغسطس 3rd, 2010 at 08:07 | #8

    Thanks for the interesting topic. Tell your friends.

  9. أغسطس 3rd, 2010 at 10:43 | #9

    It should come back to this blog and read.

  10. أغسطس 5th, 2010 at 05:38 | #10

    That’s right I said! Author fellow. Nothing to add ….

  11. أغسطس 5th, 2010 at 10:16 | #11

    Thanks for the interesting blog!

  12. أغسطس 6th, 2010 at 08:14 | #12

    Комплексный прогон

  13. أغسطس 6th, 2010 at 11:37 | #13

    Ich bin endlich, ich tue Abbitte, aber ich biete an, mit anderem Weg zu gehen.

  14. أغسطس 9th, 2010 at 13:41 | #14

    My husband and I have been looking for this info. Is there a difference between the different options that you highlight? What are the pros and cons? Wondering if you will be posting more about this in the future – will bookmark and come back.

Comments are closed.