【问题标题】:How to convert FileInputStream into string in java?如何在java中将FileInputStream转换为字符串?
【发布时间】:2013-03-01 15:47:23
【问题描述】:

在我的 java 项目中,我将 FileInputStream 传递给一个函数, 我需要转换(将 FileInputStream 类型转换为字符串), 怎么办??

public static void checkfor(FileInputStream fis) {
   String a=new String;
   a=fis         //how to do convert fileInputStream into string
   print string here
}

【问题讨论】:

标签: java fileinputstream


【解决方案1】:

您不能直接将其转换为字符串。你应该实现这样的东西 将此代码添加到您的方法中

    //Commented this out because this is not the efficient way to achieve that
    //StringBuilder builder = new StringBuilder();
    //int ch;
    //while((ch = fis.read()) != -1){
    //  builder.append((char)ch);
    //}
    //          
    //System.out.println(builder.toString());

使用欧宾的解决方案:

public static String getFileContent(
   FileInputStream fis,
   String          encoding ) throws IOException
 {
   try( BufferedReader br =
           new BufferedReader( new InputStreamReader(fis, encoding )))
   {
      StringBuilder sb = new StringBuilder();
      String line;
      while(( line = br.readLine()) != null ) {
         sb.append( line );
         sb.append( '\n' );
      }
      return sb.toString();
   }
}

【讨论】:

  • 可能是:) 我认为他不是在寻找有效的方法,他只是在努力学习
  • 实际上,读取字符比读取字符串行更高效,因为要创建一个字符串,您必须将每个字符都复制到字符串中,而这只是返回一个然后将字符串复制到另一个字符串....
  • @Aubin 为什么效率不高?
  • 移动字节或字符块的本机方法可能比处理每个字符的循环更快。但是,更重要的是看是否有不必要的额外搜索、转换和复制数据,这比字符循环开销占更多开销。顺便说一句,这个答案是将一个字节放入一个字符中,这是一个问题。
  • @AgilePro 为什么将字节转换为字符会出现问题?
【解决方案2】:
public static String getFileContent(
   FileInputStream fis,
   String          encoding ) throws IOException
 {
   try( BufferedReader br =
           new BufferedReader( new InputStreamReader(fis, encoding )))
   {
      StringBuilder sb = new StringBuilder();
      String line;
      while(( line = br.readLine()) != null ) {
         sb.append( line );
         sb.append( '\n' );
      }
      return sb.toString();
   }
}

【讨论】:

  • 根据原始海报的要求,可能需要文件编码和行分隔符(或按文件中显示的方式读取)。
  • 是的,你是对的,但是当读取流到 RAM 时,我们可能会接受行终止符将被规范化为 \n(假设辩论)
  • 关闭应该发生在 finally 块中,或者更好地发生在 try-with-resource 块中。
  • 需要指定字符编码。您不能假设平台默认编码是正确的。
  • 我使用文件作为该函数的参数,如果满足条件,那么我必须打印文件的整个路径,这就是为什么我将 fileinputstream 作为参数......
【解决方案3】:

使用Apache commons IOUtils函数

import org.apache.commons.io.IOUtils;

InputStream inStream = new FileInputStream("filename.txt");
String body = IOUtils.toString(inStream, StandardCharsets.UTF_8.name()); 

【讨论】:

  • 这并不适用于所有情况,因为编码可能与UTF_8不同
【解决方案4】:

不要犯依赖或不必要地转换/丢失结束行字符的错误。一个字一个字地做。不要忘记使用正确的字符编码来解释流。

public String getFileContent( FileInputStream fis ) {
    StringBuilder sb = new StringBuilder();
    Reader r = new InputStreamReader(fis, "UTF-8");  //or whatever encoding
    int ch = r.read();
    while(ch >= 0) {
        sb.append(ch);
        ch = r.read();
    }
    return sb.toString();
}

如果你想让它更高效一点,你可以使用字符数组来代替,但老实说,循环遍历字符还是相当快的。

public String getFileContent( FileInputStream fis ) {
    StringBuilder sb = new StringBuilder();
    Reader r = new InputStreamReader(fis, "UTF-8");  //or whatever encoding
    char[] buf = new char[1024];
    int amt = r.read(buf);
    while(amt > 0) {
        sb.append(buf, 0, amt);
        amt = r.read(buf);
    }
    return sb.toString();
}

【讨论】:

  • 实际上,有充分的理由相信它比扫描和操作行尾字符,然后将其复制到字符串中以返回的代码更有效。逐个字符有效地处理流的原生内容。
  • 抱歉,忘记读取器将字节转换为字符。
  • 不能在while表达式部分声明变量。并且 Reader 的读取返回 int,而不是 char。
  • 是的,我实际上更喜欢将声明保留在块条件之外,即使这意味着您有两行带有 read 语句。我已经改变了它。
【解决方案5】:

从我编辑的答案here:

static String convertStreamToString(java.io.InputStream is) {
    if (is == null) {
        return "";
    }

    java.util.Scanner s = new java.util.Scanner(is);
    s.useDelimiter("\\A");

    String streamString = s.hasNext() ? s.next() : "";

    s.close();

    return streamString;
}

这样可以避免所有错误并且运行良好。

【讨论】:

    【解决方案6】:

    使用以下代码---->

    try {
        FileInputStream fis=new FileInputStream("filename.txt");
        int i=0;    
        while((i = fis.read()) !=-1 ) {  // to reach until the laste bytecode -1
            System.out.print((char)i);   /* For converting each bytecode into character */ 
        }
        fis.close();
    } catch(Exception ex) {
        System.out.println(ex); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2010-12-18
      • 2010-10-21
      • 2012-11-16
      相关资源
      最近更新 更多