জাভা কিভাবে একটি ফাইল থেকে পড়তে হয় যা সক্রিয়ভাবে লিখিত হচ্ছে?

আমার কাছে এমন একটি অ্যাপ্লিকেশন আছে যা ফাইলের তথ্য লেখায়। এই তথ্যটি অ্যাপ্লিকেশনটির পাস / ব্যর্থতা / নির্ভুলতা নির্ধারণের জন্য পোস্ট-এক্সিকিউশন ব্যবহার করা হয়। আমি এই ফাইলটি পড়তে সক্ষম হব, যাতে আমি এই পাস / ব্যর্থতা / সঠিকতার চেকগুলি রিয়েল টাইমে করতে পারি।

আমি অনুমান করি এটা করা সম্ভব, কিন্তু জাভা ব্যবহার করার সময় তোলা কি জড়িত? যদি লেখাটি লেখার জন্য ক্যাচ হয়, তাহলে কি ফাইলটি বন্ধ না হওয়া পর্যন্ত এটি আরও বেশি লেখার জন্য অপেক্ষা করবে, অথবা এই সময়ে এই পাঠটি ব্যতিক্রমটি বাদ দেবে? যদি পরের, তাহলে আমি কি করব?

আমার অন্তর্দৃষ্টি বর্তমানে BufferedStreams দিকে আমাকে ঠেলাঠেলি করছে। এই যেতে উপায়?

0
ro fr hi
@ এজেপি - আপনি যা ডিবি সুপারিশ করেন? মাইএসকিউএল একটি ভাল শুরু অনুমান করছি?
যোগ লেখক Coffee, উৎস
একটি ডাটাবেস ব্যবহার করুন এই 'একটি ফাইল পড়তে যখন এটি লিখিত' পরিস্থিতিতে কান্না শেষ।
যোগ লেখক EJP, উৎস
হে, আমি একটি অনুরূপ দৃশ্যকল্প সম্মুখীন হয় আমি গ্রহণ ছিল একটি ভাল সমাধান খুঁজে পেয়েছি যদি আপনি শব্দ ছিল?
যোগ লেখক Asaf David, উৎস
আমি জানি এই একটি পুরানো প্রশ্ন, কিন্তু ভবিষ্যতে পাঠকদের জন্য, আপনি আপনার ব্যবহারের ক্ষেত্রে একটি বিট আরো প্রসারিত করতে পারেন? আরো তথ্য ছাড়া, আপনি সম্ভবত ভুল সমস্যা সমাধান করতে পারেন যদি এক আশ্চর্য।
যোগ লেখক user359996, উৎস

9 উত্তর

আমি এটি চেষ্টা না করেছি, কিন্তু যদি আপনি ফাইলটি উপরে আরো তথ্য আছে কিনা, শেষ আঘাত পরে আপনি একটি স্ট্রিম থেকে পড়া থেকে কাজ করবে কিনা দেখতে একটি পরীক্ষা ক্ষেত্রে লিখতে হবে।

কোনও কারণে আপনি একটি পাইপ ইনপুট / আউটপুট স্ট্রিম ব্যবহার করতে পারবেন না? এই তথ্যটি কি একই অ্যাপ্লিকেশন থেকে লিখিত এবং পড়া হচ্ছে (যদি তাই হয় তবে আপনার কাছে তথ্য আছে, কেন আপনি ফাইল থেকে পড়তে হবে)?

অন্যথায়, ফাইলের শেষে পর্যন্ত পড়তে পারেন, তারপর পরিবর্তনের জন্য নিরীক্ষণ করুন এবং আপনি কোথায় যাচ্ছেন এবং চালিয়ে যান তা খোঁজ করুন ... যদিও জাতিগুলির অবস্থার জন্য সতর্ক থাকুন

0
যোগ

