วิธีตรวจสอบว่ามีคีย์ที่ระบุอยู่ในบัคเก็ต S3 ที่กำหนดโดยใช้ Java หรือไม่


88

ฉันต้องการตรวจสอบว่ามีคีย์อยู่ในที่เก็บข้อมูลโดยใช้ Java หรือไม่ ฉันดู API แต่ไม่มีวิธีการใดที่เป็นประโยชน์ ฉันพยายามใช้getObjectแต่มันมีข้อยกเว้น


2
ในอนาคตโปรดให้ข้อมูลเพิ่มเติมเช่นข้อยกเว้นที่คุณได้รับ .. ฉันได้ให้คำตอบตามสมมติฐาน ..
sethu

4
FYI: สำหรับคำถามนี้คำตอบที่ยอมรับไม่ใช่คำตอบที่ดีที่สุด
malana

คำตอบ:


3

ใช้ไลบรารี jets3t มันง่ายกว่าและแข็งแกร่งกว่า AWS sdk มาก การใช้ไลบรารีนี้คุณสามารถเรียก s3service.getObjectDetails () การดำเนินการนี้จะตรวจสอบและดึงเฉพาะรายละเอียดของวัตถุ (ไม่ใช่เนื้อหา) ของวัตถุ มันจะโยน 404 ถ้าวัตถุหายไป คุณจึงสามารถจับข้อยกเว้นนั้นและจัดการกับมันได้ในแอปของคุณ

แต่เพื่อให้สามารถใช้งานได้คุณจะต้องมีการเข้าถึง ListBucket สำหรับผู้ใช้ในที่เก็บข้อมูลนั้น เพียงแค่เข้าถึง GetObject จะไม่ทำงาน เหตุผลคือ Amazon จะป้องกันไม่ให้คุณตรวจสอบการมีอยู่ของคีย์หากคุณไม่มีการเข้าถึง ListBucket เพียงแค่รู้ว่ามีคีย์อยู่หรือไม่ก็เพียงพอสำหรับผู้ใช้ที่ประสงค์ร้ายในบางกรณี ดังนั้นหากพวกเขาไม่สามารถเข้าถึง ListBucket ได้พวกเขาจะไม่สามารถทำได้


4
ทั้งหมด - ดูคำตอบที่อัปเดตสำหรับคำถามนี้ด้านล่าง: stackoverflow.com/a/36653034/49678
alexandroid

3
jets3t เป็นไลบรารีเก่าที่เลิกใช้แล้ว ใช้ aws-java-sdk แทน
the_storyteller

"ง่ายขึ้นและแข็งแกร่งขึ้น" เป็นเรื่องส่วนตัวมาก
Leo Romanovsky

296

ตอนนี้มีวิธีdoObjectExistใน Java API อย่างเป็นทางการ

สนุก!


13
มันถูกเพิ่มใน 1.10.51
steamer25

5
เราต้องโหวตให้คะแนนและนำสิ่งนี้ไปสู่จุดสูงสุด!
SureshS

2
สิ่งที่ควรทำคือทำให้คำตอบนี้เป็นที่ยอมรับ แต่มีเพียง OP เท่านั้นที่ทำได้ meta.stackexchange.com/questions/120568/…
malana

4
สิ่งนี้ต้องทำการโทรผ่านเครือข่ายซึ่งมีราคาแพงหากคุณมีวัตถุจำนวนมาก ... เสียดายที่ไม่สามารถคืนค่าว่างในคำขอข้อมูลเมตา
Joel

9
ดูเหมือนว่า Amazon ลบออกdoesObjectExistจาก 2.x SDK (ปัจจุบันคือ v2.3.9)
Bampfer

59

อัปเดต:

ดูเหมือนว่าจะมี API ใหม่ให้ตรวจสอบแค่นั้น ดูคำตอบอื่นในหน้านี้: https://stackoverflow.com/a/36653034/435605

โพสต์ต้นฉบับ:

ใช้ errorCode.equals("NoSuchKey")

try {
    AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
    String bucketName = getBucketName();
    s3.createBucket(bucketName);
    S3Object object = s3.getObject(bucketName, getKey());
} catch (AmazonServiceException e) {
    String errorCode = e.getErrorCode();
    if (!errorCode.equals("NoSuchKey")) {
        throw e;
    }
    Logger.getLogger(getClass()).debug("No such key!!!", e);
}

