سؤال

لقد قمت بإنشاء ملف نصي في بيئة UNIX باستخدام رمز Java.

لكتابة الملف النصي الذي أستخدمه java.io.FileWriter و BufferedWriter. وللطول الجديد بعد كل صف أستخدمه bw.newLine() الطريقة (حيث bw هو كائن BufferedWriter).

وأرسل هذا الملف النصي عن طريق إرفاق البريد من بيئة UNIX نفسها (تلقائي باستخدام أوامر UNIX).

مشكلتي هي ، بعد تنزيل الملف النصي من البريد في نظام Windows ، إذا فتحت هذا الملف النصي ، فإن البيانات غير محاذاة بشكل صحيح. newline() الشخصية لا تعمل ، أعتقد ذلك.

أريد نفس محاذاة الملف النصي كما هو الحال في بيئة UNIX ، إذا فتحت الملف النصي في بيئة Windows أيضًا.

كيف يمكنني حل المشكلة؟

رمز Java أدناه للرجوع إليه (تشغيل في بيئة UNIX):

File f = new File(strFileGenLoc);
BufferedWriter bw = new BufferedWriter(new FileWriter(f, false));
rs = stmt.executeQuery("select * from jpdata");
while ( rs.next() ) {
    bw.write(rs.getString(1)==null? "":rs.getString(1));
    bw.newLine();
}
هل كانت مفيدة؟

المحلول

تعرف Java فقط عن النظام الأساسي الذي يتم تشغيله حاليًا ، لذلك يمكن أن يوفر لك فقط إخراجًا يعتمد على النظام الأساسي على هذا النظام الأساسي (باستخدام bw.newLine()). حقيقة أنك تفتحه على نظام Windows تعني أنه يتعين عليك تحويل الملف قبل استخدامه (باستخدام شيء كتبته ، أو استخدام برنامج مثل UNIX2DOS) ، أو عليك إخراج الملف باستخدام عربات تنسيق Windows في الأصل في برنامج Java الخاص بك. لذلك إذا كنت تعرف أن الملف سيتم فتحه دائمًا على جهاز Windows ، فسيتعين عليك الإخراج

bw.write(rs.getString(1)==null? "":rs.getString(1));
bw.write("\r\n");

تجدر الإشارة إلى أنك لن تكون قادرًا على إخراج ملف يبدو صحيحًا على كلا النظامين إذا كان مجرد نص عادي تستخدمه ، فقد ترغب في التفكير في استخدام HTML إذا كان بريدًا إلكترونيًا أو XML إذا كان ذلك هي البيانات. بدلاً من ذلك ، قد تحتاج إلى نوع من العميل الذي يقرأ البيانات ثم يقوم بتنسيقها للنظام الأساسي الذي يستخدمه المشاهد.

نصائح أخرى

طريقة newLine() يضمن إضافة خط جديد متوافق مع النظام الأساسي (0Dh 0Ah لدوس ، 0Dh لأجهزة Mac القديمة ، 0Ah لـ UNIX/Linux). Java ليس لديها طريقة لمعرفة النظام الأساسي الذي سترسله النص. يجب الاعتناء بهذا التحويل بواسطة كيانات إرسال البريد.

لا أعرف من ينظر إلى ملفك ، ولكن إذا فتحته في WordPad بدلاً من المفكرة ، فستظهر عمليات التغذية الصحيح. في حال كنت تستخدم ملحق ملف خاص ، قم بربطه بـ WordPad وأنت تنتهي منه. أو استخدم أي محرر نصوص آخر أكثر تقدمًا.

bw.newLine(); لا يمكن ضمان التوافق مع جميع الأنظمة.

إذا كنت متأكدًا من أنه سيتم فتحه في Windows ، فيمكنك تنسيقه إلى Windows NewLine.

إذا كنت تستخدم بالفعل أوامر UNIX الأصلية ، فحاول unix2dos وقم بتحويل ملف تم إنشاؤه بالفعل إلى تنسيق Windows ثم أرسل البريد.

إذا كنت لا تستخدم أوامر UNIX ويفضلون القيام بذلك في Java ، فاستخدم `` bw.write (" r n") `وإذا لم يكن معقد برنامجك ، فاحرص على اكتشاف نظام التشغيل ويكتب الخط الجديد المناسب.

إذا فهمك بشكل صحيح ، فإننا نتحدث عن مرفق ملف نصي. هذا أمر مؤسف لأنه إذا كان جسم رسالة البريد الإلكتروني ، فيمكنك دائمًا استخدام " r n" ، في إشارة إلى http://www.faqs.org/rfcs/rfc822.html

ولكن نظرًا لأنه مرفق ، يجب أن تعيش مع اختلافات النظام. إذا كنت في حذائك ، فسأختار أحد هذه الخيارات:

أ) يدعم عملاء Windows فقط باستخدام " r n" كنهاية سطر.

ب) توفير ملفين مرفقين ، أحدهما بتنسيق Linux وواحد بتنسيق Windows.

ج) لا أعرف ما إذا كان يجب قراءة المرفق من قبل الأشخاص أو الآلات ، ولكن إذا كان الأشخاص ، فسأفكر في إرفاق ملف HTML بدلاً من النص العادي. أكثر محمولة وأجمل بكثير ، أيضا :)

قم بتغليف كاتبك لتوفير استبدال char ، مثل هذا:

public class WindowsFileWriter extends Writer {

    private Writer writer;

    public WindowsFileWriter(File file) throws IOException {
        try {
            writer = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-15");
        } catch (UnsupportedEncodingException e) {
            writer = new FileWriter(logfile);
        }
    }

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        writer.write(new String(cbuf, off, len).replace("\n", "\r\n"));
    }

    @Override
    public void flush() throws IOException {
        writer.flush();
    }

    @Override
    public void close() throws IOException {
        writer.close();
    }

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