[英]FileChannel continuously write code issue
我有以下代碼,在j for循環中 , out.write()只寫j == 0 ,然后bytesThisWritten為0。
boolean append = true;
FileChannel out = new FileOutputStream(dirToSave + fileName, append).getChannel();
ByteBuffer dataBuffer = ByteBuffer.allocate(ScanDataStructConstants.NUM_DETECTORS * 4);
dataBuffer.order(ByteOrder.LITTLE_ENDIAN);
FloatBuffer floatBuffer = dataBuffer.asFloatBuffer();
long bytesThisWritten = 0;
for(int i = 0; i < ScanDataStructConstants.NUM_VIEWS_PER_ROTATION; i++)
{
if(!taskWorker.isCancelled())
{
taskWorker.setTaskProgress(i);
//write auxHeader
AuxHeader auxHeader = auxHeaderArray.getOneAuxHeader(i);
byteWritten = byteWritten + out.write(auxHeader.getJavoAuxHeader().getCmdByteBuffer());
System.out.println("DataMgr write auxHeader i=" + i + ", byteWritten=" + byteWritten);
//write data
for(int j = 0; j < ScanDataStructConstants.NUM_ROWS; j++)
{
if(!taskWorker.isCancelled())
{
float[] oneRow = scanDataArray.getOneRowDataFromAView(i, j);
floatBuffer.rewind();
floatBuffer.put(oneRow);
bytesThisWritten = out.write(dataBuffer);
byteWritten = byteWritten + bytesThisWritten;
if(i == 0)
{
System.out.println("DataMgr write data i,j=" + i + "," + j +
", bytesThisWritten=" + bytesThisWritten +
", byteWritten=" + byteWritten +
" oneRow.size=" + oneRow.length +
", oneRow[0]" + oneRow[0]);
}
}
else
{
status = ReturnStatusEnum.CANCELED_FAILURE;
break;
}
}
}
else
{
status = ReturnStatusEnum.CANCELED_FAILURE;
break;
}
}
對於打印,我知道源數據不為空:
DataMgr write auxHeader i=0, byteWritten=4256
DataMgr write data i,j=0,0, bytesThisWritten=3584, byteWritten=7840 oneRow.size=896, oneRow[0]-0.012269974
DataMgr write data i,j=0,1, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.012150764
DataMgr write data i,j=0,2, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.0056562424
DataMgr write data i,j=0,3, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.006008148
DataMgr write data i,j=0,4, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.0064029694
DataMgr write data i,j=0,5, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.010842323
DataMgr write data i,j=0,6, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.01802063
DataMgr write data i,j=0,7, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.0023899078
DataMgr write data i,j=0,8, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.0068216324
DataMgr write data i,j=0,9, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.005973816
DataMgr write data i,j=0,10, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.012469292
DataMgr write data i,j=0,11, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.013271332
DataMgr write data i,j=0,12, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]6.542206E-4
DataMgr write data i,j=0,13, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.008749008
DataMgr write data i,j=0,14, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.012054443
DataMgr write data i,j=0,15, bytesThisWritten=0, byteWritten=7840 oneRow.size=896, oneRow[0]-0.008696556
在i for循環中,它似乎可以工作,但僅在j循環中,它僅寫入一次。 FileChannel處於追加模式,並且在i loop中未關閉通道。 我的代碼有問題嗎?
將j循環更改為以下內容將解決此問題。 似乎FloatBuffer具有一些特殊的屬性。
for(int j = 0; j < ScanDataStructConstants.NUM_ROWS; j++)
{
if(!taskWorker.isCancelled())
{
float[] oneRow = scanDataArray.getOneRowDataFromAView(i, j);
dataBuffer.rewind();
FloatBuffer floatBuffer = dataBuffer.asFloatBuffer();
floatBuffer.put(oneRow);
bytesThisWritten = out.write(dataBuffer);
bytesWritten = bytesWritten + bytesThisWritten;
if(i == 0)
{
System.out.println("DataMgr write data i,j=" + i + "," + j +
", bytesThisWritten=" + bytesThisWritten +
", byteWritten=" + bytesWritten +
" oneRow.size=" + oneRow.length +
", oneRow[0]" + oneRow[0]);
}
}
else
{
status = ReturnStatusEnum.CANCELED_FAILURE;
break;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.