หมายเหตุเกี่ยวกับข้อยกเว้น: ฉันรู้ว่าไม่ควรใช้ข้อยกเว้นสำหรับการควบคุมการไหล ปัญหาคือ Amazon ไม่ได้ให้ api ใด ๆ เพื่อตรวจสอบขั้นตอนนี้ - เป็นเพียงเอกสารเกี่ยวกับข้อยกเว้น


14
อย่าใช้การจัดการข้อยกเว้นสำหรับการควบคุมโปรแกรม
Simon Peck

34
@SimonPeck: คุณพูดถูก ปัญหาคือ Amazon ไม่ได้ให้ api ใด ๆ เพื่อตรวจสอบขั้นตอนนี้ - เป็นเพียงเอกสารเกี่ยวกับข้อยกเว้น โปรดลบการลงคะแนนของคุณหากไม่โหวต
AlikElzin-kilaka

1
สิ่งนี้ดูเหมือนจะไม่เป็นจริงอีกต่อไปสำหรับ Java SDK ฉันเห็นว่าของฉันerrorMessageถูกตั้งค่าเป็น "ไม่พบ" แต่errorCodeเป็นโมฆะ
bstempi

3
ฉันจะไปหารหัสสถานะ 404 ดูเหมือนจะแข็งแกร่งกว่าดูสตริง
Oskar Kjellin

2
ความคิดเห็นโดย @rboarman ไม่ถูกต้อง - NoSuchKeyมันเป็น สำหรับรายการรหัสข้อผิดพลาด S3 ที่ชัดเจนโปรดดูเอกสาร: docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
Allen George

23

การใช้ AWS SDK ใช้เมธอด getObjectMetadata เมธอดจะโยน AmazonServiceException หากไม่มีคีย์

private AmazonS3 s3;
...
public boolean exists(String path, String name) {
    try {
        s3.getObjectMetadata(bucket, getS3Path(path) + name); 
    } catch(AmazonServiceException e) {
        return false;
    }
    return true;
}

2
getObject พ่น AmazonServiceException ด้วยเหตุใดจึงเรียกสองสาย นอกจากนี้ฉันจะรู้ได้อย่างไรว่าไม่มีวัตถุจากการตัดตอนนี้ บางทีอาจเป็นเพราะข้อผิดพลาด S3 อื่นและพบวัตถุจริง
AlikElzin-kilaka

5
อย่าใช้การจัดการข้อยกเว้นสำหรับการควบคุมโปรแกรม
Simon Peck

4
@ AlikElzin-kilaka เนื่องจาก getObject () หมายความว่าคุณต้องดาวน์โหลดเนื้อหาของวัตถุซึ่งอาจมีขนาดใหญ่มาก
Jason Nichols

18
@SimonPeck ไม่เหมาะ แต่เมื่อ Amazon เสนอวิธีการที่เหมาะสมมีอยู่ () แสดงว่าจุดของคุณถูกต้อง
Jason Nichols

4
@SimonPeck คุณมีทางเลือกในกรณีนี้หรือไม่? นี่ไม่ใช่การใช้ข้อยกเว้นในทางที่ผิดอย่างโจ่งแจ้งเนื่องจากขั้นตอนการควบคุมโปรแกรม ... ง่ายแม่นยำในสิ่งที่ทำและปลอดภัย หากคุณนำความคิดของคุณไปสู่จุดสูงสุด (เห็นได้ชัดว่าคุณเป็นถ้าคุณคิดว่าข้อมูลโค้ดนี้ใช้ข้อยกเว้นในทางที่ผิด) เหตุใดจึงมีข้อยกเว้นในทุกภาษา แทนที่จะโยนข้อยกเว้นเพื่อแจ้งเตือนโปรแกรมและเปลี่ยนโฟลว์ของโปรแกรมรันไทม์ควรยุติฉันคิดว่า
Don Cheadle

17

