Android - 什么是读取输入流并保存为文件的最有效方法?

时间:2012-05-28 19:48:34

标签: java android

我目前使用以下内容读取蓝牙输入流并将其另存为文件。它适用于小文件,但随后文件较大,它首先创建一个大字节数组。什么是最有效的方法,确保它只读取指定的长度,不多也不少?

    public void getAndWrite(InputStream is, long length, String filename)
            throws IOException {

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int) length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
                && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
            offset += numRead;
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read stream ");
        }

        // Write the byte array to file
        FileOutputStream fos = null;
        try {
            fos = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            Log.e(TAG, "Problem finding internal storage", e);
        }
        try {
            fos.write(bytes);
            fos.close();
        } catch (IOException e) {
            Log.e(TAG, "Problem writing file", e);
        }
    }

1 个答案:

答案 0 :(得分:1)

int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int remaining = length;
int read = 0;
while (remaining > 0 
       && (read = in.read(buffer, 0, Math.min(remaining, bufferSize))) >= 0) {
   out.write(buffer, 0, read);
   remaining -= read;
} 

请注意,上面的内容确保您不会写更多长度字节。但它并不能确保你写出完全长度的字节。我没有看到如何在不读取内存中的长度字节,或读取长度字节并写入临时文件,然后将临时文件写入最终目标的情况下执行此操作。