如何在Java编写的AWS Lambda函数中读取文件?
我已经编写了一个AWS Lambda处理程序,如下所示:如何在Java编写的AWS Lambda函数中读取文件?,java,amazon-web-services,aws-lambda,Java,Amazon Web Services,Aws Lambda,我已经编写了一个AWS Lambda处理程序,如下所示: package com.lambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import java.io.*; pu
package com.lambda;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import java.io.*;
public class TestDetailsHandler implements RequestStreamHandler {
public void handleRequest(InputStream input,OutputStream output,Context context){
// Get Lambda Logger
LambdaLogger logger = context.getLogger();
// Receive the input from Inputstream throw exception if any
File starting = new File(System.getProperty("user.dir"));
System.out.println("Source Location" + starting);
File cityFile = new File(starting + "City.db");
FileInputStream fis = null;
try {
fis = new FileInputStream(cityFile);
System.out.println("Total file size to read (in bytes) : "
+ fis.available());
int content;
while ((content = fis.read()) != -1) {
// convert to char and display it
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
它读取了一个文件:City.db,可在参考资料文件夹中找到,即使我在任何地方都可以看到以下内容:
但它在执行此lambda函数时显示以下消息:
START RequestId: 5216ea47-fc43-11e5-96d5-83c1dcdad75d Version: $LATEST
Source Location/
java.io.FileNotFoundException: /city.db (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.lambda.TestDetailsHandler.handleRequest(TestDetailsHandler.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at lambdainternal.EventHandlerLoader$StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:511)
at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:972)
at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:231)
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:93)
END RequestId: 5216ea47-fc43-11e5-96d5-83c1dcdad75d
REPORT RequestId: 5216ea47-fc43-11e5-96d5-83c1dcdad75d Duration: 58.02 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 50 MB
启动请求ID:5216ea47-fc43-11e5-96d5-83c1dcdad75d版本:$LATEST
源位置/
java.io.FileNotFoundException:/city.db(无此类文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
在com.lambda.TestDetailsHandler.handleRequest(TestDetailsHandler.java:26)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于lambdainternal.EventHandlerLoader$StreamMethodRequestHandler.HandlerRequest(EventHandlerLoader.java:511)
在lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:972)
在lambdainternal.AWSLambda.startRuntime(AWSLambda.java:231)
在lambdainternal.AWSLambda.(AWSLambda.java:59)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
位于lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:93)
结束请求ID:5216ea47-fc43-11e5-96d5-83c1dcdad75d
报告请求ID:5216ea47-fc43-11e5-96d5-83c1dcdad75d持续时间:58.02毫秒计费持续时间:100毫秒内存大小:1024 MB最大使用内存:50 MB
Pom.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lambda</groupId>
<artifactId>testdetails</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test-handler</name>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.0.0
com.lambda
测试细节
1.0-快照
罐子
测试处理器
亚马逊网站
aws lambda java内核
1.1.0
朱尼特
朱尼特
4.11
测试
org.apache.maven.plugins
maven阴影插件
2.3
假的
包裹
阴凉处
我用了各种各样的方法来保存文件,但最后都不起作用了。你能告诉我这里出了什么问题吗
然而,在我的另一个项目中,我将xyz.properties文件保存在resources文件夹中,并从PropertyManager文件中读取,它工作正常。当我在我的系统上测试它时,它工作正常,但在AWS Lambda函数上它不工作 我对我的代码做了以下更改,现在它的工作非常完美: 主要更改如下两行: ClassLoader ClassLoader=getClass().getClassLoader()强>
package com.lambda;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import java.io.*;
public class TestDetailsHandler implements RequestStreamHandler {
public void handleRequest(InputStream input,OutputStream output,Context context){
// Get Lambda Logger
LambdaLogger logger = context.getLogger();
// Receive the input from Inputstream throw exception if any
ClassLoader classLoader = getClass().getClassLoader();
File cityFile = new File(classLoader.getResource("City.db").getFile());
FileInputStream fis = null;
try {
fis = new FileInputStream(cityFile);
System.out.println("Total file size to read (in bytes) : "
+ fis.available());
int content;
while ((content = fis.read()) != -1) {
// convert to char and display it
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
File cityFile=新文件(classLoader.getResource(“City.db”).getFile())强>
package com.lambda;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import java.io.*;
public class TestDetailsHandler implements RequestStreamHandler {
public void handleRequest(InputStream input,OutputStream output,Context context){
// Get Lambda Logger
LambdaLogger logger = context.getLogger();
// Receive the input from Inputstream throw exception if any
ClassLoader classLoader = getClass().getClassLoader();
File cityFile = new File(classLoader.getResource("City.db").getFile());
FileInputStream fis = null;
try {
fis = new FileInputStream(cityFile);
System.out.println("Total file size to read (in bytes) : "
+ fis.available());
int content;
while ((content = fis.read()) != -1) {
// convert to char and display it
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
我就是这样做的,假设您的项目结构是这样的-
您需要读取project dir/resources目录中的config.properties文件 读取文件内容的代码为-
InputStream input = null;
try {
Path path = Paths.get(PropertyUtility.class.getResource("/").toURI());
// The path for config file in Lambda Instance -
String resourceLoc = path + "/resources/config.properties";
input = new FileInputStream(resourceLoc);
} catch(Exception e) {
// Do whatever
}
如果您遵循此项目结构并使用此代码,那么它将在AWS Lambda中工作
PropertyUtility只是我创建的一个实用程序类,用于读取配置文件的内容。PropertyUtility类如下所示-
正如您在上面的代码中所看到的,配置文件的路径在本地系统和Lambda实例中是不同的
在本地计算机中,PropertyUtility.class.getResource(“/”指向bin,这就是为什么必须执行path.getParent(),将其指向本例中的项目目录HelloLambda
对于Lambda实例,PropertyUtility.class.getResource(“/”)直接指向项目目录。如果中的文件位于resources目录下,则以下解决方案应该可以工作:
String fileName = "resources/config.json";
Path path = Paths.get(this.getClass().getResource("/").toURI());
Path resourceLocation = path.resolve(fileName);
try(InputStream configStream = Files.newInputStream(resourceLocation)) {
//use your file stream as you need.
}
这里最重要的部分是“resources/config.json”,它不能是“/resources/config.json”,因为我选中了lambda中的文件位置是/var/task/resources/config.json
希望这能帮助那些在aws lambda中仍面临读取文件问题的用户。如果该文件位于resources文件夹下,您可以使用类似以下代码的方式在lambda中直接使用它:
final BufferedReader br = new BufferedReader(new FileReader("/flows/cancellation/MessageArray.json"));
我想读一个json文件,你可以有不同的用例,但是代码可以工作。
这是您几分钟前提出的一个问题的副本:您收到了该问题的答案,但现在您发布了一堆代码,这些代码没有使用您提供的解决方案。@Mark,这是一个不同的问题,上一个问题与从S3读取文件有关,此问题与读取JAR包中的文件有关。抱歉,您正在尝试读取相同的文件名,因此我以为您在问相同的问题。请改用getaresourceAsStream()。您不需要将其转换为可能在所有情况下都不起作用的文件。