ใน Amazon Java SDK 1.10+ คุณสามารถใช้getStatusCode()เพื่อรับรหัสสถานะของการตอบสนอง HTTP ซึ่งจะเป็น 404 หากไม่มีวัตถุ

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import org.apache.http.HttpStatus;

try {
    AmazonS3 s3 = new AmazonS3Client();
    ObjectMetadata object = s3.getObjectMetadata("my-bucket", "my-client");
} catch (AmazonS3Exception e) {
    if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
        // bucket/key does not exist 
    } else {
        throw e;
    }
}

getObjectMetadata()getObject()ทรัพยากรสิ้นเปลืองน้อยลงและการตอบสนองไม่จำเป็นต้องปิดให้บริการเช่น


ในเวอร์ชันก่อนหน้าคุณสามารถใช้getErrorCode()และตรวจสอบสตริงที่เหมาะสมได้ (ขึ้นอยู่กับเวอร์ชัน)


หากออบเจ็กต์ s3 ของคุณไม่มีข้อมูลเมตาใด ๆ ที่แนบมา getObjectMetadata จะแสดงข้อผิดพลาด 404 แม้ว่าจะมีวัตถุ s3 อยู่ก็ตาม ฉันจะไม่แนะนำสิ่งนี้หากมีวัตถุประสงค์เพื่อตรวจสอบการมีอยู่ของวัตถุ s3
Ashish Goel

@AshishGoel จะมีข้อมูลเมตาเสมอหากมีวัตถุอยู่ ในความเป็นจริงคำขอ HTTP พื้นฐานเป็นเพียง HEAD ไปยัง URL ของวัตถุ
Paul Draper

5

ใช้ ListObjectsRequest การตั้งค่า Prefix เป็นคีย์ของคุณ

รหัส. NET:

 public bool Exists(string key)
    {

        using (Amazon.S3.AmazonS3Client client = (Amazon.S3.AmazonS3Client)Amazon.AWSClientFactory.CreateAmazonS3Client(m_accessKey, m_accessSecret))
        {
            ListObjectsRequest request = new ListObjectsRequest();
            request.BucketName = m_bucketName;
            request.Prefix = key;
            using (ListObjectsResponse response = client.ListObjects(request))
            {

                foreach (S3Object o in response.S3Objects)
                {
                    if( o.Key == key )
                        return true;
                }
                return false;
            }
        }
    }.

7
คำเตือน! Amazon คิดค่าบริการเพิ่มเติมสำหรับการโทรแต่ละรายการ! วิธีนี้ใช้ได้ แต่อย่าใช้ตรวจสอบว่ามีไฟล์อยู่หรือไม่ก่อนดาวน์โหลด
user34402

นี่ไม่ใช่วิธีที่ดีหากมีไฟล์อยู่เนื่องจากได้รับวัตถุทั้งหมดที่ตรงกับคำนำหน้า หากคุณมีไฟล์หลายไฟล์ที่ขึ้นต้นด้วยคีย์ไฟล์นั้นจะดาวน์โหลดอ็อบเจ็กต์ทั้งหมดรวมทั้งไฟล์ที่คุณระบุ
Crypth

เกี่ยวกับค่าใช้จ่ายของ LIST เทียบกับ GET: โปรดทราบว่าคุณจะถูกเรียกเก็บเงินสำหรับข้อมูลใด ๆ ที่ถ่ายโอนออกไป ดังนั้นหากเป็นไปได้ยากมากที่ไฟล์จะมีอยู่ (ตัวอย่างเช่นคุณสร้าง UUID แบบสุ่มเป็นคีย์และต้องการให้แน่ใจว่าไม่มีการใช้งานอยู่แล้ว) GET จะถูกกว่ามาก แต่ถ้าไฟล์มีขนาด 0.5 MB และมีโอกาส 11% ที่จะมีอยู่แล้ว LIST จะดูถูกกว่าเล็กน้อย เช่นเดียวกันหากไฟล์มีขนาด 0.1 MB และมีโอกาส 52% ที่จะมีอยู่ ... ยิ่งไฟล์มีขนาดใหญ่ LIST ก็ยิ่งถูกลงเร็ว แต่อีกครั้งสถานการณ์ทั่วไปกำลังทดสอบคีย์ UUID ที่สร้างขึ้นใหม่และ GET มีราคาถูกกว่า
Bampfer

