In my java project, I'm passing FileInputStream to a function, I need to convert (typecast FileInputStream to string), How to do it.??
public static void checkfor(FileInputStream fis) {
String a=new String;
a=fis //how to do convert fileInputStream into string
print string here
}
6 Answers 6
You can't directly convert it to string. You should implement something like this Add this code to your method
//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());
Use Aubin's solution:
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();
}
}
-
1May be :) I think he is not looking for the efficient way, he is just trying to learnArsen Alexanyan– Arsen Alexanyan2013年03月01日 15:59:27 +00:00Commented Mar 1, 2013 at 15:59
-
Actually, reading characters can be more efficient that reading lines which are strings, because a to make a String, you have top copy each of the characters in to the String, and that is only to return a String which is then copied to another String....AgilePro– AgilePro2013年03月01日 16:01:08 +00:00Commented Mar 1, 2013 at 16:01
-
@Aubin Why it is not efficient?Arsen Alexanyan– Arsen Alexanyan2013年03月01日 16:05:15 +00:00Commented Mar 1, 2013 at 16:05
-
1The native methods for moving a block of byte or characters can be faster than a loop that handles each character. However, what is more important is to look at whether there is needless extra search, converting, and copying of data, which accounts for more overhead than the character loop overhead. By the way, this answer is putting a byte into a character, which is a problem.AgilePro– AgilePro2013年03月01日 16:13:31 +00:00Commented Mar 1, 2013 at 16:13
-
@AgilePro Why it is a problem converting byte into character?Arsen Alexanyan– Arsen Alexanyan2013年03月01日 16:18:15 +00:00Commented Mar 1, 2013 at 16:18
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();
}
}
-
Depending on the requirements of the Original Poster, perhaps needed the file encoding and line separator (or read as it appears in the file).Paul Vargas– Paul Vargas2013年03月01日 16:03:53 +00:00Commented Mar 1, 2013 at 16:03
-
Yes, you're right but when reading stream to RAM we may accept the line terminator will be normalized into \n (assumption to debate)Aubin– Aubin2013年03月01日 16:06:08 +00:00Commented Mar 1, 2013 at 16:06
-
The close should happen in a finally block, or better in a try-with-resource block.Puce– Puce2013年03月01日 16:06:58 +00:00Commented Mar 1, 2013 at 16:06
-
2You need to specify the character encoding. You can not assume that the platform default encoding will be correct.AgilePro– AgilePro2013年03月01日 16:10:38 +00:00Commented Mar 1, 2013 at 16:10
-
I'm using file as a parameter to this function and if a condition satisfies then i have to print whole path of a file that's why i took fileinputstream as a parameter....bhushan23– bhushan232013年03月07日 15:31:51 +00:00Commented Mar 7, 2013 at 15:31
Using Apache commons IOUtils function
import org.apache.commons.io.IOUtils;
InputStream inStream = new FileInputStream("filename.txt");
String body = IOUtils.toString(inStream, StandardCharsets.UTF_8.name());
-
This won't work in all cases as encoding could be different from
UTF_8
Farid– Farid2019年08月25日 10:02:32 +00:00Commented Aug 25, 2019 at 10:02
Don't make the mistake of relying upon or needlessly converting/losing endline characters. Do it character by character. Don't forget to use the proper character encoding to interpres the stream.
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();
}
If you want to make this a little more efficient, you can use arrays of characters instead, but to be honest, looping over the characters can be still quite fast.
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();
}
-
Actually, there is good reason to believe it is more efficient than the code that is scanning for, and manipulating, the end of line characters, then copying that into a string for return. Character by character efficiently works with the native content of the stream.AgilePro– AgilePro2013年03月01日 15:57:32 +00:00Commented Mar 1, 2013 at 15:57
-
sorry, forgot the Reader to convert bytes to chars.AgilePro– AgilePro2013年03月01日 16:03:08 +00:00Commented Mar 1, 2013 at 16:03
-
2You can not declare a variable in the while expression part. And the read of a Reader returns int, not char.Roger Lindsjö– Roger Lindsjö2013年03月01日 16:07:54 +00:00Commented Mar 1, 2013 at 16:07
-
Yes, I actually prefer to keep the declaration out of the block condition, even though it means you have two lines with read statements. I have changed it thus.AgilePro– AgilePro2013年03月01日 16:15:45 +00:00Commented Mar 1, 2013 at 16:15
From an answer I edited 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;
}
This avoids all errors and works well.
Use following code ---->
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);
}
fis.toString();
fis.toString()
, though that might probably not what you wanted. Why would you want to turnfis
into a String?