Witam, mam proste przesyłanie plików (poprzez socket'y), gdzie serwer odbiera plik od klienta.
Klient wysyła do serwera wielkość oraz nazwę pliku, a następnie sam plik.
Wielkość pliku wyznaczam za pomocą myFile.length(); gdzie myFile to wczytany plik.
I po pierwsze, jeśli na serwerze wielkość będzie taka sama jak ta, którą wyznaczyłem u klienta to skopiowany plik ma 0bajtów. Jeśli dodam do wyznaczonej wielkości pliku chociażby wartość 100 to już kopiuje się dobrze.
Poza tym, gdy chcę przesłać jakiś większy plik - kilkadziesiąt mb to mam: ava.lang.OutOfMemoryError: Java heap space

fragment klienta:

Socket s = new Socket("localhost", 6666);

//jfc to obiekt JFileChooser
String sciezka = jfc.getSelectedFile().getPath();

File myFile = new File (sciezka);
byte [] mybytearray  = new byte [(int)myFile.length()];

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(s.getOutputStream());

String dlugoscPliku = Long.toString(myFile.length());
        
ps.println(dlugoscPliku);
Thread.sleep(500);

ps.println(jfc.getSelectedFile().getName());
Thread.sleep(500);

bis.read(mybytearray,0,mybytearray.length);
os.write(mybytearray,0,mybytearray.length);

JOptionPane.showMessageDialog(null, "Wyslano plik na serwer");

os.flush();
s.close();

fragment serwera:

Socket s = null;
int bytesRead;
int current = 0;
ServerSocket ss = new ServerSocket(6666);
        
while (true) {
    s = ss.accept();

    if (s != null) {
        System.out.println("Serwer uruchomiony.");
        InputStream is = s.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

        String dlugoscPliku = br.readLine();
        int dlugoscPliku2 = Integer.parseInt(dlugoscPliku);

        byte [] mybytearray  = new byte [dlugoscPliku2+100];
                
        String nazwaPliku = br.readLine();
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("kopia-"+nazwaPliku));

        bytesRead = is.read(mybytearray,0,mybytearray.length);
        current = bytesRead;

        do {
            bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
            if(bytesRead >= 0) current += bytesRead;
        } while(bytesRead > -1);

        bos.write(mybytearray, 0 , current);
        
        bos.flush();      
        bos.close();
        s.close();
    }
}