5

สำหรับ PHP (ฉันรู้ว่าคำถามคือ Java แต่ Google พาฉันมาที่นี่) คุณสามารถใช้ stream wrappers และ file_exists

$bucket = "MyBucket";
$key = "MyKey";
$s3 = Aws\S3\S3Client->factory([...]);
$s3->registerStreamWrapper();
$keyExists = file_exists("s3://$bucket/$key");

4

รหัส java นี้ตรวจสอบว่ามีคีย์ (ไฟล์) อยู่ในที่เก็บข้อมูล s3 หรือไม่

public static boolean isExistS3(String accessKey, String secretKey, String bucketName, String file) {

    // Amazon-s3 credentials
    AWSCredentials myCredentials = new BasicAWSCredentials(accessKey, secretKey); 
    AmazonS3Client s3Client = new AmazonS3Client(myCredentials); 

    ObjectListing objects = s3Client.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(file));

    for (S3ObjectSummary objectSummary: objects.getObjectSummaries()) {
        if (objectSummary.getKey().equals(file)) {
            return true;
        }
    }
    return false;
}

2
สิ่งนี้ควรใช้งานได้ แต่ก็ควรจะช้าในกรณีที่มีหลายพันหรือไฟล์และสำหรับแต่ละไฟล์จะต้องใช้
Danijel

ดังที่ @Danijel กล่าวว่าสิ่งนี้จะเป็นตัวกำหนดว่ามีวัตถุของคีย์ที่กำหนดหรือไม่ แต่การจะทำเช่นนั้นต้องวนซ้ำวัตถุที่อาจเป็นหมื่นใน S3 ก่อนที่จะพิจารณาว่ามีอยู่จริงหรือไม่
Don Cheadle

1
ฉันไม่เห็นด้วยกับ @Danijel และ mmcrae เกี่ยวกับเรื่องนี้ที่ช้า คำขอ listObjects ระบุ. withPrefix (ไฟล์) ดังนั้นจึงควรส่งคืนไฟล์ที่ตรงกันมากที่สุดเว้นแต่จะมีไฟล์อื่นที่ชื่อขึ้นต้นด้วยชื่อของไฟล์เป้าหมาย
davidwebster48

3

ทำลายเส้นทางของคุณให้เป็นถังและวัตถุ การทดสอบที่เก็บข้อมูลโดยใช้วิธีdoesBucketExistการทดสอบวัตถุโดยใช้ขนาดของรายการ (0 ในกรณีที่ไม่มีอยู่) ดังนั้นรหัสนี้จะทำ:

String bucket = ...;
String objectInBucket = ...;
AmazonS3 s3 = new AmazonS3Client(...);
return s3.doesBucketExist(bucket) 
       && !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty();

ง่ายและสะดวก ขอบคุณ
Thermech

3

การใช้ Object isting ฟังก์ชัน Java เพื่อตรวจสอบว่ามีคีย์ที่ระบุอยู่ใน AWS S3 หรือไม่

boolean isExist(String key)
    {
        ObjectListing objects = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(key));

        for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
        {
            if (objectSummary.getKey().equals(key))
            {
                return true;
            }

        }
        return false;
    }

2

วิธีการที่เหมาะสมที่จะทำใน SDK V2 โดยไม่ต้องเกินพิกัดของจริงได้รับวัตถุคือการใช้S3Client.headObject ได้รับการสนับสนุนอย่างเป็นทางการโดยAWS บันทึกการเปลี่ยนแปลง

รหัสตัวอย่าง:

public boolean exists(String bucket, String key) {
    try {
        HeadObjectResponse headResponse = client
                .headObject(HeadObjectRequest.builder().bucket(bucket).key(key).build());
        return true;
    } catch (NoSuchKeyException e) {
        return false;
    }
}

1

มีวิธีง่ายๆในการทำโดยใช้เมธอด isObjectInBucket () ของ jetS3t API

โค้ดตัวอย่าง:

ProviderCredentials awsCredentials = new AWSCredentials(
                awsaccessKey,
                awsSecretAcessKey);

        // REST implementation of S3Service
        RestS3Service restService = new RestS3Service(awsCredentials);

        // check whether file exists in bucket
        if (restService.isObjectInBucket(bucket, objectKey)) {

            //your logic

        }

