I have a problem, which I do not seem to be able to solve… I do a http download of a file, but the CRC32 of the file on the server and on the client do not match. Also, the file has different size, so obviously I must be doing something wrong… when I download via Firefox, the filesize is ok… so I guess it is somewhere in the client code.
I already found Corrupt file when using Java to download file, but that didn’t help me either…
Here’s the code:
private void downloadJar(String fileName, long crc32Server) throws IOException { System.out.println('Downloading file '' + fileName + '' from server '' + mServer + ''.'); HttpURLConnection sourceConnection = null; BufferedInputStream inputStream = null; BufferedWriter fileWriter = null; long crc32Client; try { URL sourceURL = new URL(fileName); try { sourceConnection = (HttpURLConnection)sourceURL.openConnection(); } catch (MalformedURLException exc) { throw new RuntimeException('Configured URL caused a MalformedURLException: ', exc); } sourceConnection.setRequestProperty('Accept-Encoding', 'zip, jar'); sourceConnection.connect(); inputStream = new BufferedInputStream(sourceConnection.getInputStream()); fileWriter = new BufferedWriter(new FileWriter(targetFolder + File.separator + fileName)); CRC32 crc32 = new CRC32(); for (int singleByte = inputStream.read(); singleByte != -1; singleByte = inputStream.read()) { fileWriter.write(singleByte); crc32.update(singleByte); } crc32Client = crc32.getValue(); } finally { if (inputStream != null) { inputStream.close(); } if (fileWriter != null) { fileWriter.flush(); fileWriter.close(); } if (sourceConnection != null) { sourceConnection.disconnect(); } } if (crc32Client != crc32Server) { // deleteFile(fileName); throw new IOException('CRC32 did not match for file '' + fileName + '': ' + crc32Client + '!=' + crc32Server); } }
You should use a BufferedOutputStream instead of a
FileWriter/BufferedWriter. In general,*Streamshandle raw binary data, while*Writershandle character data (which is an interpretation of the raw binary data for a given character encoding).