日期:2014-05-20  浏览次数:20743 次

inputStream数据输入流数据有几万个btye,直接read()会丢失数据怎么办??求各位大侠指导下
我想请教的是如果我的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;

}
------解决方案--------------------
探讨

怎么通过缓存的方式一段一段的读取到byte[]数组中


------解决方案--------------------
看看文件是否有错吧,你这才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);
}

------解决方案--------------------
探讨
已经改过了,不会有留1个字节第一次存入(0~141)共142个之后是i+142开始.......你上面还是讲的还是挺有用的

------解决方案--------------------
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){
 // 处理指令列表
}