มันทำการเรียก get-metadata เหมือนกันภายใต้ประทุน + การจับข้อยกเว้น: grepcode.com/file/repo1.maven.org/maven2/net.java.dev.jets3t/…
alexandroid

1

คำตอบอื่น ๆ สำหรับ AWS SDK v1 นี่คือวิธีการสำหรับ AWS SDK v2 (ปัจจุบันคือ 2.3.9)

โปรดทราบว่าgetObjectMetadataและdoesObjectExistวิธีการไม่ได้อยู่ใน v2 SDK ในขณะนี้! ดังนั้นสิ่งเหล่านี้จึงไม่ใช่ตัวเลือกอีกต่อไป เราถูกบังคับให้ใช้อย่างใดอย่างหนึ่งgetObjectหรือlistObjects.

listObjectsโทรขณะนี้ 12.5 getObjectครั้งมีราคาแพงมากขึ้นเพื่อให้กว่า แต่ AWS ยังมีค่าใช้จ่ายสำหรับการดาวน์โหลดข้อมูลใด ๆ ที่เพิ่มราคาของถ้าไฟล์ที่มีอยู่getObject ตราบใดที่ไฟล์นั้นไม่น่าจะมีอยู่มากนัก (ตัวอย่างเช่นคุณได้สร้างคีย์ UUID ใหม่แบบสุ่มและเพียงแค่ตรวจสอบอีกครั้งว่าไม่มีการใช้งาน) ดังนั้นการโทรgetObjectจะถูกกว่ามากจากการคำนวณของฉัน

เพื่อให้ปลอดภัยฉันได้เพิ่มrange()ข้อกำหนดเพื่อขอให้ AWS ส่งไฟล์เพียงไม่กี่ไบต์เท่านั้น เท่าที่ฉันทราบ SDK จะเคารพสิ่งนี้เสมอและไม่คิดค่าบริการสำหรับการดาวน์โหลดทั้งไฟล์ แต่ฉันยังไม่ได้ตรวจสอบว่าดังนั้นจงพึ่งพาพฤติกรรมนั้นด้วยความเสี่ยงของคุณเอง! (นอกจากนี้ฉันไม่แน่ใจว่าrangeจะทำงานอย่างไรหากวัตถุ S3 มีความยาว 0 ไบต์)

    private boolean sanityCheckNewS3Key(String bucket, String key) {

        ResponseInputStream<GetObjectResponse> resp = null;
        try {
            resp = s3client.getObject(GetObjectRequest.builder()
                .bucket(bucket)
                .key(key)
                .range("bytes=0-3")
                .build());
        }
        catch (NoSuchKeyException e) {
            return false;
        }
        catch (AwsServiceException se) {
            throw se;
        }
        finally {
            if (resp != null) {
                try {
                    resp.close();
                } catch (IOException e) {
                    log.warn("Exception while attempting to close S3 input stream", e);
                }
            }
        }
        return true;
    }
}

หมายเหตุ: รหัสนี้ถือว่าs3Clientและlogถูกประกาศและเริ่มต้นที่อื่น เมธอดส่งคืนบูลีน แต่สามารถโยนข้อยกเว้น


ดูเหมือนว่าตอนนี้มีs3Client.headObject()ใน V2 ให้ทำสิ่งนี้: stackoverflow.com/a/56949742/9814131และคุณจะตรวจสอบS3Exceptionรหัสสถานะของ 404 เพื่อตรวจสอบว่ามีวัตถุอยู่ตามปัญหา github หรือไม่github.com/aws/aws-sdk- Java-v2 แต่ฉันเดาว่าของคุณมีความก้าวหน้ามากกว่าเนื่องจากมีค่าใช้จ่ายน้อยมากถึง 0-3 ไบต์
Shaung Cheng

1

ฉันยังประสบปัญหานี้เมื่อฉันใช้

String BaseFolder = "3patti_Logs"; 
S3Object object = s3client.getObject(bucketName, BaseFolder);
 

ฉันไม่พบคีย์ข้อผิดพลาด

เมื่อกดแล้วลองดู

