2013-03-01 26 views
12

W moim projekcie java, przekazuję FileInputStream do funkcji, Potrzebuję konwertować (typecast FileInputStream na ciąg), Jak to zrobić?Jak przekonwertować FileInputStream na ciąg w java?

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

co chcesz przez to osiągnąć? naive to 'fis.toString();' –

+2

Cóż, zawsze jest "fis.toString()", choć prawdopodobnie nie to, co chciałeś. * Dlaczego * chciałbyś zamienić 'fis' w łańcuch? – akaIDIOT

+0

chcesz zawartość strumienia wejściowego pliku na ciąg? – Arpit

Odpowiedz

18

Nie można bezpośrednio przekształcić go w ciąg. Należy zaimplementować coś takiego Dodaj ten kod do swojej metody

//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()); 

roztwór użytkowy Aubin:

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(); 
    } 
} 
+2

czytanie strumienia postaci po znaku nie jest wydajne. – Aubin

+0

Może być :) Myślę, że on nie szuka efektywnego sposobu, po prostu próbuje się nauczyć –

+0

W rzeczywistości, czytanie znaków może być bardziej wydajne niż czytanie linii, które są łańcuchami, ponieważ aby utworzyć ciąg, musisz mieć najwyższą kopię każdego znaków w ciągu znaków, a to tylko, aby zwrócić ciąg, który jest następnie kopiowany do innego ciągu .... – AgilePro

15
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(); 
    } 
} 
+0

W zależności od wymagań oryginalnego plakatu, być może potrzebne jest kodowanie pliku i separator linii (lub odczytane tak, jak pojawia się w pliku). –

+0

Tak, masz rację, ale podczas odczytywania strumienia do pamięci RAM możemy zaakceptować, że terminator linii zostanie znormalizowany do \ n (założenie do dyskusji) – Aubin

+0

Zamknięcie powinno nastąpić w bloku finally, lub lepiej w bloku try-with-resource . – Puce

4

Nie popełnia błąd opierając się na przekształcenie lub niepotrzebnie/utraty znaków linii końcowej. Zrób to postacią po znaku. Nie zapomnij użyć odpowiedniego kodowania znaków do interpretowania strumienia.

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(); 
} 

Jeśli chcesz, aby ten trochę bardziej wydajne, można zamiast tego użyć tablic znaków, ale szczerze mówiąc, zapętlenie ciągu znaków może być nadal dość szybko.

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(); 
} 
+1

czytanie postaci strumienia przez postać nie jest skuteczna. – Aubin

+0

Właściwie, jest dobry powód, by sądzić, że jest bardziej wydajny niż kod, który skanuje i manipuluje znakami końca wiersza, a następnie kopiuje je w ciągu znaków w celu zwrócenia. Postać po znaku sprawnie działa z natywną zawartością strumienia. – AgilePro

+0

Przepraszam, zapomniałem czytnika Reader, aby przekonwertować bajty na znaki. – AgilePro

0

Od odpowiedzi edytowany 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; 
} 

to uniknąć wszystkich błędów i działa dobrze.

0

użyć poniższy kod ---->

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); 
} 
0

Korzystanie z Apache Commons IOUtils funkcjonować

import org.apache.commons.io.IOUtils; 

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