Reading From Resources in Java Archive File
بسم الله الرحمن الرحيم
أغلب المستخدمين لا يفضلوا التعامل مع الكثير من الإعدادت والملفات عند التعامل مع البرامج ، فقط يريدوا عمل البرنامج بالشكل المطلوب بمجرد النقر دبل كليك على البرنامج . ونتيجه لذلك فجافا وفرت طريقة لعمل البرامج قابلة للتشغيل مباشره بدون الذهاب لسطر الأوامر وتشغيل ال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 } } |
عند تشغيلك المثال (ضع الصورة + الملف + ملف الجافا في ملف واحد) سوف يخرج المخرج التالي :
الأن لكي نحوله الى ملف جار ، نكتب الأمر التالي :
نجرب ملف الجار ، ونقوم بأخذه في مجلد أخر في بارتيشين أخر ونقوم بالتشغيل ووو !! لن يعمل الملف بكل تأكيد ..والسبب أننا لم نقوم بقرائه هذه المصادر من ملف الجار بشكل صحيح ..
المثال بعد التعديل :
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 } } |
قم الأن بتحويله الى ملف جار ، ونقله لأي مسار أخر وسيعمل بدون مشاكل ..
الى لقاء قريب في أفكار وتلميحات أخرى
.
Very well written!
Somewhere I read it already. It is possible that you reprint.
Is it possible that this is all so. As will be detailed during write.
Thanks for such a good blog! Recommend friends.
How much you have interesting things on the blog.
Yes, all true. It is again read.
That’s right I said! Author fellow. Nothing to add ….
Thanks for the interesting topic. Tell your friends.
It should come back to this blog and read.
That’s right I said! Author fellow. Nothing to add ….
Thanks for the interesting blog!
Комплексный прогон
Ich bin endlich, ich tue Abbitte, aber ich biete an, mit anderem Weg zu gehen.
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.