Как отправить имя файла, а потом и сам файл в ByteBuffer Java NIO?

В Java NIO (New I/O) библиотеке для работы с буферами (ByteBuffer) есть несколько способов отправить имя файла и сам файл в буфер. Вот один из вариантов:

1. Импортируйте необходимые классы:

import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

2. Создайте метод, который будет отправлять имя файла и его содержимое в буфер:

public static ByteBuffer sendFile(String fileName) throws Exception {
    // Открываем файловый канал для чтения
    FileInputStream fis = new FileInputStream(fileName);
    FileChannel fileChannel = fis.getChannel();

    // Получаем размер файла
    long fileSize = fileChannel.size();

    // Создаем буфер для хранения имени файла и его размера, а также содержимого файла
    ByteBuffer buffer = ByteBuffer.allocate((int) (8 + fileSize));
    
    // Записываем размер файла в буфер
    buffer.putLong(fileSize);

    // Записываем имя файла в буфер
    buffer.put(fileName.getBytes());

    // Записываем содержимое файла в буфер
    fileChannel.read(buffer);

    // Подготавливаем буфер для чтения
    buffer.flip();

    // Закрываем канал и поток
    fileChannel.close();
    fis.close();

    // Возвращаем буфер с данными
    return buffer;
}

3. Пример использования:

try {
    String fileName = "example.txt";
    
    // Отправляем имя файла и его содержимое в буфер
    ByteBuffer buffer = sendFile(fileName);

    // Ваш код для отправки буфера куда-либо

    // Пример чтения имени файла и его размера из буфера
    long fileSize = buffer.getLong();
    byte[] fileNameBytes = new byte[buffer.remaining()];
    buffer.get(fileNameBytes);
    String receivedFileName = new String(fileNameBytes);

    // Пример чтения содержимого файла из буфера
    byte[] fileContent = new byte[buffer.remaining()];
    buffer.get(fileContent);

    // Пример сохранения файла
    FileOutputStream fos = new FileOutputStream(receivedFileName);
    fos.write(fileContent);
    fos.close();
} catch (Exception e) {
    e.printStackTrace();
}

Когда буфер готов с содержимым, его можно отправить по сети, сохранить на диск или использовать в вашем приложении по вашему усмотрению.