String BaseFolder = "3patti_Logs"; 
S3Object object = s3client.getObject(bucketName, BaseFolder+"/");

มันใช้งานได้รหัสนี้ใช้งานได้กับ 1.9 jar มิฉะนั้นให้อัปเดตเป็น 1.11 และใช้ doObjectExist ตามที่กล่าวไว้ข้างต้น


1

ดังที่คนอื่น ๆ ได้กล่าวไว้สำหรับ AWS S3 Java SDK 2.10+ คุณสามารถใช้ออบเจ็กต์HeadObjectRequestเพื่อตรวจสอบว่ามีไฟล์ในที่เก็บข้อมูล S3 ของคุณหรือไม่ สิ่งนี้จะทำหน้าที่เหมือนคำขอ GET โดยไม่ได้รับไฟล์จริงๆ

ตัวอย่างรหัสเนื่องจากผู้อื่นยังไม่ได้เพิ่มรหัสใด ๆ ด้านบน:

public boolean existsOnS3 () throws Exception {
    try {
       S3Client s3Client = S3Client.builder ().credentialsProvider (...).build ();
       HeadObjectRequest headObjectRequest = HeadObjectRequest.builder ().bucket ("my-bucket").key ("key/to/file/house.pdf").build ();
       HeadObjectResponse headObjectResponse = s3Client.headObject (headObjectRequest);
       return headObjectResponse.sdkHttpResponse ().isSuccessful ();    
   }
   catch (NoSuchKeyException e) {
      //Log exception for debugging
      return false;
   }
}

พ่น NoSuchKeyException
Andrii Karaivanskyi

นั่นเป็นเพราะคีย์ไม่มีอยู่ นั่นคือสิ่งที่คุณกำลังมองหา ดังนั้นจัดการข้อยกเว้นนั้นและส่งคืนเท็จสำหรับมัน ฉันได้อัปเดตโค้ดด้านบนเพื่อรวม try / catch
Navigatron

จากนั้นคุณไม่จำเป็นต้องใช้headObjectResponseเลย throws Exceptionก็ไม่จำเป็นเช่นกัน
Andrii Karaivanskyi

@AndriiKaraivanskyi เป็นเพียงตัวอย่างฉันไม่ได้ทดสอบ
Navigatron

headObjectResponse.sdkHttpResponse () .isSuccessful (); จะประสบความสำเร็จเสมอไม่ว่าไฟล์จะมีอยู่หรือไม่?
ทำเครื่องหมาย

0

หรือคุณสามารถใช้ไลบรารีไคลเอนต์Minio-Javaซึ่งเป็นโอเพ่นซอร์สและเข้ากันได้กับ AWS S3 API

คุณสามารถใช้ตัวอย่างMinio-Java StatObject.java ได้เช่นเดียวกัน

นำเข้า io.minio.MinioClient;
นำเข้า io.minio.errors.MinioException;

นำเข้า java.io.InputStream;
นำเข้า java.io.IOException;
นำเข้า java.security.NoSuchAlgorithmException;
นำเข้า java.security.InvalidKeyException;

นำเข้า org.xmlpull.v1.XmlPullParserException;


คลาสสาธารณะ GetObject {
  โมฆะคงที่สาธารณะ main (String [] args)
    พ่น NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
    // หมายเหตุ: Your-ACCESSKEYID, YOUR-SECRETACCESSKEY และ my-bucketname คือ
    // ค่าดัมมี่โปรดแทนที่ด้วยค่าดั้งเดิม
    // ตั้งค่าปลายทาง s3 ภูมิภาคจะถูกคำนวณโดยอัตโนมัติ
    MinioClient s3Client = MinioClient ใหม่ ("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
    InputStream สตรีม = s3Client.getObject ("my-bucketname", "my-objectname");

    ไบต์ [] buf = ไบต์ใหม่ [16384];
    int ไบต์อ่าน;
    ในขณะที่ ((bytesRead = stream.read (buf, 0, buf.length))> = 0) {
      System.out.println (สตริงใหม่ (buf, 0, bytesRead));
    }

    stream.close ();
  }
}

ฉันหวังว่ามันจะช่วยได้

Disclaimer: ฉันทำงานให้กับMinio

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.