java - 网络中的对象编写

标签 java networking objectinputstream objectoutputstream

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

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);
                    }
                }
            }   
        }

最佳答案

你有内存力问题吗?在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.htmFileChannel ByteBuffer and Hashing Files例如。

关于java - 网络中的对象编写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33999682/

相关文章:

java - 在 Spring Boot 中获取 EntityManager 的句柄

networking - Docker修改单个运行容器的iptables

java - 文件中序列化对象的数量

java - ObjectInputStream 拖拽程序

java - Android 中的 AssetFileDescriptor 是否必须关闭

java - JAXB ClassNotFoundException 使用 Java 11 构建 Spring Boot App 2.2.0

Java:从目录中获取新文件列表

wordpress - WordPress 多站点中的管理员角色在保存页面时会删除内容

c - C 中的原始套接字

java - 序列化ObjectInputStream无效流 header : 00000000