Advanced   Java   Services Performancevergleich IO versus NIO Back Next Up Home


Performancevergleich IO versus NIO

Es wird eine Textdatei der Größe 26,2 mb gelesen.


Lesen und Schreiben mit FileReader und FileWriter

Die Datei wird byteweise gelesen und sofort byteweise weggeschrieben.

private static boolean readAndWriteUnbuffered(String sourcefile, String destfile)
{
   try(FileReader fr = new FileReader(sourcefile);
       FileWriter fw = new FileWriter(destfile); )
   {
      int ch;
      while(  (ch=fr.read()) != -1 )
      {
         fw.write(ch);
      }
      return true;
   }
   catch(IOException ex)
   {
      ex.printStackTrace();
      return false;
   }
}

Lesen und Schreiben mit BufferedReader und BufferedWriter

Die Datei wird zeilenweise gelesen und sofort wieder zeilenweise weggeschrieben.

private static boolean readAndWriteBuffered(String sourcefile, String destfile)
{
   try(BufferedReader br = new BufferedReader( new FileReader(sourcefile));
       BufferedWriter bw = new BufferedWriter( new FileWriter(destfile)); )
     {
      String line ;
      while(  (line = br.readLine()) != null )
      {
         bw.write(line);
         bw.newLine();
      }
      return true;
     }
     catch(IOException ex)
     {
        ex.printStackTrace();
        return false;
     }
}

Lesen und Schreiben mit FileChannels

Die Größe des ByteBuffers kann variiert werden.

private static boolean readAndWriteWithFileChannels(String sourcefile, String destfile, int bufsize)
{
   try(FileInputStream fis = new FileInputStream(sourcefile);
       FileOutputStream fos = new FileOutputStream(destfile);)  // FileNotFoundException
   {
      FileChannel fcin = fis.getChannel();
      FileChannel fcout = fos.getChannel();
      ByteBuffer buffer = ByteBuffer.allocate(bufsize);
      //ByteBuffer buffer = ByteBuffer.allocateDirect(bufsize);
      for(int count = 0; (count = fcin.read(buffer)) != -1;) // IOException
      {
         // read hat in den buffer geschrieben
         buffer.flip();  // buffer zum Auslesen einrichten
         fcout.write(buffer);  // liest den buffer aus und schreibt in den channel
         buffer.clear(); // buffer zum Schreiben einrichten
      }
      return true;
   }
   catch(FileNotFoundException ex)
   {
      ex.printStackTrace();
      return false;
   }
   catch(IOException ex)
   {
      ex.printStackTrace();
      return false;
   }
}

Ergebnisse

Die Zeiten unterliegen Schwankungen.






Valid XHTML 1.0 Strict top Back Next Up Home