Can not find a java.io.InputStream with the name [inputStream] in the invocation

本文探讨了在Java中遇到的无法通过指定名称找到InputStream的问题,并提供了两种解决方案:一是检查文件路径是否正确;二是确保使用正确的get方法来匹配配置文件中的inputName属性。
具体异常是这句话:

Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.

1.文件路径不对,根本就没有取到文件。这种情况下,可以将获得InputStream的那条语句放在system.out.println()中输出一下,若为null,那就是路径不对了,或者说得准确些就根本没有找到文件。
2.在action中没有写配置文件中"<param name="inputName">"后面属性的那个get方法.
当以上两种情况都正确的情况下,问题就在这里了:
当采用 return ServletActionContext.getServletContext().getResourceAsStream("...") 这种方法获得输入流的时候,要保证文件位置在 ServletContext 当中,就是说要在当前的应用上下文中,
如果想要获得外部文件 譬如 D盘中的某个文件,那么就要自己创建输入流才可以,如:

File file = new File("D:\\spring.doc");   
InputStream is = new FileInputStream(file);
return is;


则OK!!
以下是实现自定义类加载器加载指定位置的指定类的代码: 1. Course.java ```java public class Course { private String name; public Course(String name) { this.name = name; } public void printName() { System.out.println("Course name is " + name); } } ``` 2. MyClassLoader.java ```java import java.io.*; public class MyClassLoader extends ClassLoader { private String classPath; public MyClassLoader(String classPath) { this.classPath = classPath; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = getClassData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); } } private byte[] getClassData(String className) { String path = classPath + "/" + className.replace('.', '/') + ".class"; try (InputStream inputStream = new FileInputStream(path); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, len); } return byteArrayOutputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } } ``` 3. DataLoader.java ```java import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class DataLoader { private MyClassLoader myClassLoader; public DataLoader(MyClassLoader myClassLoader) { this.myClassLoader = myClassLoader; } public Object newInstance(String className) { try { Class<?> clazz = myClassLoader.loadClass(className); Constructor<?> constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); return constructor.newInstance(); } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } return null; } } ``` 4. 测试代码 ```java public class Test { public static void main(String[] args) { MyClassLoader myClassLoader = new MyClassLoader("D:/classes"); DataLoader dataLoader = new DataLoader(myClassLoader); Course course = (Course) dataLoader.newInstance("Course"); course.printName(); } } ``` 在上述测试代码中,首先创建一个 MyClassLoader 对象,它负责从指定路径 D:/classes 中加载类。然后创建一个 DataLoader 对象,它使用 MyClassLoader 对象来加载 Course 类。最后通过调用 DataLoader 对象的 newInstance 方法来创建 Course 类的实例,并调用 printName 方法打印课程名称。需要注意的是,加载类时需要保证类路径正确,并且需要保证类的构造方法是默认的无参构造方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值