版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
BufferAndChannel.java
package fileio;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class BufferAndChannel implements FileIo {
@Override
public List<String> readFile(String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
StringBuffer str = new StringBuffer();
Charset charSet = Charset.forName("UTF-8"); // 解码器
CharsetDecoder decoder = charSet.newDecoder();
ByteBuffer buf = ByteBuffer.allocate(1024 << 5);
try (FileInputStream file = new FileInputStream(filePath);
FileChannel channel = file.getChannel()) { // 通过信道读入buf
while (channel.read(buf) != -1) {
// 注意先调用flip方法反转Buffer,再从Buffer读取数据
buf.flip();
CharBuffer charBuff = decoder.decode(buf); // 解码,将buf中的字节流转换为字符串
String tem = charBuff.toString();
str.append(tem);
buf.clear(); // 每写一次清空一次缓存
}
long end = System.currentTimeMillis();
System.out.println("Buffer/Channel方法读入文件耗时为:" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
}
// 将字符串按行分割
String tem = str.toString();
List<String> retList = new ArrayList<String>(Arrays.asList(tem.split("\\n\\s*")));
return retList;
}
@Override
public void writeFile(List<String> strList, String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
try (FileOutputStream out = new FileOutputStream(filePath);
FileChannel channnel = out.getChannel(); ) {
try {
StringBuilder build = new StringBuilder();
for (String s : strList) {
build.append(s + '\n');
}
ByteBuffer buf = ByteBuffer.wrap((build.toString()).getBytes("UTF-8")); // 将字符串转化为字节
channnel.write(buf); // 读取buffer中的数据流,将其写入通道
long end = System.currentTimeMillis();
System.out.println("Buffer/Channel方法写入文件耗时为:" + (end - begin));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
File.java
package fileio;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class File implements FileIo {
@Override
public List<String> readFile(String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
Path path = Paths.get(filePath);
List<String> retList = null;
try {
retList = Files.readAllLines(path, Charset.forName("utf-8"));
long end = System.currentTimeMillis();
System.out.println("java.nio.file.Files方法读入耗时为:" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
}
return retList;
}
@Override
public void writeFile(List<String> strList, String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
Path path = Paths.get(filePath);
try {
Files.write(path, strList, Charset.forName("utf-8"));
long end = System.currentTimeMillis();
System.out.println("java.nio.file.Files方法写入耗时为:" + (end - begin));
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
Stream.java
package fileio;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
public class Stream implements FileIo {
@Override
public List<String> readFile(String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
List<String> retList = new ArrayList<String>();
try (FileInputStream file = new FileInputStream(filePath);
BufferedReader in = new BufferedReader(new InputStreamReader(file))) {
String tem = null;
while ((tem = in.readLine()) != null) {
retList.add(tem);
}
long end = System.currentTimeMillis();
System.out.println("Stream方法读入耗时为:" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
}
return retList;
}
@Override
public void writeFile(List<String> strList, String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
try (FileOutputStream file = new FileOutputStream(filePath);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(file))) {
for (String s:strList) {
out.write(s + '\n');
}
long end = System.currentTimeMillis();
System.out.println("Stream方法写入耗时为:" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
}
}
}
WriterAndReader.java
package fileio;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class WriterAndReader implements FileIo {
@Override
public List<String> readFile(String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
List<String> list = new ArrayList<String>();
try (FileReader file = new FileReader(filePath);
BufferedReader buf = new BufferedReader(file)) {
String tem = null;
while ((tem = buf.readLine()) != null) {
if (!tem.isBlank()) {
list.add(tem);
}
}
long end = System.currentTimeMillis();
System.out.println("Reader/Writer方法读入耗时为:" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
@Override
public void writeFile(List<String> strList, String filePath) {
// TODO Auto-generated method stub
long begin = System.currentTimeMillis();
File file = new File(filePath);
try (FileWriter fileWriter = new FileWriter(file);
BufferedWriter out = new BufferedWriter(fileWriter)) {
for (String s : strList) {
out.write(s + '\n');
}
long end = System.currentTimeMillis();
System.out.println("Reader/Writer方法写入耗时为:" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
}
}
}
四种读写方式在不同输入下的性能差异
tips:文件输出时,在末尾通过使用“\r\n”换行,通过记事本打开时,才有换行效果的体现。