53 votes

java.io.FileNotFoundException : Ce fichier ne peut pas être ouvert en tant que descripteur de fichier ; il est probablement compressé.

Je suis en train de programmer un soundboard à partir d'Android. Le problème est que certains sons fonctionnent, et d'autres pas. Voici le traceback que j'obtiens pour les sons qui ne fonctionnent pas

05-31 13:23:04.227 18440 18603 W System.err: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
05-31 13:23:04.227 18440 18603 W System.err:    at android.content.res.AssetManager.openAssetFd(Native Method)
05-31 13:23:04.227 18440 18603 W System.err:    at android.content.res.AssetManager.openFd(AssetManager.java:331)
05-31 13:23:04.227 18440 18603 W System.err:    at com.phonegap.AudioPlayer.startPlaying(AudioPlayer.java:201)
05-31 13:23:04.227 18440 18603 W System.err:    at com.phonegap.AudioHandler.startPlayingAudio(AudioHandler.java:181)
05-31 13:23:04.235 18440 18603 W System.err:    at com.phonegap.AudioHandler.execute(AudioHandler.java:64)
05-31 13:23:04.235 18440 18603 W System.err:    at com.phonegap.api.PluginManager$1.run(PluginManager.java:86)
05-31 13:23:04.235 18440 18603 W System.err:    at java.lang.Thread.run(Thread.java:1096)

Des idées ?

4voto

cybergen Points 678

Vous ne devriez obtenir cette exception que si vous essayez d'ouvrir le fichier FileDesriptor . Pour lire simplement le fichier, vous pouvez passer par la rubrique InputStream ( AssetManager.open("filename.ext") ). Cela a fonctionné pour moi.

Si vous avez besoin de la taille du fichier à l'avance, vous avez besoin de l'option FileDescriptor (et donc un fichier non compressé) pour appeler son getLength() sinon vous devez lire tout le flux pour déterminer sa taille.

4voto

Q Locker Points 744

Cette exception peut être levée en appelant :

final AssetFileDescriptor afd = activity.getAssets().openFd(path);

J'ai résolu le problème en enregistrant le fichier dans res/raw au lieu du dossier assets, puis obtenir le fichier AssetFileDescriptor de cette manière :

final AssetFileDescriptor afd = activity.getResources().openRawResourceFd(rawId);

Ensuite, le FileNotFoundException a disparu et le fichier n'est plus compressé.

2voto

Alfaplus Points 124

J'ai fait le tour, j'utilise :

ParcelFileDescriptor mFileDescriptor = context.getAssets().openFd(file).getParcelFileDescriptor();

Mais cela renvoie : java.io.FileNotFoundException : Ce fichier ne peut pas être ouvert en tant que descripteur de fichier ; il est probablement compressé.

Au lieu de cette implémentation, j'ouvre le fichier directement en utilisant les fonctions de ParcelFileDescriptor.

private void openRenderer(Context context,String fileName) throws IOException {  

File file=  FileUtils.fileFromAsset(context, fileName);
        ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_WRITE); 

        mPdfRenderer = new PdfRenderer(parcelFileDescriptor);
    }`

    public class FileUtils {
    private FileUtils() {
    }

    public static File fileFromAsset(Context context, String assetName) throws IOException {
        File outFile = new File(context.getCacheDir(), assetName );
        copy(context.getAssets().open(assetName), outFile);

        return outFile;
    }

    public static void copy(InputStream inputStream, File output) throws IOException {
        FileOutputStream outputStream = null;

        try {
            outputStream = new FileOutputStream(output);
            boolean read = false;
            byte[] bytes = new byte[1024];

            int read1;
            while((read1 = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read1);
            }
        } finally {
            try {
                if(inputStream != null) {
                    inputStream.close();
                }
            } finally {
                if(outputStream != null) {
                    outputStream.close();
                }

            }

        }

    }
}

1voto

firozSujan Points 98

J'ai ajouté l'extension de mon fichier comme ci-dessous dans le build.gradle et j'ai résolu mon problème

android {
   aaptOptions {
      noCompress "tflite"
      noCompress "txt"
      noCompress "pdf"
   }
}

0voto

Si le fichier à obtenir dans le dossier assets est supérieur à 1 Mo, ce qui a fonctionné pour moi, c'est de compresser le fichier sous forme de fichier zip, de le décompresser avant de l'utiliser et de le stocker dans la mémoire externe sans le compresser.

InputStream fileInputStream = getAssets().open("your_file.your_file_extension.zip");
unzipInputStream(fileInputStream, "your_folder_in_external_storage");

Les unzipInputStream que j'ai utilisée est celle-ci :

public static void unzipInputStream(InputStream inputStream, String location)
{
    try {
        if ( !location.endsWith(File.separator) ) {
            location += File.separator;
        }
        File f = new File(location);
        if(!f.isDirectory()) {
            f.mkdirs();
        }
        ZipInputStream zin = new ZipInputStream(new BufferedInputStream(inputStream, BUFFER_SIZE));
        try {
            ZipEntry ze;
            while ((ze = zin.getNextEntry()) != null) {
                String path = location + ze.getName();
                File unzipFile = new File(path);

                if (ze.isDirectory()) {
                    if(!unzipFile.isDirectory()) {
                        unzipFile.mkdirs();
                    }
                } else {
                    createParentDirectoriesIfMissing(unzipFile);
                    unzipFile(zin, unzipFile);
                }
            }
        } finally {
            zin.close();
        }
    } catch (Exception e) {
        Log.e("", "Unzip exception", e);
    }
}

private static void createParentDirectoriesIfMissing(File unzipFile)
{
    File parentDir = unzipFile.getParentFile();
    if ( null != parentDir ) {
        if ( !parentDir.isDirectory() ) {
            parentDir.mkdirs();
        }
    }
}

private static void unzipFile(ZipInputStream zin, File unzipFile) throws IOException
{
    int size;
    byte[] buffer = new byte[BUFFER_SIZE];
    FileOutputStream out = new FileOutputStream(unzipFile, false);
    BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE);

    try {
        while ( (size = zin.read(buffer, 0, BUFFER_SIZE)) != -1 ) {
            fout.write(buffer, 0, size);
        }

        zin.closeEntry();
    } finally {
        fout.flush();
        fout.close();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X