我想请教的是如果我的inputStream对象中的数据比较多,比如几千万个btye,是将b初始化为所有数据长度,调用read方法一次写入所有的数据到数组中但是我数据过大的时候,会出现内存溢出的现象。。。怎么通过缓存的方式一段一段的读取到byte[]数组中!!最好能给个实例
------解决方案--------------------
//这是一个文件拷贝函数,参数例子tranFile(new File("C:\\temp\\a.txt"),new File("D:\\temp\\")),这个函数多大的文件都可以拷贝
public boolean tranFile(File copy,File paste) throws IOException{
// System.out.println(paste.isFile()+"123");
// System.out.println(copy.isFile()+"456");
if(!copy.isFile()||paste.isFile())
return false;
if(!paste.exists())
paste.mkdirs();
try{
String separator="";
separator=System.getProperties().getProperty("file.separator");
System.out.println(paste.getPath());
System.out.println(copy.getName());
System.out.println(separator);
InputStream in=new FileInputStream(copy);
OutputStream out=new FileOutputStream(paste.getPath()+separator+copy.getName());
byte b[]=new byte[1024];
while(in.read(b,0,1024)!=-1)//这就是你要的重点了,这个read函数是每次读取1024个byte到b中,0的意思是从b[0]开始存数据
{
out.write(b);
}
in.close();
out.close();
}
catch(Exception e)
{
System.out.println("你输入paste目录有问题!");
return false;
}
return true;
}
------解决方案--------------------
------解决方案--------------------
看看文件是否有错吧,你这才4K多个字节怎么可能就丢失了。就是你再大几倍也不会出现这种情况。
建议:
1.确认输入;
2.用debug逐行检查,看看是否有哪里的逻辑或数据出了问题
------解决方案--------------------
你最后有没有把输入流和输出流关闭呢?
好像字节流不关闭会出现一些错误的吧。。。
4K很小没什么关系的
大文件不是一般逐个逐个读入输出的吗?
- Java code
FileInputStream in=new FileInputStream(f); FileOutputStream out=new FileOutputStream(f2); int temp=0; while((temp=in.read())!=-1){ out.write(temp); } in.close(); out.close();
------解决方案--------------------
使用缓冲区
- Java code
byte[] vBuffer = new byte[2048];int vReadCount = 0;while((vReadCount = vInputStream.read(vBuffer)) != -1){ vOutputStream.write(vbuffer, 0, vReadCount);}
------解决方案--------------------
------解决方案--------------------
- Java code
// 指令结构class Command { public byte[] data; public Command(byte[] data) { this.data = data; }}// 处理代码List<Command> commandList = new ArrayList<Command>(512);int size = 0;byte[] buf = new byte[142];while((size = inputStream.read(buf)) != -1) { byte[] data = new byte[size]; System.arraycopy(buf, 0, data, 0, size) commandList.add(new Command(data));}for(Command command : commandList){ // 处理指令列表}