سؤال

كيف يمكنني إلحاق الملفات الكبيرة بكفاءة. لديّ عملية يجب إلحاقها باستمرار بملف ومع نمو حجم الملف يبدو أن الأداء يتباطأ أيضًا. هل هناك على أي حال لتحديد حجم مخزن مؤقت كبير مع append

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

المحلول

على الرغم من أن نهج دون صالح ، بشكل عام (سوف يلقي استثناءً ، بسبب خطأ في بناء الجملة ، وتحتاج إلى ذلك flush() أ BufferedOutputStream) ، كنت أخطط لتوضيح المزيد (الذي يستغرق وقته).

رائع لا تقدم كائنات خاصة لعمليات الإدخال/الإخراج. وبالتالي ، سوف تستخدم جافا FileOutputStream (لكتابة بايت) أو FileWriter (لكتابة السلاسل). كلاهما يوفر مُنشئًا يأخذ ملف boolean append معامل.
لكليهما ، هناك ديكور (BufferedOutputStream و BufferedWriter) ، والتي يتم تخزينها. "التخزين المؤقت" ، في هذا النطاق ، يعني أن المحتويات ليست بالضرورة مكتوبة على الفور إلى الدفق الأساسي ، وبالتالي ، هناك احتمال لتحسين الإدخال/الإخراج.

قدم دون بالفعل عينة ل BufferedOutputStream, ، وهنا واحد ل BufferedWriter:

File file = new File("foo")
if (file.exists()) {
    assert file.delete()
    assert file.createNewFile()
}

boolean append = true
FileWriter fileWriter = new FileWriter(file, append)
BufferedWriter buffWriter = new BufferedWriter(fileWriter)

100.times { buffWriter.write "foo" }

buffWriter.flush()
buffWriter.close()

في حين أن Groovy لا يوفر كائنات I/O الخاصة بها ، Groovy JDK (GDK) يعزز العديد من أنواع Java عن طريق إضافة طرق الراحة. في نطاق الإخراج I/O ، OutputStream و ال File الأنواع ذات الصلة.

لذا ، أخيرًا ، يمكنك العمل مع هؤلاء "الطريق الرائع":

new File("foo").newOutputStream().withWriter("UTF-8") { writer ->
    100.times { writer.write "foo" + it }
}

تعديل: حسب استفسارك الإضافي:

لا تسمح أي من أساليب GDK بتعيين حجم المخزن المؤقت.

سوف الرمز "الرائع" أعلاه الكتابة فوق الملف إذا تم استدعاؤه بشكل متكرر. - على النقيض من ذلك ، فإن الجزء التالي من التعليمات البرمجية ستعمل على إلحاق السلسلة إلى موجود ملف ، وبالتالي ، يستطيع يتم استدعاؤه مرارًا وتكرارًا:

new File("foo").withWriterAppend("UTF-8") { it.write("bar") }

نصائح أخرى

def file = new File('/path/to/file')

// Create an output stream that writes to the file in 'append' mode
def fileOutput = new FileOutputStream(file, true)

// Buffer the output - set bufferSize to whatever size buffer you want to use
def bufferSize = 512
def fileOutput = new BufferedOutputStream(fileOutput, bufferSize)

try {
    byte[] contentToAppend = // Get the content to write to the file
    fileOutput.write(contentToAppend)
} finally {
    fileOutput.close()
}

في JVM على Windows append تم تنفيذ العلم بشكل غير فعال مع عملية البحث.

هذا هو الجار الذري ولا أداء للغاية عند فتح الملف عدة مرات. من المفترض أن يتم إصلاحه في مكان ما في Java VM 7: http://bugs.sun.com/bugdatabase/view_bug.do؟bug_id=6631352

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