将输入流InputStream转换为String

本文介绍了一种将Java中的InputStream转换为String的方法。通过使用BufferedReader和InputStreamReader,可以有效地读取文本文件的内容,并将其逐行追加到StringBuilder中,最终转换为String。
最近项目中用apache的httpclient中get、post、put、delete方法去请求url而这些方法请求之后响应回的数据可能很大就调用getResponseBodyAsString()方法,而响应后的数据要转换成string类型,同里也在网上看到有人需要将InputStream转换为String对象,这里我要跟大家说一下,这样的InputStream需要从文本文件(即纯文本的数据文件)中读取内容,然后将它的内容读出到一个String对象中。我下面直接给出代码,然后讲解下。
  1. package tk.hecks.blog.io;      
  2.      
  3. import java.io.BufferedReader;      
  4. import java.io.IOException;      
  5. import java.io.InputStream;      
  6. import java.io.InputStreamReader;      
  7. import java.util.Properties;      
  8.      
  9. public class StreamToString {      
  10.      
  11.     public static void main(String[] args) {      
  12.          StreamToString sts = new StreamToString();      
  13.               
  14.         /*  
  15.           * Get input stream of our data file. This file can be in the root of  
  16.           * you application folder or inside a jar file if the program is packed  
  17.           * as a jar.  
  18.           */     
  19.          InputStream is = sts.getClass().getResourceAsStream("/data.txt");      
  20.      
  21.         /*  
  22.           * Call the method to convert the stream to string  
  23.           */     
  24.          System.out.println(sts.convertStreamToString(is));      
  25.      }      
  26.           
  27.     public String convertStreamToString(InputStream is) {      
  28.         /*  
  29.           * To convert the InputStream to String we use the BufferedReader.readLine()  
  30.           * method. We iterate until the BufferedReader return null which means  
  31.           * there's no more data to read. Each line will appended to a StringBuilder  
  32.           * and returned as String.  
  33.           */     
  34.          BufferedReader reader = new BufferedReader(new InputStreamReader(is));      
  35.          StringBuilder sb = new StringBuilder();      
  36.      
  37.          String line = null;      
  38.         try {      
  39.             while ((line = reader.readLine()) != null) {      
  40.                  sb.append(line + "\n");      
  41.              }      
  42.          } catch (IOException e) {      
  43.              e.printStackTrace();      
  44.          } finally {      
  45.             try {      
  46.                  is.close();      
  47.              } catch (IOException e) {      
  48.                  e.printStackTrace();      
  49.              }      
  50.          }      
  51.      
  52.         return sb.toString();      
  53.      }      
  54. }     

如果大家学习过Java IO部分的API,相信大家对上面的代码应该比较容易理解。我大致的讲解下,主要讲解convertStreamToString方法,它是主要的转换方法。我们首先将InputStream转换为BufferedReader对象,该对象用于读取文本。然后我们就一行行的读取文本数据并加入到StringBuilder中(这里也可以用StringBuffer对象)。这里主要主意的地方是while的结束条件是当读取到的字符串为null。然后在最后将StringBuilder对象转换为字符串返回回去。

该代码大家可以自己运行下试试。希望能够帮助大家解决遇到的问题。whiteeye


来源: Heck's Blog
地址: http://www.hecks.tk/httpclient-getresponsebodyasstream-stream-string/
<think>嗯,用户想用EasyExcel把InputStream成List。我需要回忆一下EasyExcel的用法。首先,EasyExcel是阿里开源的库,用来简化Excel操作,避免内存溢出。通常处理Excel的时候,可能需要读取输入流,比如上传的Excel文件,成对象列表。 那具体怎么做呢?应该需要一个监听器,继承AnalysisEventListener,然后重写invoke和doAfterAllAnalysed方法。在invoke里收集数据,最后在doAfterAllAnalysed处理完成后的逻辑。同时,得用ExcelReaderBuilder来读取输入流,指定监听器。 但要注意,监听器不是Spring管理的,所以里面不能依赖注入,需要手动传参。另外,用户可能需要同步读取,也就是读取整个Excel到内存,而不是逐行处理。这时候可以用EasyExcel.read(inputStream, 对象.class, 监听器).sheet().doReadSync(),这个方法会直接返回List。 不过同步读取可能只适用于数据量不大的情况,否则还是建议用监听器模式。可能用户需要的是同步读取的方式,直接得到一个List。所以代码示例应该包括两种方式:监听器异步和同步读取。可能用户更想要同步的,因为直接返回List更方便。 再检查一下导入的包是否正确,比如EasyExcel的类是否正确引用。还有,确保传入的InputStream是有效的,比如从MultipartFile获取的。另外,数据模型类要用注解标注ExcelProperty,对应表头。例如,@ExcelProperty("姓名") private String name; 总结步骤:1.定义数据模型类;2.创建监听器收集数据;3.使用EasyExcel读取输入流,使用监听器或同步方法获取List。最后要提醒用户注意内存问题,大文件用监听器,小文件用同步方法。</think><< 使用EasyExcel将InputStream转换为List需要结合读取监听器进行数据收集。具体实现步骤如下: 1. 创建数据模型类: ```java public class DemoData { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; // 必须有无参构造器 // 省略getter/setter } ``` 2. 创建数据监听器: ```java public class DemoDataListener extends AnalysisEventListener<DemoData> { private final List<DemoData> dataList = new ArrayList<>(); @Override public void invoke(DemoData data, AnalysisContext context) { dataList.add(data); // 逐行读取时收集数据 } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 读取完成后的操作(可选) } public List<DemoData> getDataList() { return dataList; } } ``` 3. 执行读取操作: ```java public List<DemoData> convertInputStreamToList(InputStream inputStream) { DemoDataListener listener = new DemoDataListener(); ExcelReader excelReader = EasyExcel.read(inputStream, DemoData.class, listener).build(); ReadSheet readSheet = EasyExcel.readSheet(0).build(); excelReader.read(readSheet); excelReader.finish(); return listener.getDataList(); } ``` 实现原理: 1. EasyExcel基于POI的SAX模式解析Excel文件,逐行读取内容 2. 通过监听器模式实现数据逐行处理,避免内存溢出 3. @ExcelProperty注解实现Excel列与对象属性的映射 4. 异步读取机制通过监听器逐步收集数据 注意事项: 1. 监听器不能使用Spring依赖注入(需要自行处理依赖) 2. 读取完成后必须调用finish()释放资源 3. 大文件建议保持监听器模式,不要直接收集到List 4. 如果需要同步获取结果,可以使用以下方式: ```java List<DemoData> list = EasyExcel.read(inputStream) .head(DemoData.class) .sheet() .doReadSync(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值