سؤال

أنا صنع برنامج في جافا مع مآخذ. يمكنني إرسال أوامر إلى العميل ومن العميل إلى الخادم. لقراءة الأوامر التي أستخدمها BufferedReader. وبعد لكتابةها، PrintWriter ولكن الآن أريد نقل ملف من خلال الذي - التي قابس كهرباء (ليس ببساطة إنشاء اتصال ثان).
أولا، أكتب إلى الناتج عن عدد البايتات التي يحتوي عليها الملف. على سبيل المثال 40000 بايت. لذلك أنا أكتب الرقم 40000 من خلال المقبس، ولكن الجانب الآخر من الاتصال يقرأ 78.

لذلك كنت أفكر: BufferedReader يقرأ أكثر من مجرد الخط (بالاتصال readLine()) وبهذه الطريقة فقدت بعض البايتات من بيانات الملفات. لأنهم في المخزن المؤقت من BufferedReader.
لذلك العدد 78 هو بايت الملف الذي أريد إرساله.

هل هذه طريقة التفكير بشكل صحيح أم لا. إذا كان الأمر كذلك، وكيفية سوي هذه المشكلة.
آمل أن تشرح جيدا.


هنا هو رمزي، ولكن لغتي الافتراضية الهولندية. لذلك يمكن أن يبدو بعض الاسم المتغير.

public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
    byte[] buffer = new byte[BUFFERSIZE];
    int bytesRead;
    if ((!closeOut) && closeIn) { // To Socket from File
        action = "Upload";
        os.write(is.available()); // Here I write 400000
        max = is.available();
        System.out.println("Bytes to send: " + max);
        while ((bytesRead = is.read(buffer)) != -1) {
            startTiming(); // Two lines to compute the speed
            os.write(buffer, 0, bytesRead);
            stopTiming(); // Speed compution
            process += bytesRead;
        }
        os.flush();
        is.close();
        return;
    }
    if ((!closeIn) && closeOut) { // To File from Socket
        action = "Download";
        int bytesToRead = -1;
        bytesToRead = is.read(); // Here he reads 78.
        System.out.println("Bytes to read: " + bytesToRead);
        max = bytesToRead;
        int nextBufferSize;
        while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
            startTiming();
            bytesRead = is.read(buffer, 0, nextBufferSize);
            bytesToRead -= bytesRead;
            process += nextBufferSize;
            os.write(buffer, 0, bytesRead);
            stopTiming();
        }
        os.flush();
        os.close();
        return;
    }
    throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}

هنا هو الحل:
شكرا لجيمس اقتراح
أظن Laginimaineb. كان أنصر قطعة من الحل.

قراءة الأوامر.

DataInputStream in = new DataInputStream(is); // Originally a BufferedReader
// Read the request line
String str;
while ((str = in.readLine()) != null) {
    if (str.trim().equals("")) {
       continue;
    }
    handleSocketInput(str);
}

الآن flushstreamtostream:

public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
    byte[] buffer = new byte[BUFFERSIZE];
    int bytesRead;
    if ((!closeOut) && closeIn) { // To Socket from File
        action = "Upload";
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeInt(is.available());

        max = is.available();
        System.out.println("Bytes to send: " + max);
        while ((bytesRead = is.read(buffer)) != -1) {
            startTiming();
            dos.write(buffer, 0, bytesRead);
            stopTiming();
            process += bytesRead;
        }
        os.flush();
        is.close();
        return;
    }
    if ((!closeIn) && closeOut) { // To File from Socket
        action = "Download";
        DataInputStream dis = new DataInputStream(is);
        int bytesToRead = dis.readInt();
        System.out.println("Bytes to read: " + bytesToRead);
        max = bytesToRead;
        int nextBufferSize;
        while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
            startTiming();
            bytesRead = is.read(buffer, 0, nextBufferSize);
            bytesToRead -= bytesRead;
            process += nextBufferSize;
            os.write(buffer, 0, bytesRead);
            stopTiming();
        }
        os.flush();
        os.close();
        return;
    }
    throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}

Martijn.

هل كانت مفيدة؟

المحلول

DatainPuttream هو الأكثر احتمالا ما تريد استخدامه. أيضا، لا تستخدم الطريقة المتاحة () لأنها عديمة الفائدة بشكل عام.

نصائح أخرى

لست متأكدا من التفسير الخاص بك.

ومع ذلك، نعم - ليس لديك أي تحكم حقيقي في مقدار ما سيقرأ مؤشر Bufferedreader بالفعل. إن الهدف من هذا القارئ هو أنه يقرأ بشكل متفائل قطع المورد الأساسي حسب الحاجة لتجديد المخزن المؤقت الخاص به. لذلك عند الاتصال أولا readLine, ، سترى أن المخزن المؤقت الداخلي لا يملك ما يكفي لخدمتك الطلب، وسوف تنفجر وقراءة ولكن كثيرة بايت يبدو وكأنه في المخزن المؤقت من المصدر الأساسي، والتي ستكون عموما أكثر بكثير مما طلبت بعد ذلك. بمجرد ملاءمة المخزن المؤقت، فإنه بإرجاع خطك من المحتوى المخزن المؤقت.

وهكذا بمجرد أن تغلب دفق الإدخال في فترة مؤقتة، يجب أن تكون متأكدا من قراءة هذا القارئ المخزوجين نفسه فقط. إذا لم تكن قد انتهى الأمر بفقدان البيانات (نظرا لأن بعض البايتات ستستهلك وتجلس الآن في ذاكرة التخزين المؤقت المخزن المؤقت في انتظار الخدمة).

يفترض مؤشر Bufferedreader أنه القراءة الوحيدة من دفق الإدخال الأساسي.

إنه الغرض منه هو تقليل عدد القراءات من الدفق الأساسي (وهو مكلفة، حيث يمكنهم تفويض بعمق تماما). تحقيقا لهذه الغاية، فإنه يحتفظ بمخزن مؤقت، والذي يملأه القراءة أكبر عدد ممكن من البايتات في ذلك في مكالمة واحدة إلى الدفق الأساسي.

لذلك نعم، التشخيص الخاص بك دقيقة.

مجرد طعنة برية هنا - 40000 هي 1001110001000000 في ثنائي. الآن، البتات السبعة الأولى هنا هي 1001110 والتي هي 78. معنى، أنت تكتب 2 بايت من المعلومات ولكن قراءة سبعة بت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top