Android常用工具类之IO文件流工具类

关于IO流的工具类,可以节省很多的开发时间,具体内容大家可以看一看,有复制,获取文件内容,保存到文件中,保存Bitmap到文件中,对文件压缩和解压缩,直接从文件中获取JSON等等。

首先,定义常量

 private static final String LOG_TAG = "IOUtilities";

    private static final int IO_BUFFER_SIZE = 4 * 1024;

    private static final String UTF8 = "utf-8";

 public static boolean ensureDir(File file) {
        boolean result = false;
        if (file != null) {
            if (file.exists()) {
                result = true;
            } else {
                result = file.getParentFile().mkdirs();
            }
        }
        return result;
    }




1、复制
  /**
     * Copy the content of the input stream into the output stream, using a temporary
     * byte array buffer whose size is defined by {@link #IO_BUFFER_SIZE}.
     *
     * @param in  The input stream to copy from.
     * @param out The output stream to copy to.
     * @throws java.io.IOException If any error occurs during the copy.
     */
    public static void copy(InputStream in, OutputStream out) throws IOException {
        byte[] b = new byte[IO_BUFFER_SIZE];
        int read;
        while ((read = in.read(b)) != -1) {
            out.write(b, 0, read);
        }
    }

public static void copyFile(File src, File dest) throws IOException {
        if (src.exists()) {
            FileChannel channel1 = new FileInputStream(src).getChannel();
            FileChannel channel2 = new FileOutputStream(dest).getChannel();
            channel1.transferTo(0, channel1.size(), channel2);
        }
    }
 public static void copyDirectory(File src, File dest) throws IOException {
        if (src.exists()) {
            dest.mkdirs();
            File[] files = src.listFiles();
            if (files == null) {
                return;
            }
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                if (file.isDirectory()) {
                    copyDirectory(file, new File(dest, file.getName()));
                } else {
                    copyFile(file, new File(dest, file.getName()));
                }
            }
        }
    }

 public static boolean ensureMkdir(final File dir) {
        if (dir == null) {
            return false;
        }

        File tempDir = dir;
        int i = 1;
        while (tempDir.exists()) {
            tempDir = new File(dir.getParent(), dir.getName() + "(" + i + ")");
            i++;
        }
        return tempDir.mkdir();
    }




2、关闭流等
 /**
     * Closes the specified stream.
     *
     * @param stream The stream to close.
     */
    public static void closeStream(Closeable stream) {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                Log.e(LOG_TAG, "Could not close stream", e);
            }
        }
    }

    /**
     * Close an {@link SQLiteDatabase}.
     * <p/>
     * <br/>DO NOT close an database that you plan to reuse.
     *
     * @param db the database to close.
     */
    public static void closeSQLiteDatabase(SQLiteDatabase db) {
        if (db != null) {
            try {
                db.close();
            } catch (Exception e) {
                Log.e(LOG_TAG, "Could not close db", e);
            }
        }
    }

    /**
     * Close the cursor if necessary.
     * <p/>
     * <br/>DO NOT close an cursor that you plan to reuse.
     *
     * @param cursor the cursor to close.
     */
    public static void closeCursor(Cursor cursor) {
        if (cursor != null && !cursor.isClosed()) {
            try {
                cursor.close();
            } catch (Exception e) {
                Log.e(LOG_TAG, "Could not close cursor", e);
            }
        }
    }
3、从文件中获取内容

 public static String loadContent(File file) throws IOException {

        Log.d(LOG_TAG, "file-->" + file.getPath());
        if (file == null || !file.exists()) {
            return null;
        }

        FileInputStream fileInputStream = new FileInputStream(file);
        return loadContent(fileInputStream, UTF8);
    }

    public static String loadContent(InputStream stream, String encoding) throws IOException {
        Reader reader = new InputStreamReader(stream, encoding);
        CharArrayBuffer buffer = new CharArrayBuffer(stream.available());
        try {
            char[] tmp = new char[IO_BUFFER_SIZE];
            int l;
            while ((l = reader.read(tmp)) != -1) {
                buffer.append(tmp, 0, l);
            }
        } finally {
            closeStream(reader);
        }
        int start = 0;
        if (UTF8.equalsIgnoreCase(encoding) && buffer.length() > 0) {
            if (buffer.charAt(0) == '\uFEFF') {
                //skip utf-8 file BOM
                start = 1;
            }
        }
        return buffer.substring(start, buffer.length());
    }

 public static String readFileText(String file) {
        FileInputStream stream = null;
        try {
            stream = new FileInputStream(file);
            return loadContent(stream, UTF8);
        } catch (Exception e) {
            Log.w(e);
        } catch (OutOfMemoryError ee) {
            Log.w(ee);
        } finally {
            closeStream(stream);
        }
        return null;
    }



