2015-11-30 9 views
1

У меня есть простой сервер 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); 
        } 
       } 
      } 
     } 

ответ

0

Есть ли у вас проблемы с памятью? В Java объекты и массивы, которые не используются, - это сбор мусора. См. Deleting An Entire Array. Я не думаю, что вы столкнетесь с любыми проблемами, перераспределяя каждый раз.

Edit:

Поскольку Перераспределение является проблемой, может быть, 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.

+0

@ JFPicard Если я хочу отправить большой файл, например, 1 ГБ, невозможно перераспределять его каждый раз, и JVM выдает ошибку, если я хочу выделить такую ​​большую память. – enigma

+0

@ JFPicard Вы немного придумаете? Должен ли я использовать Bytebuffer для загрузки данных из файла или загрузки данных в байтовый массив, чем с помощью Bytebuffer и отправки этого объекта Bytebuffer через сеть. – enigma