2014-12-05 15 views
5

Tôi có tệp trong Amazon S3 trong nhóm ABCD. Tôi có 3 đối tượng ("folderA/folderB/folderC/abcd.csv") là các thư mục và trong thư mục cuối cùng tôi có một tệp .csv(abcd.csv). Tôi đã sử dụng một logic để chuyển đổi nó thành JSON và tải nó trở lại vào một tệp khác là tệp .txt trong cùng một thư mục ("folderA/folderB/folderC/abcd.txt"). Tôi đã phải tải tập tin tại địa phương để làm điều đó. Làm thế nào tôi sẽ đọc tập tin trực tiếp và viết nó trở lại tập tin văn bản. Mã mà tôi đã sử dụng để ghi vào một tập tin trong S3 là dưới đây và tôi cần phải đọc một tập tin từ S3.Làm cách nào để đọc nội dung của tệp trong 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

Bạn có vẻ hơi bối rối về S3 các đối tượng: bạn có thể có một đối tượng với một khóa như '" folderA/folderB/folderC/abcd.csv "' nhưng đó chỉ là * một * đối tượng. Đối tượng S3 luôn là tệp, không phải thư mục. (Mặc dù ví dụ trong giao diện người dùng web S3 'folderA' vv sẽ hiển thị dưới dạng các thư mục nếu bạn đã tạo các đối tượng bằng các phím như vậy.) – Jonik

+0

Đây là bản sao của [Cách viết đối tượng S3 vào một tệp?] (Http: //stackoverflow.com/questions/7679924/how-to-write-an-s3-object-to-a-file) – Jonik

Trả lời

7

Trước tiên, bạn sẽ nhận được các đối tượng InputStream làm nhu cầu của bạn.

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

Vượt qua InputStream, File Namepath với phương pháp dưới đây để tải về luồng của mình.

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(); 
     } 
    } 
} 

Sau khi bạn Tải về đối tượng của bạn đọc các tập tin và làm cho nó để JSON và ghi nó vào .txt tập tin sau đó bạn có thể tải lên các tập tin txt đến xô mong muốn trong S3

+2

Tôi thực sự sử dụng tính năng này để đọc nhưng không thể thay đổi điều này thành JSON trực tiếp và tải tệp này vào tệp .txt trong s3. Cảm ơn câu trả lời. Điều này giúp – ZZzzZZzz

+0

Có. Nó đã giúp một chút. Cảm ơn – ZZzzZZzz

+2

Mã IO trong 'saveFile()' là cách phức tạp hơn cần thiết. Như được hiển thị trong [câu trả lời này] (http://stackoverflow.com/a/34445210/56285), về cơ bản 'Files.copy (objectData, tệp mới ("/my/path/file.jpg "). ToPath()) ; 'suffices. – Jonik

Các vấn đề liên quan