জাভা নয়, তবে আপনি এমন কোনও সমস্যা নিয়ে আসতে পারেন যেখানে আপনি ফাইলটিতে কিছু লিখেছেন, কিন্তু এটি আসলে এখনো লিখিত নয় - এটি একটি ক্যাশের কোথাও হতে পারে, এবং একই ফাইল থেকে পড়া আসলে আপনি হয়ত নতুন তথ্য

সংক্ষিপ্ত সংস্করণ - ফ্লাশ() ব্যবহার করুন বা প্রাসঙ্গিক সিস্টেম কলটি আপনার ডেটা আসলে ফাইলটিতে লিখিত হয় তা নিশ্চিত করতে হয়।

মনে রাখবেন আমি ওএস লেভেল ডিস্ক ক্যাশে কথা বলছি না - যদি আপনার ডাটা এখানে আসে তবে এই বিন্দুর পরে একটি পঠন() প্রদর্শিত হবে। এটি হতে পারে যে ভাষা নিজে ক্যাশে লিখেছে, যতক্ষণ না একটি বাফার পূর্ণ হয় বা ফাইলটি ফ্লাশ / বন্ধ থাকে।

0
যোগ

উত্তরটি "না" বলে মনে হচ্ছে ... এবং "হ্যাঁ"। একটি ফাইল অন্য অ্যাপ্লিকেশন দ্বারা লেখার জন্য খোলা আছে কিনা তা জানতে কোন প্রকৃত উপায় বলে মনে হচ্ছে। সুতরাং, এই ধরনের একটি ফাইল থেকে পড়তে হবে যতক্ষণ পর্যন্ত বিষয়বস্তু নিঃশেষ হয়ে যায়। আমি মাইক এর পরামর্শ গ্রহণ এবং কিছু পরীক্ষা কোড লিখেছেন:

Writer.java ফাইলের জন্য একটি স্ট্রিং লিখেছে এবং তারপর ফাইলটি অন্য লাইনে লেখার আগে ব্যবহারকারীকে প্রবেশ করার জন্য অপেক্ষা করে। ধারণাটি শুরু করা যেতে পারে বলে ধারণা করা হচ্ছে, তারপর "আংশিক" ফাইলটি কিভাবে কাজ করে তা দেখার জন্য একটি পাঠক শুরু করা যেতে পারে। পাঠক আমি লিখেছি Reader.java মধ্যে।

এ Writer.java

public class Writer extends Object
{
    Writer() {

    }

    public static String[] strings = 
        {
            "Hello World", 
            "Goodbye World"
        };

    public static void main(String[] args) 
        throws java.io.IOException {

        java.io.PrintWriter pw =
            new java.io.PrintWriter(new java.io.FileOutputStream("out.txt"), true);

        for(String s : strings) {
            pw.println(s);
            System.in.read();
        }

        pw.close();
    }
}

এ Reader.java

public class Reader extends Object
{
    Reader() {

    }

    public static void main(String[] args) 
        throws Exception {

        java.io.FileInputStream in = new java.io.FileInputStream("out.txt");

        java.nio.channels.FileChannel fc = in.getChannel();
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(10);

        while(fc.read(bb) >= 0) {
            bb.flip();
            while(bb.hasRemaining()) {
                System.out.println((char)bb.get());
            }
            bb.clear();
        }

        System.exit(0);
    }
}

কোনও নিশ্চয়তা নেই যে এই কোডটি সেরা অনুশীলন।

এই ফাইলটি থেকে পড়তে নতুন তথ্য আছে কিনা তা পর্যালোচ্যভাবে মাইক দ্বারা প্রস্তাবিত বিকল্পটি ছেড়ে দেয়। এটি তখন ফাইল রিডার বন্ধ করার জন্য ব্যবহারকারীর হস্তক্ষেপের প্রয়োজন হয় যখন এটি নির্ধারিত হয় যে পড়া শেষ হয়। অথবা, পাঠককে ফাইলের বিষয়বস্তু সচেতন করতে হবে এবং লিখতে শর্ত নির্ধারণ এবং শেষ করতে সক্ষম হতে হবে। যদি বিষয়বস্তু xml ছিল, ডকুমেন্টের শেষে এটি সংকেত করতে ব্যবহার করা যেতে পারে।

