Android : How to read file in bytes?

前端 未结 8 954
逝去的感伤
逝去的感伤 2020-11-27 15:25

I am trying to get file content in bytes in Android application. I have get the file in SD card now want to get the selected file in bytes. I googled but no such success. Pl

相关标签:
8条回答
  • 2020-11-27 15:35

    Here is a solution that guarantees entire file will be read, that requires no libraries and is efficient:

    byte[] fullyReadFileToBytes(File f) throws IOException {
        int size = (int) f.length();
        byte bytes[] = new byte[size];
        byte tmpBuff[] = new byte[size];
        FileInputStream fis= new FileInputStream(f);;
        try {
    
            int read = fis.read(bytes, 0, size);
            if (read < size) {
                int remain = size - read;
                while (remain > 0) {
                    read = fis.read(tmpBuff, 0, remain);
                    System.arraycopy(tmpBuff, 0, bytes, size - remain, read);
                    remain -= read;
                }
            }
        }  catch (IOException e){
            throw e;
        } finally {
            fis.close();
        }
    
        return bytes;
    }
    

    NOTE: it assumes file size is less than MAX_INT bytes, you can add handling for that if you want.

    0 讨论(0)
  • 2020-11-27 15:35

    If you want to use a the openFileInput method from a Context for this, you can use the following code.

    This will create a BufferArrayOutputStream and append each byte as it's read from the file to it.

    /**
     * <p>
     *     Creates a InputStream for a file using the specified Context
     *     and returns the Bytes read from the file.
     * </p>
     *
     * @param context The context to use.
     * @param file The file to read from.
     * @return The array of bytes read from the file, or null if no file was found.
     */
    public static byte[] read(Context context, String file) throws IOException {
        byte[] ret = null;
    
        if (context != null) {
            try {
                InputStream inputStream = context.openFileInput(file);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    
                int nextByte = inputStream.read();
                while (nextByte != -1) {
                    outputStream.write(nextByte);
                    nextByte = inputStream.read();
                }
    
                ret = outputStream.toByteArray();
    
            } catch (FileNotFoundException ignored) { }
        }
    
        return ret;
    }
    
    0 讨论(0)
  • 2020-11-27 15:39

    You can also do it this way:

    byte[] getBytes (File file)
    {
        FileInputStream input = null;
        if (file.exists()) try
        {
            input = new FileInputStream (file);
            int len = (int) file.length();
            byte[] data = new byte[len];
            int count, total = 0;
            while ((count = input.read (data, total, len - total)) > 0) total += count;
            return data;
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            if (input != null) try
            {
                input.close();
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
        return null;
    }
    
    0 讨论(0)
  • 2020-11-27 15:42

    A simple InputStream will do

    byte[] fileToBytes(File file){
        byte[] bytes = new byte[0];
        try(FileInputStream inputStream = new FileInputStream(file)) {
            bytes = new byte[inputStream.available()];
            //noinspection ResultOfMethodCallIgnored
            inputStream.read(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bytes;
    }
    
    0 讨论(0)
  • 2020-11-27 15:54

    The easiest solution today is to used Apache common io :

    http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html#readFileToByteArray(java.io.File)

    byte bytes[] = FileUtils.readFileToByteArray(photoFile)
    

    The only drawback is to add this dependency in your build.gradle app :

    implementation 'commons-io:commons-io:2.5'
    

    + 1562 Methods count

    0 讨论(0)
  • 2020-11-27 15:55

    Following is the working solution to read the entire file in chunks and its efficient solution to read the large files using a scanner class.

       try {
            FileInputStream fiStream = new FileInputStream(inputFile_name);
            Scanner sc = null;
            try {
                sc = new Scanner(fiStream);
                while (sc.hasNextLine()) {
                    String line = sc.nextLine();
                    byte[] buf = line.getBytes();
                }
            } finally {
                if (fiStream != null) {
                    fiStream.close();
                }
    
                if (sc != null) {
                    sc.close();
                }
            }
        }catch (Exception e){
            Log.e(TAG, "Exception: " + e.toString());
        }
    
    0 讨论(0)
提交回复
热议问题