package com.amaze.filemanager.services; import android.util.Log; import com.amaze.filemanager.utils.NoMoreFilesException; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; /** * Created by arpitkh996 on 17-08-2016. */ public class WriteThread extends Thread { BufferHandler bufferHandler; OutputStream outputStream; BufferedOutputStream out; long length=0; long lastwritten; long lasttime,elapsedTime; ProgressHandler progressHandler; String currentId; boolean started=false; /** * Write bytes from bufferhandler into outputstream * @param bufferHandler To store the read buffers from memory and write into the file * @param progressHandler Handle progress */ public WriteThread(BufferHandler bufferHandler, ProgressHandler progressHandler) { this.bufferHandler = bufferHandler; this.progressHandler=progressHandler; lasttime=System.currentTimeMillis()/1000; } @Override public void run() { super.run(); started=true; try { outputStream=bufferHandler.getNextOutputStream(currentId); //if stream is null then stop if(outputStream==null)return; out = new BufferedOutputStream(outputStream); currentId=bufferHandler.getCurrentWriteId(); progressHandler.setFileName(currentId); } catch (NoMoreFilesException e) { //Stop if no more files return; } //Check if there's still something to write while (bufferHandler.isReading()) { DataPacket dataPacket = bufferHandler.get(); // if no datapackets then try again if(dataPacket==null){ continue; } //If new packet is not for the current file,then get new stream if(!dataPacket.getName().equals(currentId)){ if(outputStream!=null){ try { //close old streams if(out!=null)out.close(); if(outputStream!=null)outputStream.close(); //Get next stream try { outputStream=bufferHandler.getNextOutputStream(currentId); //if stream is null then stop if(outputStream==null)break; out = new BufferedOutputStream(outputStream); currentId=bufferHandler.getCurrentWriteId(); progressHandler.setFileName(currentId); } catch (NoMoreFilesException e) { //Stop if no more files break; } } catch (IOException e) { e.printStackTrace(); } } } byte[] bytes = dataPacket.getBytes(); int length = dataPacket.getLength(); if (bytes != null && length > 0) try { //write bytes out.write(bytes); this.length+=length; //calculate progress if((elapsedTime=System.currentTimeMillis()/1000-lasttime)>=1){ progressHandler.addWrittenLength(this.length - lastwritten, (float) (this.length - lastwritten) / elapsedTime / 1024 / 1024); lasttime=System.currentTimeMillis()/1000; lastwritten=this.length; } } catch (IOException e) { bufferHandler.setWriting(false); e.printStackTrace(); } } System.out.println("Wrting Done"); bufferHandler.setWriting(false); } }