Scala. Преобразовать массив [байт] в java .io.File - PullRequest
0 голосов
/ 06 мая 2020

У меня есть Array[Byte], который изначально был в формате pdf. Мне нужно преобразовать его в java.io.File. Обновление: У меня есть почтовый сервис, который может отправлять письма с вложениями (файлами). Файлы должны быть в формате java.io.File. Но файлы в запросе к моей службе идут как Array[Byte] с кодировкой base64. Я не могу позволить себе создавать файлы каждый раз, потому что это забивает мою память.

1 Ответ

2 голосов
/ 06 мая 2020

java.io.File - это не хранилище содержимого файла, а только адрес файла в хранилище - если API не позволяет передавать содержимое другим способом, вы должны использовать временные файлы, и никакой другой вариант.

В лучшем случае вы можете убедиться, что они удалены после использования:

  • создайте их в /tmp с помощью File.createTempFile
  • отметьте их как deleteOnExit если текущая процедура не работает и / или
  • вызов delete на file в finally блоке

Если вы используете Cats Effect, имеет смысл сделать что-то вроде:

val withTempFile = Resource.make[F, File] {
  F.delay(File.createTempFile)
} { file =>
  F.delay(file.delete)
}

withTempFile.use { file =>
  // operation in F
}

Если вы используете обычный Scala, схема ссуды может работать:

def withTempFile(thunk: File => A): A = {
  val tmpFile = File.createTempFile
  try {
    thunk(tmpFile)
  } finally {
    tmpFile.delete
  }
}

withTempFile { file =>
  // operation
}

Если у вас есть временный файл, который (почти) наверняка будет удален, вы можете написать к нему и передайте ссылку на файл вашей службе.

Если вы не хотите использовать файл tmp на диске, вы можете рассмотреть что-то вроде RAM-диска, если у вас есть возможность. Суть в том, что если API не позволяет вам использовать Array[Byte] и принимает только File, вы должны записать этот файл на диск. Или найдите другого поставщика услуг / API.

...