2016-05-24 6 views
0

Ich mag meine Datei lesen, die ein großes Byte für Byte ist und ich mit dieser Klasse derzeit die Datei zum Lesen:Wie eine Datei Byte für Byte mit BufferReader Klasse in Java lesen

public class File { 
    public byte[] readingTheFile() throws IOException { 


      FileReader in = new FileReader("/Users/user/Desktop/altiy.pdf"); 

        BufferedReader br = new BufferedReader(in); 

       String line; 
       while ((line = br.readLine()) != null) { 
        System.out.println(line); 

       } 

      in.close(); 

     return null; 

     } 
} //close class 

Jetzt in meine Hauptklasse, wo meine Hauptmethode ich versuche, die Datei zu lesen und dann versuchen, es als Parameter an eine andere Methode eines anderen wie unter Klasse weitergeben müssen:

public class myMainClass { 

    // some fields here 
File f = new File(); 

    public static void main (String [] a) { 

    try { 

      byte[] secret = five.readingTheFile(); // We call the method which read the file 


      byte[][] shar = one.calculateThresholdScheme(secret, n,k); 

// some other code here . Note n and k i put their values from Eclipse 

     } catch (IOException e) { 

      e.printStackTrace(); 

        } // close catch 

      } // close else 

     } // close main 

    } // close class 

jetzt in meiner Klasse, wo calculateThresholdScheme

ist

Aber meine Ausführung stoppt, sobald ich diese IllegalArgumentException ("null secret") werfe; was bedeutet, dass meine Datei noch nicht lesbar ist. Ich frage mich, was hier schief geht, aber ich bin immer noch nicht

+0

Vielleicht ist es, dass 'readingTheFile()' null zurückgibt, egal was? Vielleicht, ich meine das ist definitiv was es ist. – rmlan

+0

'BufferedReader' ist nicht zum Lesen von Bytes gedacht, sondern zum Lesen von Text. Verwende 'InputStream'. –

Antwort

3

Das Problem mit Ihrem Code herauszufinden, liegt in readingTheFile():

Dies ist die Rückkehr-Anweisung:

return null; 

Welche - Kapitän Offensichtlich hier - gibt null zurück. Also secret ist null und die IllegalArgumentException wird geworfen.

Wenn Sie unbedingt auf die BufferedReader ige Lösung halten wollen, sollte dies das Problem lösen:

byte[] readingTheFile(){ 
    byte[] result = null; 

    try(BufferedReader br = new BufferedReader(new FileReader(path))){ 
     StringBuilder sb = new StringBuilder(); 

     String line; 
     while((line = br.readLine()) != null) 
      sb.append(line).append('\n'); 

     result = sb.toString().getBytes(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 

    return result; 

}

Einige allgemeine Hinweise:
BufferedReader zum Zwecke des Lesens nicht gebaut eine Datei byte für byte sowieso. Z.B. '\n' wird ignoriert, da Sie zeilenweise lesen. Dies kann dazu führen, dass Daten beim Laden beschädigt werden. Nächstes Problem: Sie schließen nur die FileReader in readingTheFile(), aber nicht die BufferedReader. Immer Schließen Sie den ToplevelReader, nicht den darunter liegenden. Indem Sie try-with-resources verwenden, ersparen Sie sich einiges Arbeit und die Gefahr, das FileReader offen zu lassen, wenn etwas falsch codiert ist.

Wenn Sie die Bytes aus einer Datei lesen möchten, verwenden Sie stattdessen FileReader. Das wird Ihnen erlauben, die gesamte Datei als byte[] zu laden:

byte[] readingTheFile(){ 
    byte[] result = new byte[new File(path).length()]; 

    try(FileReader fr = new FileReader(path)){ 
     fr.read(result , result.length); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 

    return result; 
} 

Oder alternativ und noch einfacher: Mit java.nio

byte[] readingTheFile(){ 
    try{ 
     return Files.readAllBytes(FileSystem.getDefault().getPath(path)); 
    }catch(IOException e){ 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

also, was ich zurückgeben sollte, denn ich möchte auf jeden Fall das Array von Bytes zurückgeben, die die Daten der Datei enthält. Ich weiß nicht, wie man Daten in dieses Array legt, weil ich weiß, dass readLine eine Zeichenfolge zurückgibt.Ich habe es getan mit Files.readAllByte, die ein Array von Bytes zurückgeben, aber die Leistung ist nicht so schnell und ich wollte Pufferleser verwenden und ich sehe bei Java API und ich habe keine Methode in dieser Pufferleserklasse, in der ich gefunden kann ein Array von Bytes –

+0

@BarletSouth zurückgeben, wie bereits erwähnt, mit einem 'BufferedReader' hier, ist eine schlechte Idee. Ich habe die Antwort jedoch mit einem Beispiel bearbeitet, das zeigt, wie man es mit "BufferedReader" macht. Sie können eine 'String' in ein' byte [] 'konvertieren, indem Sie' String # getBytes() 'verwenden – Paul

0

Ändern Sie Ihre Klasse „Datei“ wie unten, das ist, wie es zur Verfügung stellt du der Wunschmechanismus. Ich habe dieselbe Klasse geändert, die Sie geschrieben haben.

public class File { 
public byte[] readingTheFile() throws IOException { 

    java.io.File file = new java.io.File("/Users/user/Desktop/altiy.pdf"); 

    /*FileReader in = new FileReader("/Users/user/Desktop/altiy.pdf"); 
    BufferedReader br = new BufferedReader(in); 
    String line; 
    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
    } 
    in.close(); 
    */ 
    FileInputStream fin = null; 
    try { 
     // create FileInputStream object 
     fin = new FileInputStream(file); 

     byte fileContent[] = new byte[(int) file.length()]; 

     // Reads bytes of data from this input stream into an array of 
     // bytes. 
     fin.read(fileContent); 
     // returning the file content in form of byte array 
     return fileContent; 
    } catch (FileNotFoundException e) { 
     System.out.println("File not found" + e); 
    } catch (IOException ioe) { 
     System.out.println("Exception while reading file " + ioe); 
    } finally { 
     // close the streams using close method 
     try { 
      if (fin != null) { 
       fin.close(); 
      } 
     } catch (IOException ioe) { 
      System.out.println("Error while closing stream: " + ioe); 
     } 
    } 
    return null; 
} 
}