如何将一个InputStreamobject类型转换成intFile类型

原文:http://blog.csdn.net/linjx2004/article/details/5608909
首先,想比较一下这两者的不同。URL用于网络,所以带有明显的protocol,而且对于中文及符号支持的很不好。File就是我们平常系统中的文件路径了,对于中文及符号都支持,但是已经没有protocol了。所以,虽然两者都可以表示文件路径,但是却不能混用了。
典型的URL和File路径的比较:
URL:file:/D:/my%20java/URL&FILE/%e5%9b%be%e7%89%87/tongji.jpg
File:D:/my java/URL&FILE/图片/tongji.jpg
其实两者是一个文件。
回到正题:
这是我在JDK5.0下找到的方法,JDK5.0以下不支持:
URL to File:
URL url=……;
File file=new File(url.toURI);
File to URL:
File file=……;
URL url=file.toURL();
++++++++++++++++++++++++++++
获取JAVA路径,包括CLASSPATH外的路径
归纳一些网上取JAVA路径的方法:
  注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。
  
& 得到classpath和当前类的绝对路径的一些方法
  获得CLASSPATH之外路径的方法:
  URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/
  String path = new File(base.getFile(), "../../../"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name
  下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。
  1.FileTest.class.getResource("")
  得到的是当前类FileTest.class文件的URI目录。不包括自己!
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
  2.FileTest.class.getResource("/")
  得到的是当前的classpath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  3.Thread.currentThread().getContextClassLoader().getResource("")
  得到的也是当前ClassPath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  4.FileTest.class.getClassLoader().getResource("")
  得到的也是当前ClassPath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  5.ClassLoader.getSystemResource("")
  得到的也是当前ClassPath的绝对URI路径。
  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
  
我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。
  在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
  注意点:
  1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时bomb,随时可能要你的命。
  2.尽量使用URI形式
  的绝对路径资源。它可以很容易的转变为URI,URL,File对象。
  3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。
  4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。
  使用硬编码的绝对路径是完全没有必要的!它一定会让你死的很难看!程序将无法移植!
  如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!
  当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径。
=============================================================================
在开发java程序的过程中,我们经常要做的一件事就是获取资源。那么什么是资源呢?说白了,在计算机里那就是一堆数据。只是这堆数据对我们的java程序有多种表现形式,一般来说有File,URL,InputStream等等。而单就文件这一项就有很多种:配置文件,java类文件,jps文件,图片、css、js文件等等。面对这林林总总的资源,我们在设计一个读取资源的接口时,就需要针对不同形式的资源提供方法,这样就导致我们的接口还是与实际的资源形式绑定在一起,未能完全的抽象。另外,在java程序中资源的存放位置也是各异的。有的存放在classpath中,有的存放在文件系统中,有的存放在web应用中。而对于不同位置的资源,java程序获取这些资源的方法各有不同。
A、获取classpath中的资源:
URL url = this.getClass().getResource("resource_name");&
URL url = this.getClass().getClassLoader().getResource("resource_name");&
URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name");&
那么在jdk中为什么又提供了三种方式来获取classpath下的资源呢?这其中是有些来头的。
第一行代码中是利用Class类的实例来获取,第二行代码是使用加载当前类的classloader来获取。看下jdk中的源代码会发现class类的实例最后还是委托加载他的classloader来获取资源的。
public java.net.URL getResource(String name) {&
&&& name = resolveName(name);&
&&& ClassLoader cl = getClassLoader0();&
&&& if (cl==null) {&
&&&&&&& // A system class.&
&&&&&&& return ClassLoader.getSystemResource(name);&
&&& return cl.getResource(name);&
从上面的代码中可以看出,对于资源的加载并没有像类加载所采用的双亲委托机制。而是当前类的classloader不为null的情况下先从当前类的classloader中加载资源。而只有当前类的classloader为null的时候才从system classloader中去加载资源。这样可以方便我们自定义配置类覆盖一些默认配置。当然,j2se应用中如果没有特别定制classloader时,我们自己写的类都是被system classloader加载的。到底利用class去获取资源和利用classloader去获取资源有什么区别呢?区别就在 resolveName(name)这个方法中。两种方式对于资源名称的表示方式不同。下面是一个简单的包结构,/表示类路径的根
&& |-Test.class
&& |-test2.txt&
|-test1.txt
// 获取与当前类在同一个包下的资源&
URL url1 = this.getClass().getResource("test2.txt");&
// 获取.test包下的资源,需加/&
URL url2 = this.getClass().getResource("/com/cn/test/test2.txt");&
// 获取类路径根下的资源&
URL url3 = this.getClass().getClassLoader().getResource("test1.txt");&
// 获取包.test包下的资源&
URL url4 = this.getClass().getResource("com/cn/test/test2.txt");&
而第三利用当前线程的contextClassLoader来获取资源的解释可以参考我的另一篇
B、获取文件系统中的资源
// 1、获得File对象&
File file = new File("test.txt");&
// 2、获得File对象的字节流&
InputStream in = new FileInputStream(file);&
值得注意的是在File的构造函数File(String name) 中的name参数可以是相对路径和绝对路径。相对路径是相对于System.getProperties("user.dir")的。
C、获取web应用中的资源
servletContext.getResourceAsStream(resource_name);&
resource_names为相对于webroot的路径表示。例如获取web.xml,resource_name表示为"/WEB-INF/web.xml"
&&& 面对上面介绍的各种资源表现形式和存放位置,难道java中就没有提供一个统一处理方式吗?有,java.net.URL。
从名称上来看 URL(Uniform Resource Locator) 统一资源定位器。看起来很好很强大。但很多时候使用它并不能定位到我们需要的资源。
&&& 首先,它jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦);常用的有http,file,ftp等等。并没有提供对classpath和servletContext中的资源的获取方法。
&&& 另外,它没有提供判断资源是否存在的方法。每次只有等我们真正去获取资源的时候抛出异常才能知道资源无法获取。
&&& 其次,URL这个类的职责未划分清楚,既用来表示资源有用来获取其资源。
浏览 15752
michael_paul
浏览: 118972 次
来自: 天津
[/align][align=center]其他回答(2)
文件时一个什么类型得呢?你不可能把图片类型转成string类型得
收获园豆:2
百度、谷歌、搜狗
收获园豆:3
&&&您需要以后才能回答,未注册用户请先。Java InputStream类
当前位置:
>> Java InputStream类
Java InputStream类
Java InputStream类使用实例/例子代码教程;Java InputStream的类 InputStream的作用是标志那些从不同起源地产生输入的类
Java InputStream的类 InputStream的作用是标志那些从不同起源地产生输入的类。这些起源地包括(每个都有一个相关的InputStream子类): (1) 字节数组 (2) String对象 (3) 文件 (4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西置入一端,它们在另一端出来。 (5) 一系列其他流,以便我们将其统一收集到单独一个流内。 (6) 其他起源地,如Internet连接等(将在本书后面的部分讲述)。
除此以外,FilterInputStream也属于InputStream的一种类型,用它可为“破坏器”类提供一个基础类,以便将属性或者有用的接口同输入流连接到一起。这将在以后讨论。
表10.1 InputStream的类型
类 功能 构建器参数/如何使用
ByteArrayInputStream 允许内存中的一个缓冲区作为InputStream使用 从中提取字节的缓冲区/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口 StringBufferInputStream 将一个String转换成InputStream 一个String(字串)。基础的实施方案实际采用一个StringBuffer(字串缓冲)/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口 FileInputStream 用于从文件读取信息 代表文件名的一个String,或者一个File或FileDescriptor对象/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口 PipedInputString 产生为相关的PipedOutputStream写的数据。实现了“管道化”的概念 PipedOutputStream/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口 SequenceInputStream 将两个或更多的InputStream对象转换成单个InputStream使用 两个InputStream对象或者一个Enumeration,用于InputStream对象的一个容器/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口 FilterInputStream 对作为破坏器接口使用的类进行抽象;那个破坏器为其他InputStream类提供了有用的功能。参见表10.3 参见表10.3/参见表10.3文件输入流&FileInputStream类&文件输出流FileOutputStream&&---转载
转载自---http://blog.csdn.net/hguisu/article/details/7418161
111:文件输入流:
&FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。
<img src="/blog7style/images/common/sg_trans.gif" real_src ="http://img.my.csdn.net/uploads//_8795.jpg" ALT="" STYLE="border-style: max-width: 100%; color: rgb(51, 51, 51); font-family: A line-height: 26 background-color: rgb(255, 255, 255);"
TITLE="文件输入流&FileInputStream类&文件输出流FileOutputStream&&---转载" />
作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。
使用方法(1) & &
& &File &fin=new
File("d:/abc.txt");&
& FileInputStream in=new FileInputStream(
使用方法(2)
& &FileInputStream
&in=new&&FileInputStream(“d:
/abc.txt”);
222:文件输出流:
&作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件
FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。&
  创建一个文件流对象有两种方法:&
  方式1:&
& f=new &File
(“d:/myjava/write.txt ");
& FileOutputStream &out= new
FileOutputStream (f);
  方式2:&
  FileOutputStream
out=new FileOutputStream(“d:/myjava/write.txt
  方式3:构造函数将
FileDescriptor()对象作为其参数。&
  FileDescriptor() fd=new
FileDescriptor();&
  FileOutputStream f2=new
FileOutputStream(fd);&
  方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。&
  FileOutputStream f=new
FileOutputStream("d:/abc.txt",true);&
  注意:&(1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 无法将类型隐式转换为 的文章

 

随机推荐