将文件转换成String||将InputStream转换成String

本文介绍Java中如何使用相对路径读取文件,并强调文件必须位于classpath目录内。提供了具体的代码示例,包括如何避免常见错误及使用ClassLoader的方法。
核心提示:Java读取相对路径文件是的前提也是相对的:文件必须位于classpath下面,否则随便一个相对文件是没法读取的。


Java读取相对路径文件是的前提也是相对的:文件必须位于classpath下面,否则随便一个相对文件是没法读取的。


用IDE创建一个工程,一般都会有一个src的目录,这个src就是工程的classpath目录了,只要在src目录或其子目录下的文件,在程序代码中都可以使用相对路径的方式来读取,这里的相对路径和文件系统的相对路径概念上也许有点差异。


 举例来说:

public class XmlTest{

        private String inputStreamToString(InputStream is, String encoding) {
     try {
          byte[] b = new byte[1024];
          String res = "";
          if (is == null) {
                 return "";
          }
          
          int bytesRead = 0;
          while (true) {
              bytesRead = is.read(b, 0, 1024); // return final read bytes counts
              if (bytesRead == -1) {// end of InputStream
                     return res;
              }
              res += new String(b, 0, bytesRead, encoding); // convert to string using bytes
           }
       } catch (Exception e) {
             e.printStackTrace();
             System.out.print("Exception: " + e);
             return "";
       }
 }
    public static String genWscmd(String xmlfilename) { 
           InputStream in = XmlTest.class.getClassLoader().getResourceAsStream(xmlfilename); 
           String x = new XmlTest().inputStreamToString(in, "UTF-8"); 
           return x; 
   }

        public static void main(String[] args) {

                String out = genWscmd("sys_ds.xml");

                System.out.println(out);

        }

}

1、sys_ds.xml位于src下,路径直接写其名字。但千万别写成“/sys_ds.xml”了,这是错误的,会被认为是绝对路径。


2、将文件sys_ds.xml移动到mypack包下面,则路径应该写为:mypack/sys_ds.xml,前面还是没有“/”,这点要注意。

3、必须通过ClassLoader来执行getResourceAsStream()方法。获取ClassLoader有两种方式:

 InputStream in = TestRead.class.getClassLoader().getResourceAsStream(xmlfilename);

或

        InputStream in = new TestRead().getClass().getClassLoader().getResourceAsStream(xmlfilename);

4、将一个流转换为字符串的实现如下:


 /**

         * 读取输入流为一个内存字符串,保持文件原有的换行格式

         *

         * @param in            输入流

         * @param charset 文件字符集编码

         * @return 文件内容的字符串

         */

        public static String file2String(InputStream in, String charset) {

                StringBuffer sb = new StringBuffer();

                try {

                        LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(in, charset)));

                        String line;

                        while ((line = reader.readLine()) != null) {

                                sb.append(line).append(System.getProperty("line.separator"));

                        }

                        reader.close();                        

                } catch (UnsupportedEncodingException e) {

                        log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + charset, e);

                } catch (IOException e) {

                        log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!", e);

                }

                return sb.toString();

        }



<think>好的,我现在需要帮助用户解决如何将Java中的String转换为InputStream的问题。用户已经提供了三个引用,不过看起来这些引用可能和用户的实际需求不完全匹配,但其中引用[3]似乎直接相关。我需要仔细分析这些引用,并找出正确的方法。 首先,用户的问题很明确:他们想要在Java中将String转换为InputStream的示例。根据我的知识,通常的做法是使用ByteArrayInputStream,因为String可以通过getBytes()方法转换为字节数组,然后作为输入流的源。 接下来,检查用户提供的引用。引用[3]提到使用String的getBytes()方法和ByteArrayInputStream,这正是标准的方法。而引用[1]和[2]虽然涉及InputStreamString之间的转换,但主要是关于将InputStream转换为String,而不是相反。不过,用户明确需要的是StringInputStream,所以重点在引用[3]。 我需要确保提供的代码示例正确无误。通常需要考虑字符编码的问题,因为getBytes()可能会使用平台默认编码,最好显式指定编码,比如UTF-8。所以示例代码中应该包含带有字符编码参数的getBytes方法。 然后,按照用户的要求,回答结构要清晰,分步骤说明。可能需要分为几个步骤:获取字符串的字节数组、创建ByteArrayInputStream实例、使用示例。同时,代码要正确使用Java语法,比如正确的类导入和异常处理,但示例可能不需要完整类结构,只需核心代码即可。 用户还要求生相关问题,我需要考虑用户可能进一步想知道的内容,比如不同编码的影响、其他转换方法、异常处理等。这样可以帮助用户更全面地理解主题。 最后,确保回答中引用了正确的来源,即引用[3],并在适当的位置添加引用标识。同时,检查是否符合用户的其他格式要求,如使用中文、LaTeX格式正确(虽然这个问题可能不涉及数学公式),但行内代码要用反引号包裹,独立代码块使用三个反引号并注明语言。 总结步骤: 1. 介绍主要方法:使用ByteArrayInputStream。 2. 分步骤说明实现过程。 3. 提供代码示例,包含字符编码处理。 4. 引用相关引用[3]。 5.相关问题,如其他方法、编码问题、异常处理等。 现在需要将这些步骤组织自然流畅的回答,确保用户能够轻松跟随并理解如何实现转换。</think>在Java中将String转换为InputStream可通过以下步骤实现: ### 核心方法 1. **获取字符串的字节数组**:使用`String.getBytes()`方法,推荐显式指定字符编码(如UTF-8)。 2. **创建字节数组输入流**:通过`ByteArrayInputStream`类包装字节数组。 ### 代码示例 ```java String content = "Hello, InputStream!"; // 指定字符编码(默认使用平台编码) byte[] bytes = content.getBytes(StandardCharsets.UTF_8); InputStream inputStream = new ByteArrayInputStream(bytes); ``` ### 说明 - **字符编码**:若未指定编码,`getBytes()`会使用系统默认编码,可能导致跨平台问题[^3]。 - **流的作用**:转换后可通过`inputStream`读取数据,例如用`BufferedReader`逐行处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值