网络中的对象写入

Posted

技术标签:

【中文标题】网络中的对象写入【英文标题】:Object Writing in Network 【发布时间】:2016-03-04 03:39:46 【问题描述】:

我有简单的java服务器和客户端。在服务器中,一个文件被分成几块字节数组现在这个字节数组必须通过对象输出流发送。但是,如果每次我使用一个新数组来加载完美的文件数据,但是如果我使用相同的数组(我必须提高内存效率)来加载文件数据,客户端每次都会收到相同的(第一个)字节数组。

networkUtil 读写

public Object read() 
    Object o = null;
    try 
        o=ois.readObject();
     catch (Exception e) 
      //System.out.println("Reading Error in network : " + e.toString());
    
    return o;


public void write(Object o) 
    try 
        oos.writeObject(o);                        
     catch (IOException e) 
        System.out.println("Writing  Error in network : " + e.toString());
    

服务器编写部分

public void run() 
    try 
        //Scanner input=new Scanner(System.in);
        byte []b =new byte[1000];

        int num=5;
        long i=0;
        //ObjectOutputStream oosp = null;
        for(int j=0;j<num;j++) 
            File f=new File("G:\\photography\\DSC01020.JPG");
            RandomAccessFile file1=new RandomAccessFile(f,"r");
            long l=file1.length();
            num=(int)Math.ceil((double)l/(double)1000);
            //System.out.println("it is num "+num);
            //file1.close();

           // RandomAccessFile file=new RandomAccessFile(f,"r");
           // byte [] b =new byte[1000];
            System.out.println("seeking from "+i+"left "+(l-(j*1000)));
            file1.seek(i);
            file1.read(b);
            file1.close();
            System.out.println("it is first "+b[0]+" it is second "+b[1]);
            nc.write(b);//network util
            //oosp.write(b);
            file1.close();
            i+=1000;



        

客户端阅读部分

try 
        FileOutputStream fos=new FileOutputStream("C:\\Temp\\test.jpg");
        byte []a;
        for(int j=0;j<225;j++) 
            Object o=nc.read();//netwotk util
            if(o!= null) 
                if(o instanceof Data) 
                    Data obj=(Data)o;
                    //System.out.println(obj.getElement());
                
                if(o instanceof  byte[])
                
                    //System.out.println("it is byte array");
                    a=(byte[])o;
                    System.out.println("it is first "+a[0]+" it is second "+a[1]);
                    if(j==224)// it is hard coded for this file i have to change this for all file
                    
                        fos.write(a,0,203);
                    
                    else 
                        fos.write(a);
                    
                
               
        

【问题讨论】:

【参考方案1】:

你有记忆问题吗?在 Java 中,未使用的对象和数组会被垃圾回收。见Deleting An Entire Array。我不认为每次重新分配都会遇到任何问题。

编辑:

由于重新分配是问题所在,也许 ByteBuffer http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html 可以解决这个问题。

您可以尝试将 java.nio 与 FileChannel 和 ByteBuffer 一起使用。有关示例,请参阅 http://www.java2s.com/Tutorial/Java/0180__File/UseFileChannelandByteBuffertoCopyFile.htm 和 FileChannel ByteBuffer and Hashing Files。

【讨论】:

@JFPicard 如果我想发送一个像 1 GB 这样的大文件,不可能每次都重新分配,如果我想分配这么大的内存,JVM 会抛出错误。 @JFPicard 你能详细说明一下吗?我应该使用 Bytebuffer 从文件加载数据还是在字节数组中加载数据,而不是用它创建一个 Bytebuffer 并通过网络发送该 Bytebuffer 对象。

以上是关于网络中的对象写入的主要内容,如果未能解决你的问题,请参考以下文章

java中的序列化

java网络编程中拿到源后的写入动作

muduo网络库学习——日志系统

如何写入自动完成 json 对象?

项目命名空间中的rancher 2.0网络

通过网络共享在文件上写入文件