当前位置: 代码迷 >> J2SE >> inputStream数据输入流数据有几万个btye,直接read()会丢失数据怎么处理?求各位大侠指导下
  详细解决方案

inputStream数据输入流数据有几万个btye,直接read()会丢失数据怎么处理?求各位大侠指导下

热度:43   发布时间:2016-04-24 01:59:48.0
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){ // 处理指令列表}
  相关解决方案