2016-09-08 8 views
1

Я читаю данные из базы данных и записываю их в буферный писатель для создания файла с фиксированной шириной. Я также читаю одни и те же данные и преобразовываю их в файл BSON, который позже будет загружен Mongo DB.Создание Jar и добавление нескольких потоков к нему

После завершения вышеописанного процесса я могу создать файл jar для обоих этих файлов и передать их по проводу.

Но чтобы сэкономить время я консультировал сжимать данные на лету и создать файл JAR некоторые вещи, как этот

JarOutputStream jarOutPutStream = new JarOutputStream(
     new FileOutputStream(new File(file.getName() + ".jar"))); 

Writer bufferedWriter = new BufferedWriter(
     new OutputStreamWriter(jarOutPutStream, "UTF-8")); 

Когда я выше и добавьте следующий код: Я могу создать файл jar на лету.

JarEntry ze = new JarEntry("temp.log"); 
jarOutPutStream.putNextEntry(ze); 

Этой баночка имеет въездную temp.log, но я хотел бы знать, как я могу связать другую FileOutputStream с выше баночкой.

Мой вывод должен быть файлом jar, содержащим две записи: один для файла с фиксированной шириной и другой для файла BSON.

+0

У моего вывода должен быть файл jar с файлом первой фиксированной ширины и вторым файлом BSON –

+0

Пожалуйста, отредактируйте свой вопрос, а не добавьте его через комментарий. – Thomas

ответ

0

Файлы JAR на самом деле являются ZIP-файлами. Файлы ZIP не позволяют хранить последовательные файлы в отдельных файлах. То есть файл 1 появляется полностью (сжатый) перед (или после, зависит от индекса). Файл 2.

Я считаю, что это делает невозможным поток двух или более потоков в один поток ZIP , Похоже, вы можете передать один файл в ZIP-файл OK, но вам нужно кэшировать другой и добавить его в ZIP позже.

Вы вынуждены использовать формат ZIP? Вы хотите посмотреть форматы контейнеров, которые поддерживают чередующиеся данные. Там один фрагмент файла 1 может чередоваться с другим фрагментом файла 2, так что вы можете испускать куски из файла либо итеративно.

+0

Спасибо за ответ, я создал 2 потока jaroutput и сжал их в одну банку и передал их по проводу. JarOutputStream jarOutPutStream = новый JarOutputStream ( \t \t \t \t новый BufferedOutputStream (новый FileOutputStream (новый файл (outputDatFile + ".jar")))); \t \t jarOutPutStream.setMethod (JarOutputStream.DEFLATED); \t \t JarEntry ze = new JarEntry (fileName); \t \t jarOutPutStream.putNextEntry (ze); return jarOutPutStream; После банки i –

1

В первую очередь, если вы хотите буферном I/O здесь, то я настоятельно рекомендую положить буфер под флягу поток вместо сверху:

JarOutputStream jarOutPutStream = new JarOutputStream(
     new BufferedOutputStream(
       new FileOutputStream(new File(file.getName() + ".jar")))); 

Это требует большой осторожности, чтобы избежать повреждения вашего данных, если вы манипулируете как обернутым потоком, так и потоком обертки, как вы, кажется, хотите сделать, обернув поток Jar.

Во-вторых, file.getName() + ".jar" немного подозрительно в свете вашего вопроса. В этом нет ничего плохого, пока он создает строку, которая представляет собой действительное имя файла, но не думайте, что имя файла Jar имеет какую-либо неотъемлемую связь с его содержимым.

В-третьих, я не уверен, признаете ли вы, что хотя ваш пример кода демонстрирует, как создать файл Jar с одной записью, не демонстрирует фактического добавления каких-либо данных для этой записи. Вы должны сделать это, записав данные для записи в JarOutputStream после вызова putNextEntry().

В-четвертых, и непосредственно отвечая на ваш вопрос, после записи данных для первой записи вы добавляете запись для второго файла, создавая соответствующий ZipEntry и снова вызывающий putNextEntry() в своем потоке с этой записью. Затем вы записываете данные для , что и запись.

В-пятых, если вам не нужно сохранять два несжатых файла на сервере, тогда вам не нужно создавать их как файлы в первую очередь. Вместо этого вы можете записывать данные каждого пользователя прямо на ваш JarOutputStream (последовательно) вместо записи в отдельный файл или в память и затем копировать данные.

В-шестых, если вам не нужно сохранять файл Jar на сервере, вы можете записать его непосредственно в поток ответов, а не в промежуточный файл. Независимо от того, как вы это сделаете, зависит от того, как вы отвечаете.

В-седьмых, есть ли какая-то конкретная причина использовать Jar вместо Zip? Это одно и то же, за исключением того, что действительные файлы Jar содержат манифест, который вам не нужен. Все, что описано выше, может быть сделано аналогичным образом с ZipOutputStream, как с JarOutputStream (который, по сути, является подклассом ZipOutputStream).