Como descompactar arquivo .gz no Android
Você pode precisar carregar alguns arquivos na sua APP como por exemplo uma lista de todas as cidades e estados do brasil ou um banco com os ceps para isso você pode manter esses arquivos compactados em um arquivo .gz para não pessar muito na hora da instalação e dentro do projeto, daí na hora de fazer a instalação você descompacta esses arquivos na memoria e faz a inclusão deles no banco de dados principal.
No meu caso tenho um arquivo compactado chamado de municipios.gz, você pode colocar esses arquivos dentro da pasta ‘res’ do seu projeto aconselho criar uma sub-pasta chamada ‘raw’ e deixar esses arquivos lá.
Importante: Não sei porque mas a SDK do android acusa o arquivo ‘.gz’ como inexistente nesse caso é só você salvar o arquivo sem a extensão .gz depois de copiar para a pasta renomeie o mesmo no eclipse e tire a extensão. Fique tranquilo que de alguma forma a SDK sabe que ele é um .gz e vai descompacta-lo normalmente.
erro ao tentar acessar um arquivo com a extensão .gz na pasta res/raw
file 02-27 00:53:38.809: E/AndroidRuntime(399): Caused by: android.content.res.Resources$NotFoundException: File res/raw/municipios.gz from drawable resource ID #0x7f040001
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public JSONArray loadFile() throws IOException, JSONException { // pegando o arquivo gz da pasta res/raw e descompactando InputStream json = new GZIPInputStream( getHelper().getContext().getResources().openRawResource(R.raw.municipios)); // lendo o arquivo json e retornando um array StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader( new InputStreamReader(json)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } return new JSONArray(builder.toString()); } |
Nesse caso acima o arquivo que estava dentro do .gz era um json então precisava de retornar para a models um array em json, mas o importante para descompactar o arquivo é a linha:
1 | InputStream json = new GZIPInputStream(getHelper().getContext().getResources().openRawResource(R.raw.municipios)); |
Tive que colocar o getHelper e getContext pois o método de loadFile estava dentro da minha DAO, se você estiver usando o método GZIPInputStream de dentro de uma activity faça apenas:
1 | InputStream json = new GZIPInputStream(getResources().openRawResource(R.raw.municipios)); |
Nas linhas abaixo eu leio o arquivo json e salvo em uma StringBuilder para transforma-lo em um array, no caso acima ele descompacta o arquivo .gz e abre o arquivo json tudo dentro da memória do dispositivo.