I tried to find out why OkHttp uses Okio but not BufferedInputStream and BufferedOutputStream to buffer data. I used following code to verify:
private String targetPath = Environment.getExternalStorageDirectory()
+ File.separator + "performance.dat";
private InputStream getInputStream() {
try {
File targetFile = new File(targetPath);
if (targetFile.exists()) {
targetFile.delete();
}
targetFile.createNewFile();
return new FileInputStream("/sdcard/file.zip");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void bufferedIO(View view) {
new Thread() {
@Override
public void run() {
InputStream inputStream = getInputStream();
if (inputStream == null) {
return;
}
long start = System.currentTimeMillis();
inputStream = new BufferedInputStream(inputStream, 8192);
File targetFile = new File(targetPath);
BufferedOutputStream fileOutputStream = null;
try {
fileOutputStream = new BufferedOutputStream(new FileOutputStream(targetFile, true), 8192);
byte[] buffer = new byte[4096];
int count;
while ((count = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, count);
}
fileOutputStream.flush();
Log.i("performance", "BufferedInputStream and BufferedOutputStream: " + (System.currentTimeMillis() - start) + "ms");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
public void okio(View view) {
new Thread() {
@Override
public void run() {
InputStream inputStream = getInputStream();
if (inputStream == null) {
return;
}
long start = System.currentTimeMillis();
File targetFile = new File(targetPath);
Source bufferSource = Okio.buffer(Okio.source(inputStream));
BufferedSink bufferSink = null;
try {
bufferSink = Okio.buffer(Okio.sink(targetFile));
while ((bufferSource.read(bufferSink.buffer(), 4096)) != -1) {
bufferSink.emitCompleteSegments();
}
bufferSink.flush();
Log.i("performance", "okio: " + (System.currentTimeMillis() - start) + "ms");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bufferSource.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bufferSink != null) {
try {
bufferSink.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
I called bufferedIO() 5 times, the results are:
357ms
299ms
311ms
324ms
331ms
I called okio() 5 times, the results are:
524ms
661ms
555ms
525ms
573ms
According to the results, BufferedInputStream and BufferedOutputStream are more efficient than Okio. Is there anything wrong with my verification?