4、将内容保存到文件当中

 /**
     * 保存content到file中,默认采用utf-8编码方式
     *
     * @param file
     * @param content
     * @throws IOException
     */
    public static void saveToFile(File file, String content) throws IOException {

        saveToFile(file, content, UTF8);
    }

    /**
     * 保存content到file中,可以指定编码方式
     *
     * @param file
     * @param content
     * @param encoding
     * @throws IOException
     */
    public static void saveToFile(File file, String content, String encoding) throws IOException {
        OutputStreamWriter writer = null;
        try {
            ensureDir(file);
            writer = new OutputStreamWriter(
                    new FileOutputStream(file), encoding);
            writer.write(content);
        } finally {
            closeStream(writer);
        }
    }

    /**
     * 保存文件
     *
     * @param inputStream
     * @param destFile
     * @throws IOException
     */
    public static void saveToFile(InputStream inputStream, File destFile) throws IOException {

        if (inputStream == null || destFile == null) {
            throw new IOException("inputStream or destFile is null.");
        }

        FileOutputStream fos = null;
        try {
            ensureDir(destFile);
            fos = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        } finally {
            closeStream(fos);
        }
    }

    /**
     * 保存bitmap到文件中
     *
     * @param file
     * @param bitmap
     * @throws IOException
     */
    public static void saveToFile(File file, Bitmap bitmap) throws IOException {

        FileOutputStream out = null;
        try {
            ensureDir(file);
            out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
        } finally {
            closeStream(out);
        }
    }

    public static void copyFile(File src, File dest) throws IOException {
        if (src.exists()) {
            FileChannel channel1 = new FileInputStream(src).getChannel();
            FileChannel channel2 = new FileOutputStream(dest).getChannel();
            channel1.transferTo(0, channel1.size(), channel2);
        }
    }

5、删除文件、文件夹

