Вызов завершённого будущего в цикле while для byteArrayOutputStream не работает должным образом
CompletableFuture прекрасно работает с простой асинхронной задачей, но я попробовал то же самое в цикле while при чтении файла и записи в несколько файлов, как показано ниже:
BufferedInputStream bin = null;
ReadableByteChannel channel = null;
int bufferSize = 1048576;
int readBufferSize = 1024*4;
java.nio.ByteBuffer byteBuffer = java.nio.ByteBuffer.allocate(readBufferSize);
InputStream is = new FileInputStream(new File("D:\\Harisingh\\myfile.txt"));
bin = new BufferedInputStream(is,bufferSize);
channel = Channels.newChannel(bin);
int retryCnt = 0;
ByteArrayOutputStream baOS = new ByteArrayOutputStream(bufferSize);
int totalBytes=0;
int itrCount=0;
int maxIterateCnt = 1;
int len;
//primary location file path
BufferedOutputStream bFout = new BufferedOutputStream(new FileOutputStream(new File("D:\\Harisingh\\FileUpload\\primary.txt")));
//secondary location file path
FileUploadMultiLocator fileUploadMultiLocator = new FileUploadMultiLocator("fileserver0",new BufferedOutputStream(new FileOutputStream(new File("D:\\Harisingh\\SecondaryPath\\Secondary1.txt"))));
if(bufferSize > readBufferSize){
maxIterateCnt = bufferSize/readBufferSize;
}
while((len=channel.read(byteBuffer))>=0)
{
itrCount++;
totalBytes+=len;
baOS.write(byteBuffer.array(),0,len);
if(itrCount>=maxIterateCnt)
{
//Writing to one file on primary location only
try{
bFout.write(baOS.toByteArray(),0,totalBytes);
}catch(Exception se)
{
}
//sending baOS for writing to other files on secondary locations with fileUploadMultiLocator runnable class
createCompletableFutureTask(baOS, totalBytes, fileUploadMultiLocator);
totalBytes=0;
baOS.reset();
itrCount=0;
}
byteBuffer.clear();
}
Код метода createCompletableFutureTask(baOS, totalBytes, fileUploadMultiLocator), как показано ниже:-
public static void createCompletableFutureTask(ByteArrayOutputStream baOS, int totalBytes, FileUploadMultiLocator fileUploadMultiLocator){
// Submit Task 1
CompletableFuture<Integer> f1 = CompletableFuture.supplyAsync(() -> {
try {
fileUploadMultiLocator.baOS.write(baOS.toByteArray(), 0, totalBytes);
fileUploadMultiLocator.setTotalBytes(totalBytes);
new Thread(fileUploadMultiLocator).start();
} catch (Exception e) {
}
System.out.println("Task 1 completed");
return 5;
});
}
Я думаю, поскольку мы знаем, что completetableFuture выполняется асинхронно, и в этом случае я отправляю baOS в цикле while при чтении файла, поэтому из-за потоков в цикле while задача не имеет контроля над baOS, поэтому она может записывать только некоторые байты, а не все на вторичном месте
К вашему сведению, я хотел бы сообщить вам, что если я добавлю
f1.get()
код в методе createCompletableFutureTask, тогда он работает нормально, но работает синхронно, что означает, что первичное и вторичное расположение и запись будут завершены одновременно из-за синхронного поведения.
Но я хочу, чтобы первичная запись местоположения выполнялась главным потоком синхронно, а вторичная запись местоположения должна выполняться заданием completetableFuture асинхронно в фоновом режиме. Можете ли вы помочь мне достичь этого?