Some comments on your code -
1) Your code loads the whole file into memory before encryption which does not scale well. If one uses the cipher streams there is no need to do this.
2) You seem to be storing the IV is a separate file. There is no need to do this since the IV is not secret. One common approach is to store the IV at the start of ciphertext file.
3) The IV comment of 2) also applies to the salt and iteration count and they can also be stored in the ciphertext file. The only thing that needs to be kept secret and not placed in the ciphertext file is the password!
4) fis.available() does not guarantee to give you the length of the file. To get the length
you should use File.length().
5) If you are reading/writing large byte arrays there is no real advantage in wrapping the output stream in buffered streams. Of course if you change to use the cipher streams then there is an advantage in using the buffered streams.
Identifying that a particular file contains ciphertext is not easy with your approach. One approach I have used in the past is to prefix the ciphertext with a digest of the password, salt, iteration count and IV and then follow this with the salt, IV and iteration count and then finally the encrypted data. The digest can then be checked prior to decrypting the ciphertext and the file rejected if the digest does not match.