从S3存储桶访问时发生java.io.FileNotFoundException?

从S3存储桶访问时发生java.io.FileNotFoundException?,java,amazon-web-services,aws-lambda,s3-bucket,Java,Amazon Web Services,Aws Lambda,S3 Bucket,我正在AWS做一个小POC。我试图从S3存储桶读取csv文件,并显示在CloudWatch日志文件中。一切正常,但在访问文件时获取java.io.FileNotFoundException 编码 public class LambdaFunctionHandler implements RequestHandler<S3Event, Report> { Region AWS_REGION = Region.getRegion(Regions.US_EAST_1); public

我正在AWS做一个小POC。我试图从S3存储桶读取csv文件,并显示在CloudWatch日志文件中。一切正常,但在访问文件时获取java.io.FileNotFoundException

编码

public class LambdaFunctionHandler implements RequestHandler<S3Event, Report> {

Region AWS_REGION = Region.getRegion(Regions.US_EAST_1);

public Report handleRequest(S3Event s3event, Context context) {
    long startTime = System.currentTimeMillis();
    Report statusReport = new Report();
    LambdaLogger logger = context.getLogger();

    logger.log("Lambda Function Started");
    logger.log("I am inside lambda function");
    Helper helper = new Helper();

    try {
        logger.log("I am inside lambda function2");
        S3EventNotificationRecord record = s3event.getRecords().get(0);
        logger.log("I am inside lambda function3");
        String srcBucket = record.getS3().getBucket().getName();
        logger.log("I am inside lambda function4");
        // Object key may have spaces or unicode non-ASCII characters.
        String srcKey = record.getS3().getObject().getKey().replace('+', ' ');
        logger.log("I am inside lambda function5");
        srcKey = URLDecoder.decode(srcKey, "UTF-8");
        logger.log("I am inside lambda function6");

        AmazonS3 s3Client = new AmazonS3Client();
        logger.log("I am inside lambda function7");
        S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
        logger.log("I am inside lambda function8");
        statusReport.setFileSize(s3Object.getObjectMetadata().getContentLength());
        logger.log("I am inside lambda function9");

        logger.log("S3 Event Received: " + srcBucket + "/" + srcKey);
        logger.log("I am inside lambda function10");

        File file = new File(srcBucket+"/"+srcKey);
        try {
            Scanner readData =new Scanner(file);
            while(readData.hasNext()) {
                String data = readData.next();
                logger.log("I am inside lambda function data ;;got it");
                //System.out.println("data"+data);
            }
            readData.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }
public类LambdaFunctionHandler实现RequestHandler{
Region AWS_Region=Region.getRegion(Regions.US_EAST_1);
公共报告handleRequest(S3Event S3Event,上下文){
long startTime=System.currentTimeMillis();
报告状态报告=新报告();
LambdaLogger logger=context.getLogger();
logger.log(“Lambda函数已启动”);
log(“我在lambda函数中”);
Helper=newhelper();
试一试{
logger.log(“我在lambda函数2中”);
S3EventNotificationRecord记录=s3event.getRecords().get(0);
logger.log(“我在lambda函数3中”);
字符串srcBucket=record.getS3().getBucket().getName();
logger.log(“我在lambda函数4中”);
//对象键可以有空格或unicode非ASCII字符。
字符串srcKey=record.getS3();
logger.log(“我在lambda函数5中”);
srcKey=urldecker.decode(srcKey,“UTF-8”);
logger.log(“我在lambda函数6中”);
AmazonS3 s3Client=新的AmazonS3客户端();
logger.log(“我在lambda函数7中”);
S3Object S3Object=s3Client.getObject(新的GetObjectRequest(srcBucket,srcKey));
logger.log(“我在lambda函数8中”);
statusReport.setFileSize(s3Object.getObjectMetadata().getContentLength());
logger.log(“我在lambda函数9中”);
logger.log(“接收到S3事件:“+srcBucket+”/“+srcKey”);
logger.log(“我在lambda函数10中”);
File File=新文件(srcBucket+“/”+srcKey);
试一试{
扫描仪读取数据=新扫描仪(文件);
while(readData.hasNext()){
String data=readData.next();
logger.log(“我在lambda函数数据中;明白了”);
//系统输出打印项次(“数据”+数据);
}
readData.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}
CloudWatch日志文件输出

CloudWatch日志错误

我在lambda函数中

我在lambda function2里面

我在lambda function3里面

我在lambda function4里面

我在lambda function5里面

我在lambda function6里面

我在lambda function7里面

我在lambda function8里面

我在lambda function9里面

接收到S3事件:readfilefromcsvfile/def_nhtsa_crash_test.csv

我在lambda function10里面

java.io.FileNotFoundException:

readfilefromcsvfile/def_nhtsa_crash_test.csv(无此类文件或目录) java.io.FileNotFoundException:readfilefromcsvfile/def_nhtsa_crash_test.csv(无此类文件或目录) 位于java.io.FileInputStream.open0(本机方法)


如果我们查看日志输出,就会发现没有这样的文件,但我将其保存在S3 bucket中。有人能告诉我如何使用java访问S3文件吗?或者在访问S3 bucket文件时应该给出什么路径名吗?

这里不需要创建文件实例。您只需处理S3 InputStream即可

S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
....
Scanner scanner = new Scanner(s3Object.getObjectContent());
while (scanner.hasNext()) {
    System.out.println(scanner.next());
}

这里不需要创建文件实例,只需处理S3 InputStream即可

S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
....
Scanner scanner = new Scanner(s3Object.getObjectContent());
while (scanner.hasNext()) {
    System.out.println(scanner.next());
}

调用S3ObjectContent的
getObjectContent
可以将错误作为文本添加到问题中吗?这使得没有4k屏幕的人可以更容易地阅读图像,而无需在包含图像的选项卡和包含代码的选项卡之间切换Java不理解
s3://
URI。因此,您不能使用
File
class读取S3中的文件。感谢@Ferrbig和Trinopoty,User7的快速响应,我保留了问题中的日志文件。我可以从S3ObjectContent的getObjectContent@user7Call
getObjectContent
获取路径吗?您可以将错误作为文本添加到问题中吗?这使没有问题的人更容易阅读k屏幕放大图像,无需在包含图像的选项卡和包含代码的选项卡之间切换Java不理解
s3://
URI。因此,您不能使用
File
class从s3读取文件。感谢@Ferrbig和Trinopoty,User7的快速响应,我在任务中保留了日志文件ion.我可以从getObjectContent@user7Wow@user7awesomw bro获得路径吗?问题已解决非常感谢。问题已解决非常感谢。