0
যোগ

আপনি একটি ফাইলের একটি অংশ লক করার জন্য জাভা চ্যানেলের দিকে নজর দিতে পারেন।

http://java.sun.com/javase /6/docs/api/java/nio/channels/FileChannel.html

ফাইল চ্যানেল এর এই ফাংশনটি শুরু হতে পারে

lock(long position, long size, boolean shared) 

এই পদ্ধতির একটি আহ্বানটি যতক্ষণ পর্যন্ত অঞ্চলটি লক করা না যায় ততক্ষণ ব্লক হবে

0
যোগ

আমি সম্পূর্ণরূপে যিহোশুর প্রতিক্রিয়া , টেলার এই অবস্থানে কাজের জন্য উপযুক্ত। এখানে একটি উদাহরণ:

এটি একটি ফাইলের মধ্যে প্রতি 150 ms একটি লাইন লিখে, যখন এই 2500 ms প্রতি এই একই ফাইল পড়া

public class TailerTest
{
    public static void main(String[] args)
    {
        File f = new File("/tmp/test.txt");
        MyListener listener = new MyListener();
        Tailer.create(f, listener, 2500);

        try
        {
            FileOutputStream fos = new FileOutputStream(f);
            int i = 0;
            while (i < 200)
            {
                fos.write(("test" + ++i + "\n").getBytes());
                Thread.sleep(150);
            }
            fos.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private static class MyListener extends TailerListenerAdapter
    {
        @Override
        public void handle(String line)
        {
            System.out.println(line);
        }
    }
}
0
যোগ
টাইলারের সাথে আপনার লিঙ্কটি ভেঙ্গে গেছে।
যোগ লেখক Stealth Rabbi, উৎস
@ স্টটথ্র্বি, তারপর কাজটি করা সেরা জিনিস হল সঠিক লিঙ্কটি অনুসন্ধান করা, এবং এর সাথে উত্তরটি সম্পাদনা করুন।
যোগ লেখক igracia, উৎস

আপনি FileInputStream, FileReader বা RandomAccessFile ব্যবহার করে অন্য কোনও প্রক্রিয়া থেকে খোলা একটি ফাইলটি পড়তে পারবেন না।

কিন্তু ফাইল চ্যানেল ব্যবহার করে সরাসরি কাজ করবে:

private static byte[] readSharedFile(File file) throws IOException {
    byte buffer[] = new byte[(int) file.length()];
    final FileChannel fc = FileChannel.open(file.toPath(), EnumSet.of(StandardOpenOption.READ));
    final ByteBuffer dst = ByteBuffer.wrap(buffer);
    fc.read(dst);
    fc.close();
    return buffer;
}
0
যোগ

ফাইল চ্যানেল ব্যবহার করে কাজ করার জন্য উদাহরণ পেতে পারে না। পাঠ্য (ByteBuffer) কারণ এটি একটি ব্লক করা পড়া না। তবে কাজ করার জন্য নীচের কোডটি পেতে:

boolean running = true;
BufferedInputStream reader = new BufferedInputStream(new FileInputStream( "out.txt" ) );

public void run() {
    while( running ) {
        if( reader.available() > 0 ) {
            System.out.print( (char)reader.read() );
        }
        else {
            try {
                sleep( 500 );
            }
            catch( InterruptedException ex ) {
                running = false;
            }
        }
    }
}

অবশ্যই একই জিনিস একটি থ্রেড এর পরিবর্তে একটি টাইমার হিসাবে কাজ করবে, কিন্তু আমি প্রোগ্রামার পর্যন্ত যে ছেড়ে। আমি এখনও একটি ভাল উপায় খুঁজছেন, কিন্তু এই জন্য এখন আমার জন্য কাজ করে।

ওহ, এবং আমি এই সঙ্গে সাজা পাবেন: আমি ব্যবহার করছি 1.4.2। হ্যাঁ আমি জানি পাথর যুগে এখনও আমি আছি।

0
যোগ
এই যোগ করার জন্য ধন্যবাদ ... কিছু আমি কাছাকাছি করতে না প্রায়। আমি মনে করি ব্লেডের ফাইলটি লক করার উত্তরটিও ভাল। যাইহোক, এটি জাভা 6 (আমি মনে করি) প্রয়োজন।
যোগ লেখক Anthony Cramp, উৎস
@ এন্থনি সিমেন্ট, কেন আপনি অনুদান দিচ্ছেন না? :)
যোগ লেখক Yassin Hajaj, উৎস
@ জোসেফ গর্ডন - আপনাকে ড্রোন বয়সে এই দিনগুলির একটিতে যেতে হবে ;-)
যোগ লেখক TungstenX, উৎস

