Hier ist ein Code, den ich nacheinander und wiederholt in mehrere Filekanäle schreibe.Wiederholt in mehrere Filechannels schreiben
Die Dateien werden gemacht, es gibt keine Fehler, aber nichts wird geschrieben. Der wichtige Teil ist, wo der Puffer geschrieben wird: "listofChan [j] .write (buff);" . Warum funktioniert das nicht?
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());
}
Okay, ich habe die Lösung gefunden:
I buff.clear()
auf einer Linie hinzuzufügen, benötigen nur über SB.clear();
weil nach den ByteBuffer
schreiben, die Lese-/Schreib-Postition am Ende des Puffers ist, es kann also nicht weiter geschrieben werden. Das gleiche für die IntBuffer
, muss auch separat zurückgesetzt werden, da die Positionen beider Ansichten unabhängig sind (ich nehme an ...).
Richtig, und 'compact()' nach dem 'write()'. – EJP