/**
     * Deletes a file.
     * <p/>
     * <p>If Java impl fails, we will call linux command to do so.</p>
     *
     * @param file          the file to delete.
     * @param waitUntilDone whether wait until the linux command returns.
     */
    public static void deleteFile(File file, boolean waitUntilDone) {
        boolean success = file.delete();
        if (!success) {
            try {
                String[] args = new String[]{
                        "rm",
                        "-rf",
                        file.toString()
                };
                Process proc = Runtime.getRuntime().exec(args);
                if (waitUntilDone) {
                    int exitCode = proc.waitFor();
                    Log.d(LOG_TAG, "Linux rm -rf %s: %d.", file, exitCode);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Deletes a file.
     * <p/>
     * <p>If Java impl fails, we will call linux command to do so.</p>
     *
     * @param file the file to delete.
     */
    public static void deleteFile(File file) {
        deleteFile(file, true);
    }

    /**
     * Deletes a file.
     * <p/>
     * <p>If Java impl fails, we will call linux command to do so.</p>
     *
     * @param path          the path to the file to delete.
     * @param waitUntilDone whether wait until the linux command returns.
     */
    public static void deleteFile(String path, boolean waitUntilDone) {
        deleteDir(new File(path), waitUntilDone);
    }

    /**
     * Deletes a file.
     * <p/>
     * <p>If Java impl fails, we will call linux command to do so.</p>
     *
     * @param path the path to the file to delete.
     */
    public static void deleteFile(String path) {
        deleteDir(new File(path));
    }

    /**
     * delete a file, if error happened, ignore this.
     *
     * @param path
     */
    public static void deleteFileSafe(String path) {

        try {
            deleteDir(new File(path));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

  /**
     * Clean a specified directory.
     *
     * @param dir the directory to clean.
     */
    public static void cleanDir(final File dir) {
        deleteDir(dir, false);
    }

    /**
     * Clean a specified directory.
     *
     * @param dir    the directory to clean.
     * @param filter the filter to determine which file or directory to delete.
     */
    public static void cleanDir(final File dir, final FilenameFilter filter) {
        deleteDir(dir, false, filter);
    }

    /**
     * Clean a specified directory.
     *
     * @param dir    the directory to clean.
     * @param filter the filter to determine which file or directory to delete.
     */
    public static void cleanDir(final File dir, final FileFilter filter) {
        deleteDir(dir, false, filter);
    }

    public static void deleteDir(final String dir) {
        deleteDir(new File(dir));
    }

    /**
     * Delete a specified directory.
     *
     * @param dir the directory to clean.
     */
    public static void deleteDir(final File dir) {
        deleteDir(dir, true);
    }

    /**
     * Delete a specified directory.
     *
     * @param dir    the directory to clean.
     * @param filter the filter to determine which file or directory to delete.
     */
    public static void deleteDir(final File dir, final FileFilter filter) {
        deleteDir(dir, true, filter);
    }

    /**
     * Delete a specified directory.
     *
     * @param dir    the directory to clean.
     * @param filter the filter to determine which file or directory to delete.
     */
    public static void deleteDir(final File dir, final FilenameFilter filter) {
        deleteDir(dir, true, filter);
    }


    /**
     * Delete a specified directory.
     *
     * @param dir       the directory to clean.
     * @param removeDir true to remove the {@code dir}.
     */
    public static void deleteDir(final File dir, final boolean removeDir) {
        if (dir != null && dir.isDirectory()) {
            final File[] files = dir.listFiles();
            if (files != null && files.length > 0) {
                for (final File file : files) {
                    if (file.isDirectory()) {
                        deleteDir(file, removeDir);
                    } else {
                        file.delete();
                    }
                }
            }
            if (removeDir) {
                dir.delete();
            }
        }
    }

    /**
     * Delete a specified directory.
     *
     * @param dir       the directory to clean.
     * @param removeDir true to remove the {@code dir}.
     * @param filter    the filter to determine which file or directory to delete.
     */
    public static void deleteDir(final File dir, final boolean removeDir, final FileFilter filter) {
        if (dir != null && dir.isDirectory()) {
            final File[] files = dir.listFiles(filter);
            if (files != null) {
                for (final File file : files) {
                    if (file.isDirectory()) {
                        deleteDir(file, removeDir, filter);
                    } else {
                        file.delete();
                    }
                }
            }
            if (removeDir) {
                dir.delete();
            }
        }
    }

    /**
     * Delete a specified directory.
     *
     * @param dir       the directory to clean.
     * @param removeDir true to remove the {@code dir}.
     * @param filter    the filter to determine which file or directory to delete.
     */
    public static void deleteDir(final File dir, final boolean removeDir, final FilenameFilter filter) {
        if (dir != null && dir.isDirectory()) {
            final File[] files = dir.listFiles(filter);
            if (files != null) {
                for (final File file : files) {
                    if (file.isDirectory()) {
                        deleteDir(file, removeDir, filter);
                    } else {
                        file.delete();
                    }
                }
            }
            if (removeDir) {
                dir.delete();
            }
        }
    }
  * Clear content of a file.
     * If the file doesn't exist, it will return false.
     *
     * @param file the file to clear.
     * @return true if file becomes empty, false otherwise.
     */
    public static boolean clearFile(File file) {
        if (file == null || !file.exists()) {
            return false;
        }

        if (file.length() == 0) {
            return true;
        }

        boolean result = true;
        OutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream(file));
            out.write("".getBytes(UTF8));
        } catch (FileNotFoundException e) {
            result = false;
            Log.e(e.toString());
        } catch (IOException e) {
            result = false;
            Log.e(e.toString());
        } finally {
            closeStream(out);
        }
        return result;
    }




6、获取byte[]

 public static byte[] loadBytes(InputStream stream) throws IOException {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        try {
            byte[] tmp = new byte[IO_BUFFER_SIZE];
            int l;
            while ((l = stream.read(tmp)) != -1) {
                bytes.write(tmp, 0, l);
            }
        } finally {
            closeStream(stream);
        }
        return bytes.toByteArray();
    }

    /**
     * 添加接口直接从文件读取byte[]内容
     *
     * @param file 待读取的文件
     * @return 读取的byte[]内容
     * @throws IOException
     */
    public static byte[] loadBytes(File file) throws IOException {
        if (file == null || !file.exists()) {
            return null;
        }

        byte[] result = null;
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
            result = loadBytes(fileInputStream);
        } finally {
            closeStream(fileInputStream);
        }

        return result;
    }

7、从asset中获取文件
 /**
     * 从Asset中读取图片内容
     *
     * @param context
     * @param drawableFile
     * @return Bitmap
     */
    public static Bitmap loadAssetDrawable(Context context, String drawableFile) {
        if (TextUtils.isEmpty(drawableFile)) {
            return null;
        }

        Bitmap result = null;

        InputStream dataStream = null;
        try {
            dataStream = context.getAssets().open(drawableFile);
            result = BitmapFactory.decodeStream(dataStream);
        } catch (Throwable e) {
            Log.w(LOG_TAG, e);
        } finally {
            IOUtilities.closeStream(dataStream);
        }

        return result;
    }

    /**
     * 从Asset中读取文件内容,返回String
     *
     * @param context
     * @param fileName
     * @return
     */
    public static String loadFromAssets(Context context, String fileName) {
        if (TextUtils.isEmpty(fileName)) {
            return "";
        }

        try {
            return loadContent(context.getAssets().open(fileName), UTF8);
        } catch (Exception e) {
            Log.e(e.toString());
            return "";
        }
    }

    public static String loadFromAssets(Context context, String fileName, String encoding) {

        if (TextUtils.isEmpty(fileName)) {
            return "";
        }

        try {
            loadContent(context.getAssets().open(fileName), encoding);
        } catch (Exception e) {
            Log.e(LOG_TAG, e);
        }
        return "";
    }

    public static void writeBundleToStream(Bundle data, OutputStream stream) throws IOException {
        final Parcel parcel = Parcel.obtain();
        data.writeToParcel(parcel, 0);
        stream.write(parcel.marshall());
        parcel.recycle();
    }

    public static Bundle readBundleFromStream(InputStream stream) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        copy(stream, out);
        Parcel parcel = Parcel.obtain();

        byte[] data = out.toByteArray();
        parcel.unmarshall(data, 0, data.length);
        parcel.setDataPosition(0);

        Bundle bundle = new Bundle();
        bundle.readFromParcel(parcel);
        parcel.recycle();

        return bundle;
    }

    public static InputStreamReader newUtf8OrDefaultInputStreamReader(InputStream stream) {
        try {
            return new InputStreamReader(stream, UTF8);
        } catch (UnsupportedEncodingException e) {
            return new InputStreamReader(stream);
        }
    }

    public static OutputStreamWriter newUtf8OrDefaultOutputStreamWriter(OutputStream stream) {
        try {
            return new OutputStreamWriter(stream, UTF8);
        } catch (UnsupportedEncodingException e) {
            return new OutputStreamWriter(stream);
        }
    }

与Bitmap相关的工具类

 /**
     * 读取app文件的内容,同时解析为Bitmap类型
     *
     * @param context  上下文环境,可以是appContext,也可以是activity等
     * @param filename 文件名
     * @return
     */
    public static Bitmap loadBitmap(Context context, String filename) {

        if (context == null || TextUtils.isEmpty(filename)) {
            return null;
        }

        Log.d(LOG_TAG, "loadDrawable filename: %s", filename);

        FileInputStream inputStream = null;
        try {
            inputStream = context.openFileInput(filename);
            return BitmapFactory.decodeStream(inputStream);
        } catch (IOException e) {
            Log.e(LOG_TAG, e);
        } finally {
            closeStream(inputStream);
        }

        return null;
    }

    public static void saveRightAngleImage(File rawPhoto, File destPhoto, int destWidth, int destHeight) {

        if (rawPhoto == null || !rawPhoto.exists() || destPhoto == null) {
            return;
        }

        String rawPhotoPath = rawPhoto.getAbsolutePath();
        Bitmap bitmap = null;
        try {
            bitmap = rotateImage(getImageDegree(rawPhotoPath), rawPhotoPath, destWidth, destHeight);
            if (bitmap == null) {
                return;
            }

            // save the rotated image to file
            IOUtilities.saveToFile(destPhoto, bitmap);
        } catch (Exception e) {
            e.printStackTrace();

        } finally {

            if (bitmap != null) {
                bitmap.recycle();
            }
        }
    }

    private static int getImageDegree(String photoPath) throws Exception {

        ExifInterface ei = new ExifInterface(photoPath);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        int degree = 0;

        switch (orientation) {
            case ExifInterface.ORIENTATION_UNDEFINED:
            case ExifInterface.ORIENTATION_NORMAL:
                degree = 0;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                degree = 90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                degree = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                degree = 270;
                break;
        }

        Log.d(LOG_TAG, "orientation: %s, degree: %s", orientation, degree);

        return degree;
    }

    private static Bitmap rotateImage(int degree, String imagePath, int destWidth, int destHeight) {

        BitmapFactory.Options opt = new BitmapFactory.Options();
        opt.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(imagePath, opt);
        // calculate inSampleSize
        opt.inSampleSize = calculateInSampleSize(opt, destWidth, destHeight);
        opt.inJustDecodeBounds = false;
        opt.inPreferredConfig = Bitmap.Config.RGB_565;
        opt.inPurgeable = true;
        opt.inInputShareable = true;
        Bitmap rawBitmap = BitmapFactory.decodeFile(imagePath, opt);
        Bitmap destBitmap = rawBitmap;
        if (degree > 0 && rawBitmap != null) {
            Matrix matrix = new Matrix();
            if (rawBitmap.getWidth() > rawBitmap.getHeight()) {
                matrix.setRotate(degree);
                destBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawBitmap.getWidth(), rawBitmap.getHeight(),
                        matrix, true);
                rawBitmap.recycle();
            }
        }

        return destBitmap;
    }

    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }

9、对文件的压缩和解压缩
public static void saveZipFile(InputStream inputStream, File destFile) throws IOException {

        if (inputStream == null || destFile == null) {
            throw new IOException("inputStream or destFile is null.");
        }

        FileOutputStream output = null;
        output = new FileOutputStream(destFile);
        byte[] buffer = new byte[1024 * 8];
        BufferedInputStream in = new BufferedInputStream(inputStream, 1024 * 8);
        BufferedOutputStream out = new BufferedOutputStream(output, 1014 * 8);
        int len;
        try {
            while ((len = in.read(buffer, 0, 1024 * 8)) != -1) {
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            out.close();
            in.close();
        }
    }

    /**
     * 对文件解压缩
     * //     * @param zipFile
     *
     * @param outputDirectory
     * @throws ZipException
     * @throws IOException
     */
    public static void upzip(File zipFile, String outputDirectory)
            throws Exception {
        ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile.getPath()));
        ZipEntry z;
        String name = "";
        String extractedFile = "";
        int counter = 0;

        while ((z = in.getNextEntry()) != null) {
            name = z.getName();
            Log.d(LOG_TAG, "unzipping file: " + name);
            if (z.isDirectory()) {
                Log.d(LOG_TAG, name + "is a folder");
                // get the folder name of the widget
                name = name.substring(0, name.length() - 1);
                File folder = new File(outputDirectory + File.separator + name);
                folder.mkdirs();
                if (counter == 0) {
                    extractedFile = folder.toString();
                }
                counter++;
                Log.d(LOG_TAG, "mkdir " + outputDirectory + File.separator + name);
            } else {
                Log.d(LOG_TAG, name + "is a normal file");
                File file = new File(outputDirectory + File.separator + name);
                file.createNewFile();
                // get the output stream of the file
                FileOutputStream out = new FileOutputStream(file);
                int ch;
                byte[] buffer = new byte[1024];
                // read (ch) bytes into buffer
                while ((ch = in.read(buffer)) != -1) {
                    // write (ch) byte from buffer at the position 0
                    out.write(buffer, 0, ch);
                    out.flush();
                }
                out.close();
            }
        }

        in.close();

    }