এটি একটি ওপেন সোর্স জাভা গ্রাফিক টাইল যা এইটি করে।

https://stackoverflow.com/a/559146/1255493

public void run() {
    try {
        while (_running) {
            Thread.sleep(_updateInterval);
            long len = _file.length();
            if (len < _filePointer) {
                // Log must have been jibbled or deleted.
                this.appendMessage("Log file was reset. Restarting logging from start of file.");
                _filePointer = len;
            }
            else if (len > _filePointer) {
                // File must have had something added to it!
                RandomAccessFile raf = new RandomAccessFile(_file, "r");
                raf.seek(_filePointer);
                String line = null;
                while ((line = raf.readLine()) != null) {
                    this.appendLine(line);
                }
                _filePointer = raf.getFilePointer();
                raf.close();
            }
        }
    }
    catch (Exception e) {
        this.appendMessage("Fatal error reading log file, log tailing has stopped.");
    }
    // dispose();
}
0
যোগ

যদি আপনি একটি ফাইল পড়তে চান তবে এটি লিখিত এবং শুধুমাত্র নিম্নলিখিত বিষয়বস্তু পড়তে চাইলে আপনি একই অর্জন করতে সাহায্য করবে।

এই প্রোগ্রামটি চালানোর জন্য আপনি এটি কমান্ড প্রম্পট / টার্মিনাল উইন্ডোর থেকে আরম্ভ করবেন এবং ফাইলের নামটি পড়তে হবে। এটি প্রোগ্রামটি মুছে না দেওয়া পর্যন্ত এটি ফাইলটি পড়বে।

জাভা রিডার সি: \ myfile.txt

আপনি টেক্সট একটি লাইন টাইপ হিসাবে এটি নোটপ্যাড থেকে এটি সংরক্ষণ করুন এবং আপনি কনসোল মুদ্রিত টেক্সট দেখতে হবে।

public class FileReader {

    public static void main(String args[]) throws Exception {
        if(args.length>0){
            File file = new File(args[0]);
            System.out.println(file.getAbsolutePath());
            if(file.exists() && file.canRead()){
                long fileLength = file.length();
                readFile(file,0L);
                while(true){

                    if(fileLength
0
যোগ
এই কোডটি অনেক CPU ব্যবহার করে কারণ লুপটিতে থ্রেড সোড কল নেই। একটি ছোট পরিমাণ যোগ করার ছাড়া এই কোডটি সিপিইউ খুব ব্যস্ত রাখতে থাকে।
যোগ লেখক ChaitanyaBhatt, উৎস
ফাইলটিতে যে সময়টি পাঠ করা হয় এবং ফাইলের দৈর্ঘ্য নষ্ট হওয়ার সময়টির মধ্যে এটির সম্ভাবনা নেই, বহিরাগত প্রসেস ফাইলটিতে আরো তথ্য যোগ করতে পারে। যদি তাই হয়, তাহলে ফাইলটিতে লেখা লিখিত ডেটা পড়ার ফলে ফলাফলটি ক্ষণস্থায়ী হবে।
যোগ লেখক JohnC, উৎস