JAVA文件读写输入输出流关闭问题、JAVA垃圾回收

切记: 读写文件一定要及时关闭输入输出流

项目中,用到将rtf文档上传后修改一个更新标记为0未更新,另外一个程序将文档上传到LED屏上面,LED程序检测到更新标记为未更新时将状态投到LED上面,并将状态更新为1已更新。

现象:上传文件时使用输入输出流,上传成功后LED屏不显示更新文档,为空。

部分代码:

public void save(){

upload();

save(XXXXX);

}

public void upload() throws Exception{

//以服务器的文件保存地址和源文件名建立上传文件输出流

xczl.setPath(getSavePath()+"\\"+getUploadFileName());

FileOutputStream fos = new FileOutputStream(getSavePath()+"\\"+getUploadFileName());

//以上传文件创建一个文件上传流

FileInputStream fis = new FileInputStream(upload);

//将上传文件的内容写入服务器

byte[] buffer = new byte[1024*1024];

int len = 0;

while((len = fis.read(buffer))>0)

{

fos.write(buffer,0,len);

}

}

到这里,您发现什么具体原因了么?

原因:  其中,如果是利用上面代码上传文件后,打开上传后的文件提示该文件正在被其他应用程序占用。但是过一会儿之后就可以打开了。

切记,文件读写完成后要及时关闭输入输出流,如果是未关闭输入输出流就会出现该文件正在被其他应用程序占用的现象。可是为什么一会

又可以打开文件了呢,是JAVA自动垃圾回收机制的问题,长时间不用该文件的输入输出流会默认回收掉。上传的文件时同名文件,所以是覆盖的。

在写文件过程中,LED程序已经将其更新状态为1,但是此时输入输出流未关闭,导致LED程序无法访问上传文件。呵呵,到此应该知道怎么解决了。

解决代码:

public void upload() throws Exception{

//以服务器的文件保存地址和源文件名建立上传文件输出流

xczl.setPath(getSavePath()+"\\"+getUploadFileName());

FileOutputStream fos = new FileOutputStream(getSavePath()+"\\"+getUploadFileName());

//以上传文件创建一个文件上传流

FileInputStream fis = new FileInputStream(upload);

//将上传文件的内容写入服务器

byte[] buffer = new byte[1024*1024];

int len = 0;

while((len = fis.read(buffer))>0)

{

fos.write(buffer,0,len);

}

fos.close();

fis.close();//关键代码

}



JAVA文件读写输入输出流关闭问题、JAVA垃圾回收

时间: 2024-08-06 11:37:47

JAVA文件读写输入输出流关闭问题、JAVA垃圾回收的相关文章

Java和C#输入输出流方法

1,JAVA中操作方法: import java.io.*; public class FileInputStreamTest { public static void main(String[] args) throws IOException { //创建字节输入流 FileInputStream fis = new FileInputStream("FileInputStreamTest.java"); //创建一个长度为1024的竹筒 byte[] bbuf = new byt

java 文件读写的实用工具

package org.rui.io.util; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.TreeSet; /** * 文件读写的实用工具 * @author lenovo * */ p

【JAVA进阶架构师指南】之四:垃圾回收GC

前言 ??在[JAVA进阶架构师指南]系列二和三中,我们了解了JVM的内存模型以及类加载机制,其中在内存模型中,我们说到,从线程角度来说,JVM分为线程私有的区域(虚拟机栈/本地方法栈/程序计数器)和线程公有区域(方法区和java堆),其中线程私有区域内存随着线程的结束而跟着被回收,GC主要关注的是堆和方法区这部分的内存. GC回收算法 ??GC如何确定哪些对象需要回收呢?一般而言,有两种算法:引用计数算法和可达性分析算法. 引用计数算法 ??为每个对象都持有一个引用计数器,初试状态为0,该对象

Java I/O输入输出流详解

一.文件的编码               开发时一定要注意项目默认的编码!!!!!!!!               文件操作的时候一定要记得关闭!!!!!!!!        ASCII:美国标准信息交换码,用一个字节的7位可以表示一个字符        ISO8859-1:拉丁码表,西欧标准字符集,用一个字节的8位表示        GB2312:中文编码表,用两个字节来表示中文编码        GBK:中文编码表的升级,融合了更多表示中文文字符号        GB18030:GBK的

java文件读写操作

Java IO系统里读写文件使用Reader和Writer两个抽象类,Reader中read()和close()方法都是抽象方法.Writer中 write(),flush()和close()方法为抽象方法.子类应该分别实现他们. Java IO已经为我们提供了三个方便的Reader的实现类,FileReader,InputStreamReader和BufferedReader.其中最重要的类是InputStreamReader, 它是字节转换为字符的桥梁.你可以在构造器重指定编码的方式,如果不

java实验8-Java输入输出流

1 读写文件 [实验目的] (1)掌握文本文件的读写方法. (2)掌握随机文件的读写方法. (3)掌握InputStream.OutputStream抽象类的基本使用. (4)掌握FileInputStream.FileOutputStream.DataInputStream.DataOutputStream 抽象类的基本使用. [实验要求] 要求一:建立StreamDemo类,实现标准输入输出流的建立,能从键盘读取字符串并输出该字符串. 要求二:应用Java的输入输出流,对一个图片文件进行处理

java文件读写

读写文件: import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; public class DXshuju { public static void main(String[] args) {        String str ="chinayang  朋

java文件读写操作类

借鉴了项目以前的文件写入功能,实现了对文件读写操作的封装 仅仅需要在读写方法传入路径即可(可以是绝对或相对路径) 以后使用时,可以在此基础上改进,比如: 写操作: 1,对java GUI中文本框中的内容进行捕获,放在txt文本文档中 2,对各种类型数据都以字符串的形式逐行写入 3,对全局数组的内容进行写入 读操作: 获取文件行数 对逐行字符串型数据进行类型转换,放入二维数组中 为后面算法处理提供入口,但是要小心的是:不可以将行数用全局变量做计数器,否则每次读入是全局变量累加出错,应重新开始读取

Java文件读写操作指定编码方式防乱码

读文件:BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求.因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader).例如, BufferedReader in   = n