10、获取文件中json内容

 /**
     * 读取json文件
     *
     * @param jsonPath
     * @return
     */
    public static String readJsonFile(String jsonPath) {

        File file = new File(jsonPath);
        Scanner scanner = null;
        StringBuilder buffer = new StringBuilder();
        try {
            scanner = new Scanner(file, "utf-8");
            while (scanner.hasNextLine()) {
                buffer.append(scanner.nextLine());
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block

        } finally {
            if (scanner != null) {
                scanner.close();
            }
        }
        return buffer.toString();
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.hexiang.utils; import java.io.*; /** * FileUtil. Simple file operation class. * * @author BeanSoft * */ public class FileUtil { /** * The buffer. */ protected static byte buf[] = new byte[1024]; /** * Read content from local file. FIXME How to judge UTF-8 and GBK, the * correct code should be: FileReader fr = new FileReader(new * InputStreamReader(fileName, "ENCODING")); Might let the user select the * encoding would be a better idea. While reading UTF-8 files, the content * is bad when saved out. * * @param fileName - * local file name to read * @return * @throws Exception */ public static String readFileAsString(String fileName) throws Exception { String content = new String(readFileBinary(fileName)); return content; } /** * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(String fileName, String encoding) throws Exception { String content = new String(readFileBinary(fileName), encoding); return content; } /** * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(InputStream in) throws Exception { String content = new String(readFileBinary(in)); return content; } /** * Read content from local file to binary byte array. * * @param fileName - * local file name to read * @return * @throws Exception */ public static byte[] readFileBinary(String fileName) throws Exception { FileInputStream fin = new FileInputStream(fileName); return readFileBinary(fin); } /** * 从输入读取数据为二进制字节数组. * @param streamIn * @return * @throws IOException */ public static byte[] readFileBinary(InputStream streamIn) throws IOException { BufferedInputStream in = new BufferedInputStream(streamIn); ByteArrayOutputStream out = new ByteArrayOutputStream(10240); int len; while ((len

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值