दिलचस्प पोस्ट
jQuery आइफ्रेम फ़ाइल अपलोड डाटाबेस बनाम फाइल सिस्टम में फ़ाइलों को संग्रहीत करना json ऑब्जेक्ट जावास्क्रिप्ट के माध्यम से चलना कैसे PDO डेटाबेस प्रश्नों डीबग करने के लिए? गिट 1.6.4 बीटा पर विंडोज (एमएससीजीट) – यूनिक्स या डॉस लाइन समाप्ति कैलेंडर से ईवेंट प्राप्त करना सी में एक पाश में कब्जा चर ओएस एक्स 10.11 पर पीडीएफक सर्वर लिपियों के साथ लिनक्स में स्टैक साइज़ बढ़ाएं स्ट्रिंग को जावा में दूसरे स्थान पर कनवर्ट करें एंड्रॉइड कैसे MediaScannerConnection scanFile का उपयोग करें मुझे एक त्रुटि क्यों मिल रही है "आधिकारिक आशय केवल निर्दिष्ट गुण निर्दिष्ट कर सकता है"? क्या फ़ायरफ़ॉक्स में execCommand SaveAs काम करता है? Web.xml में url- पैटर्न क्या है और सबलेट को कॉन्फ़िगर कैसे करें Regex का उपयोग कर एक सबस्ट्रिंग निकालने का तरीका

बड़ी पाठ फ़ाइलों को लोड और प्रदर्शित करना

एक स्विंग एप्लिकेशन में, मुझे कभी-कभी बड़े, लाइन-उन्मुख पाठ फ़ाइलों तक केवल-पढ़ने की सुविधा का समर्थन करने की आवश्यकता होती है जो लोड करने में धीमे हैं: लॉग, डंप, निशान, आदि। छोटी मात्रा में डेटा के लिए, एक उपयुक्त Document और JTextComponent ठीक है, जैसा कि यहां दिखाया गया है । मैं बड़ी मात्रा में डेटा ब्राउज़ करने की मानवीय सीमाओं को समझता हूं, लेकिन समस्याग्रस्त सामान ऐसा लगता है जैसे यह हमेशा सबसे बड़ी फ़ाइल में होता है क्या 10-100 मेगाबाइट, मिलियन-लाइन रेंज में बड़ी मात्रा में टेक्स्ट के लिए कोई व्यावहारिक विकल्प है?

वेब के समाधान से एकत्रित समाधान "बड़ी पाठ फ़ाइलों को लोड और प्रदर्शित करना"

मैं इस समस्या को अलग करेगा

पहला मॉडल मॉडल है – दस्तावेज़ बिल्डिंग स्पीड

दूसरा दस्तावेज़ प्रस्तुति – दस्तावेज का प्रतिनिधित्व करने के लिए दृश्यों का पेड़ है।

एक प्रश्न यह है कि क्या आपको रंगीन खोजशब्दों की तरह फ़ॉन्ट प्रभाव चाहिए?

मैं दस्तावेज़ बिल्डिंग पार्ट से शुरू करूँगा आईएमएचओ संपादक कीट के माध्यम से फाइल को पढ़ने के लिए। () बड़ी फ़ाइलों के लिए भी तेजी से होना चाहिए मैं इस प्रयोजन के लिए पेंडा दस्तावेज़ का उपयोग करूँगा और जांच करूँगा कि क्या शुद्ध मॉडल आपके आवेदन के लिए तेजी से बनाया गया है या नहीं। यदि हां, तो ठीक है बस दस्तावेज़ के रूप में मॉडल का उपयोग करें। यदि अपना स्वयं का दस्तावेज़ इंटरफ़ेस लागू न करें क्योंकि AbstractDocument में अद्यतन प्रोसेसिंग (उदाहरण के लिए WriteLock) के बहुत सारे तरीके हैं।

जब हमारे पास दस्तावेज़ पर्याप्त रूप से लोड हो रहा है तो हमें दस्तावेज़ रेंडरिंग को हल करना होगा। डिफ़ॉल्ट रूप से javax.swing.text में प्रयुक्त विचार वास्तव में लचीले हैं I वे विस्तारित किए जाने वाले आधार वर्गों के रूप में डिज़ाइन किए गए हैं – इस प्रकार बहुत सारे कोड हैं जिनकी हमें आवश्यकता नहीं है। उदाहरण के लिए मापने

