2014-12-05 10 views
5

У меня есть файл в Amazon S3 в ковше ABCD. У меня есть 3 объекта ("folderA/folderB/folderC/abcd.csv"), которые являются папками, а в последней папке у меня есть файл .csv(abcd.csv). Я использовал логику, чтобы преобразовать ее в JSON и загрузить ее обратно в другой файл, который является файлом .txt в той же папке ("folderA/folderB/folderC/abcd.txt"). Мне пришлось загрузить файл локально, чтобы сделать это. Как я могу прочитать файл напрямую и записать его обратно в текстовый файл. Код, который я использовал для записи в файл на S3, ниже, и мне нужно прочитать файл с S3.Как прочитать содержимое файла в Amazon S3

InputStream inputStream = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_16)); 
ObjectMetadata metadata = new ObjectMetadata(); 
metadata.setContentLength(json.length()); 
PutObjectRequest request = new PutObjectRequest(bucketPut, filePut, inputStream, metadata); 
s3.putObject(request); 
+0

Вы, кажется, немного запутались о S3 объекты: вы можете иметь объект с таким ключом, как '' folderA/folderB/folderC/abcd.csv ", но это просто * один * объект. Объекты S3 всегда являются файлами, а не папками. (Даже если, например, в S3 веб-интерфейс «folderA» и т. Д. Отображаются в виде папок, если вы создали объекты с такими ключами.) – Jonik

+0

Это дубликат [Как написать объект S3 в файл?] (Http: //stackoverflow.com/questions/7679924/how-to-write-an-s3-object-to-a-file) – Jonik

ответ

7

Прежде всего, вы должны получить объект InputStream, чтобы удовлетворить ваши потребности.

S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, key)); 
InputStream objectData = object.getObjectContent(); 

Передайте InputStream, File Name и path к описанному ниже методу для загрузки потока.

public void saveFile(String fileName, String path, InputStream objectData) throws Exception { 
    DataOutputStream dos = null; 
    OutputStream out = null; 
    try { 
     File newDirectory = new File(path); 
     if (!newDirectory.exists()) { 
      newDirectory.mkdirs(); 
     } 

     File uploadedFile = new File(path, uploadFileName); 
     out = new FileOutputStream(uploadedFile); 
     byte[] fileAsBytes = new byte[inputStream.available()]; 
     inputStream.read(fileAsBytes); 

     dos = new DataOutputStream(out); 
     dos.write(fileAsBytes); 
    } catch (IOException io) { 
     io.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (out != null) { 
       out.close(); 
      } 
      if (dos != null) { 
       dos.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

После загрузки вашего объекта прочитать файл и сделать его JSON и записать его в .txt файл после этого вы можете загрузить txt файл в требуемом ведро в S3

+2

Я действительно использовал это для чтения, но не мог напрямую изменить это на JSON и загрузить его в .txt-файл в s3. Спасибо за ответ. Это помогает – ZZzzZZzz

+0

Да. Это немного помогло. Спасибо – ZZzzZZzz

+2

Код IO в 'saveFile()' намного сложнее, чем необходимо. Как показано в [этом ответе] (http://stackoverflow.com/a/34445210/56285), в основном 'Files.copy (objectData, новый файл ("/my/path/file.jpg "). ToPath()) , 'достаточно. – Jonik

Смежные вопросы