File 里面的flush()和close()

前天项目组遇到文件上传,对内存加大的问题。特意看了看相关知识,也对这个有一定的了解

		try {
			FileInputStream fis=new FileInputStream(new File("/home/saas/maven/maven.zip"));
			BufferedInputStream bis=new BufferedInputStream(fis);
			FileOutputStream fos=new FileOutputStream(new File("/home/saas/bb.sh"));
			byte[] buffer=new byte[1024*1024*1024];//这是自定义java缓冲区
			int len=0;
			while((len=bis.read(buffer))>0){//
				fos.write(buffer, 0, len);//貌似直接就调用了io的底层
//				fos.flush();
				System.out.println("复制了 1024*1024*1024  Byte");
			}

			fis.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

首先这里个FileInputtream里面的close方法和flash()方法 不调用也会将文件,这个文件也会被复制成功,并且数据对。原理是这样的,因为fos里面直接调用的本地方法,将数据写入文件,所以不关掉叶能成功,但不关掉会造成内存不能回收,有可能造成内存泄漏什么的

其次,BufferedInputream和BufferedOutputStream 都是提供缓存,可以看到里面有个缓存数组buf[] 默认是8092字节。以下是源码

  /**
     * Writes the specified byte to this buffered output stream.
     *
     * @param      b   the byte to be written.
     * @exception  IOException  if an I/O error occurs.
     */
    public synchronized void write(int b) throws IOException {
        if (count >= buf.length) {
            flushBuffer();
        }
        buf[count++] = (byte)b;
    }

这里首先判断一下,当前是缓冲区是否已经满了,如果没满,就继续写,如果满了,就会flushBuffer,flushBuffer其实就是将调用本地方法,将字节数组里的数据写入文件里面,以下是源码

 /** Flush the internal buffer */
    private void flushBuffer() throws IOException {
        if (count > 0) {
            out.write(buf, 0, count);
            count = 0;
        }
    }

当你调用BufferOutputStream 的write.如果传入的是FileInputStream的话,BufferOutputSream 里面的out就会指向FileInputStream。这里使用了装饰模式。

另外可以看到源码,FileInputStream里面的flush是继承OutputStream的,而OutputStream里的flush是个空的方法,什么都没干

时间: 2024-10-06 21:57:16

File 里面的flush()和close()的相关文章

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半天,没有找到合适的方法 开始我是先用jd-gui反编译 把我需要修改的那个A.class文件反编译出来把代码保存到A.Java 然后直接在dos里面用javac A.java编译 问题来了.. 因为A.java引用了很多其他jar下面的方法 而且A.java有package 鼓捣了半天以后 最终结果:编译无法

Android Service生命周期 Service里面的onStartCommand()方法详解

2014-10-21 23:40 32人阅读 评论(0) 收藏 举报 在Demo上,Start一个Service之后,执行顺序:onCreate - > onStartCommand 然后关闭应用,会重新执行上面两步. 但是把代码拷贝到游戏工程发现,关闭游戏后,只执行了onStart,却没有执行onStartCommand! 查找到下面的文章: [plain] view plaincopy Service里面的onStartCommand()方法详解 启动service的时候,onCreate方

Python标准库:内置函数print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

本函数是实现对象以字符串表示的方式格式化输出到流文件对象file里.其中所有非关键字参数都按str()方式进行转换为字符串输出,关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符:关键字参数end是输出结束时的字符,默认是换行符\n:关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件:参数flush是立即把内容输出到流文件,不作缓存. 例子: #print() print(1, 2, 3, sep = ',', end =

Afianl框架里面的FinalBitmap加载网络图片

在Afianl框架里,FinalBitmap如何加载网络图片?有什么简单的方法吗?现在让麦子学院的android开发老师讲讲afina框架里面的finalbitmap加载网络图片的方法,Afinal里边FinalBitmap:用于显现bitmap图像,而无需思考线程并发和oom等疑问. 1.测验恳求 运用页面翻开http://avatar.csdn.net/C/6/8/1_bz419927089.jpg"可以看到一张图像. 2.新建FinalBitmap目标 1 FinalBitmap bitm

函数的上下文就是函数里面的this是谁

规律1:函数用圆括号调用,函数的上下文是window对象 比如小题目: function fun(){ var a = 888; alert(this.a); //实际上访问的是window.a } var a = 666; fun(); //弹出666 函数function fun(){}的上下文是什么!不要看它怎么定义,要看它怎么调用!!此时是fun()函数名加上圆括号直接调用,此时上下文就是window对象! 而我们知道:所有的全局变量都是window对象的属性,(注意:函数里面的局部变量

如何去除项目里面的SVN和CVS文件夹

SVN和CVS是我们常使用的项目版本管理工具,为我们的工作带来了很大的方便.但是,有时候我们需要删除里面的SVN和CVS文件夹. 1 如何快速的删除项目中的版本控制文件夹  (1) 删除项目中的SVN文件夹.我们可以使用bat脚本来实现快速递归删除,代码如下: @echo off echo Deleting SVN folders and files under: %1 REM Open Folder specified by parameter. cd %1 REM Recursive del

提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载

要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1765.html()  困难:因为页面的图片是用编辑器加进去的        :图片与文字存到数据库的字段中 :实现思路:从数据库中读取这个字段,把字段里面的src替换成lazyload 然后再返回给页面 这里主要讲是怎么把从数据库取到的数据里面的字段里面的值替换然后与页面直接的数据转换 首先 pu

form里面的action和method(post和get的方法)使用

一.form里面的action和method的post使用方法 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="formsubmitpost.aspx.cs" Inherits="formsubmitpost" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh

gdb 和 addr2line 调试 crash(包含如何调试so里面的crash)

嵌入式编程中会遇到各种crash的问题. 对于这样的问题,有两种调试方法: addr2line  和 gdb. 第一章   先讲解下gcc 编译加不加 -g 对程序的影响, 还有strip. //1.1.cpp #include <iostream> using namespace std; bool IsUnique() {         int k = 0, m = 0;         k = k/m;      //这里会crash         return true; } in