इस सुविधा के लिए मैं मोनोपेस्ड फोंट का इस्तेमाल करूँगा, हमें देखने की जरूरत नहीं है, इसलिए माप की माप के लिए फास्ट = सबसे लंबे समय तक पंक्ति चार गिनती * चार विधवा

ऊंचाई भी चार ऊँचाई * लाइनों की मात्रा है

तो हमारे प्लैनटेक्स्ट विवर रीप्लेसमेंट वास्तव में तेज़ है इसके अलावा हमें पूरे दृश्य को प्रस्तुत करना नहीं है, लेकिन हमारे स्क्रॉल फलक में सिर्फ एक टुकड़ा दिखाई दे रहा है। इस प्रकार प्रतिपादन बहुत तेज हो सकता है।

बेशक सही कैरेट नेविगेशन, चयन इत्यादि प्रदान करने के लिए बहुत सारे काम हो सकते हैं।

आकार के कारण, आप निश्चित रूप से फ़ाइल को प्रेषण धागा अवरुद्ध करने से बचने के लिए पृष्ठभूमि में फ़ाइल लोड करना चाहते हैं; SwingWorker एक सामान्य पसंद है किसी Document का उपयोग करने के बजाय, एक TableModel अद्यतन करने और JTable की पंक्तियों में पाठ की लाइनों को प्रदर्शित करने पर विचार करें इससे कई लाभ मिलते हैं:

  • परिणाम तत्काल प्रकट होने लगेंगे, और अनुसूचित विलंबता कम हो जाएगा

  • JTable प्रतिपादन के लिए फ्लायवेट पैटर्न का उपयोग करता है, जो मल्टी-मेगाबाइट, मिलियन-लाइन रेंज में अच्छा तराजू है।

  • आप इनपुट को पार्स कर सकते हैं क्योंकि यह एक मनमाने ढंग से स्तंभ संरचना बनाने के लिए पढ़ा जा रहा है।

  • उदाहरण के लिए, आप JTable की सॉर्टिंग और फ़िल्टरिंग फीचर का लाभ उठा सकते हैं।

  • आप एक लाइन पर ध्यान केंद्रित करने के लिए TablePopupEditor का उपयोग कर सकते हैं।

परिशिष्ट: उदाहरण के लिए सुविधा के लिए DefaultTableModel का उपयोग करता है ओवरहेड को कम करने के लिए, AbstractTableModel का विस्तार करें और एक List<String> या List<RowData> , जैसा कि यहां दिखाया गया है उदाहरण प्रदर्शित अनिश्चित प्रगति; मध्यवर्ती प्रगति प्रदर्शित करने के लिए परिवर्तन यहां दिखाए गए हैं ।

कोड:

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.List; import javax.swing.JFrame; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingWorker; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; /** * @see https://stackoverflow.com/a/25526869/230513 */ public class DisplayLog { private static final String NAME = "/var/log/install.log"; private static class LogWorker extends SwingWorker<TableModel, String> { private final File file; private final DefaultTableModel model; private LogWorker(File file, DefaultTableModel model) { this.file = file; this.model = model; model.setColumnIdentifiers(new Object[]{file.getAbsolutePath()}); } @Override protected TableModel doInBackground() throws Exception { BufferedReader br = new BufferedReader(new FileReader(file)); String s; while ((s = br.readLine()) != null) { publish(s); } return model; } @Override protected void process(List<String> chunks) { for (String s : chunks) { model.addRow(new Object[]{s}); } } } private void display() { JFrame f = new JFrame("DisplayLog"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); JProgressBar jpb = new JProgressBar(); f.add(jpb, BorderLayout.NORTH); f.add(new JScrollPane(table)); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); LogWorker lw = new LogWorker(new File(NAME), model); lw.addPropertyChangeListener((PropertyChangeEvent e) -> { SwingWorker.StateValue s = (SwingWorker.StateValue) e.getNewValue(); jpb.setIndeterminate(s.equals(SwingWorker.StateValue.STARTED)); }); lw.execute(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { new DisplayLog().display(); }); } }