2016-04-16 8 views
0

Вот код, который я сделал, чтобы писать последовательно и повторно для нескольких файловых каналов.Запись на несколько файлообменников повторяется

Файлы создаются, ошибок нет, но ничего не записывается. Важная часть - это где буфер написан: «listofChan [j] .write (buff);» , Почему это не работает?

FileChannel[] listofChan = new FileChannel[mStackHeight]; 
    FileOutputStream[] outputFiles = new FileOutputStream[mStackHeight]; 

    ByteBuffer buff = ByteBuffer.allocate(mStackWidth * 2); //2 byte integers 
    ShortBuffer SB = buff.asShortBuffer(); 

    ImageProcessor ip; 

    try { 
     for (int i = 0; i < mStackHeight; i++) { 
      outputFiles[i] = new FileOutputStream(new File(mSavepath + "\\T_" + i + ".dat"), true); 
      listofChan[i] = outputFiles[i].getChannel(); 
     } 
     System.out.println("File streams created successfully."); 

     for (int z = 0; z < mStackSz; z++) { //all slices in stack 
      ip = mStack.getProcessor(z + 1); 
      ip = ip.convertToShortProcessor(); 
      short[] Pixels = (short[]) ip.getPixels(); 
      for (int j = 0; j < mStackHeight; j++) { //all lines in one frame 
       SB.clear();      
       SB.put(Pixels, j * mStackWidth, mStackWidth); 
       listofChan[j].write(buff);      
      } 

      System.out.println("line " + z + " " + listofChan[mStackWidth-1].position()); 
      // System.out.println("Image line : " z-1+ p/mStackWidth); 
     } 

     for (int i = 0; i < mStackHeight; i++) { 
      outputFiles[i].close(); 
     } 

     System.out.println("Buffer contents written to file."); 

    } catch (IOException e) { 
     System.out.println("File IO exception : " + e.toString()); 

    } 

Хорошо, я нашел решение:

мне нужно добавить buff.clear() на линии чуть выше SB.clear(); , потому что после написания ByteBuffer, то postition чтения/записи находится в конце буфера, поэтому он не может быть написан дальше. То же самое для IntBuffer, это также необходимо перезагрузить отдельно, поскольку позиции обоих представлений независимы (я предполагаю ...).

ответ

1

Я думаю, вам нужно перевернуть свой байтовый буфер до его написания. Он все еще находится в режиме чтения/записи.

+0

Правильно, и 'compact()' это после 'write()'. – EJP

0

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

Например, вы можете сделать это, выбрав Плагины> Био-форматы> Био-форматы экспортер (этот плагин включен в Фиджи) и представит следующий диалог:

Bioformats dialog to allow saving separate files

Вы можете использовать Recorder, чтобы получить необходимый код Java:

IJ.run(imp, "Bio-Formats Exporter", "save=C:\\Path\\To\\Your\\File.ome.tif write_each_channel compression=Uncompressed"); 

Если вы Ри lly хотят взаимодействовать с экспортером на более низком уровне, посмотрите на source code of Exporter.java.

+0

Спасибо за информацию. Будет ли это работать и для чрезвычайно больших жизненных стеков (10000 изображений и более)? –

+0

Я не пробовал, но должен. Если это не так, это ошибка (и [должно быть сообщено] (http://imagej.net/Bug_reporting_best_practices)). Так почему бы вам просто не попробовать? –