黑马程序员技术交流社区
标题:
关于数据流存储的问题
[打印本页]
作者:
韩伟
时间:
2012-7-26 12:29
标题:
关于数据流存储的问题
我写了一段拷贝文件的代码,代码如下:
import java.io.*;
class FileWork
{
private String sourceName, destName;
private BufferedReader read;
private BufferedWriter write;
private String line;
private boolean openFile()
{
try
{
read = new BufferedReader(new FileReader(sourceName));
}
catch(IOException e)
{
System.out.println("OpenFileException:"+sourceName);
return false;
}
try
{
write = new BufferedWriter(new FileWriter(destName));
}
catch(IOException e)
{
System.out.println("OpenFileException:"+destName);
return false;
}
return true;
}
private boolean copyFile()
{
int count = 0;
try
{
line = read.readLine();
while(line != null)
{
write.write(line);
write.newLine();
line = read.readLine();
}
}
catch(IOException e)
{
count++;
if(count > 0)
System.out.println("Find "+count+" IOException");
}
return true;
}
private boolean closeFile()
{
boolean flag = true;
try
{
read.close();
}
catch(IOException e)
{
System.out.println("CloseFileException:"+sourceName);
flag = false;
}
try
{
write.close();
}
catch(IOException e)
{
System.out.println("CloseFileException:"+destName);
flag = false;
}
return flag;
}
public boolean work(String src, String dst)
{
sourceName = src;
destName = dst;
return openFile()&©File()&&closeFile();
}
}
复制代码
我测试的时候,先拷贝了一个8.63M的.out文件,没有问题,之后我又拷贝了一个135M的.out文件结果提示OutoffMemeryException异常。然后我查了一下关于BufferedReader的信息,它的默认大小是8K,那么也就是说它并不是一次就存取完的,是份多次存取的,那如果是这样的话为什么还有内存异常呢?请给出原因和解决办法,感谢给位大牛!
作者:
罗宵
时间:
2012-7-26 12:56
OutoffMemeryException异常是吗因为内存溢出或没有可用的内存提供给垃圾回收器时,Java 虚拟机无法分配一个对象,这时抛出该异常。
文件太大,超过JVM内存,溢出了。
作者:
周玉龙
时间:
2012-7-26 13:59
你这里用的是装饰流,BufferedReader,BufferedWriter,readLine()方法来读取数据。
他们都是字符流,字符流是用来读取或写入文本文件的。readLine()方法是读到了换行就存储进去,再读。
而你这里要复制的文件时MP3格式的,那必须用字节流来读取。一般用字节数组来缓存数据。
byte[] by = new byte [1024];
这里抛异常时因为你用readLine()方法。他没有读到换行的字符时就一直读下去,MP3文件中没有换行符。
所有jvm分配的缓存装满了,他还在读。就内存溢出了。
作者:
肖琦
时间:
2012-7-26 14:02
你在进行文件Copy的时候用的是字符流,每次取出的数据是以line为单位的。
对于正常的存储字符的文件来说,每遇到一个"\r\n"就将数据读出来放到内存中,如果这行的数据量很小当然没有问题,
但是对于二进制文件,也许程序从头读到尾都读不到“\r\n”对应的编码,所以它会一口气将整个文件(100多M)读出来,
结果可想而知了。
建议你用字节流Copy文件
作者:
韩伟
时间:
2012-7-26 14:52
大家说的不错,我刚发现,我那个文件确实是文本数据,可是里面没有换行,也就是说readLine()根本装不下。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2