1:InputStream/OutputStream操作byte[]
2:Channel操作buffer
(Reader /Writer读写文件的方式就不比较了,其性能比上面两种方式差很多)
先来说说两种方式对比后的结果:总体来说第一种方式对比第二种方式有如下的缺点
1:速度慢,下面代码运行结果表明 Channel操作buffer速度快于InputStream/OutputStream操作byte[]
下面是我的测试代码:从F盘中读取spittr.war文件,然后重命名写入F盘。输出所需要的时间。
public class Test {
public static void main(String[] args) throws IOException{
byStream();//InputStream/OutputStream操作byte[]
byChannel(); //Channel操作buffer
static void byChannel() throws IOException {
File file = new File("F:"+File.separator+"spittr.war");
FileInputStream fins = new FileInputStream(file);
FileChannel fc = fins.getChannel();
File file2 = new File("F:"+File.separator+"Channel.war");
FileOutputStream fos = new FileOutputStream(file2);
FileChannel foc = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024*1024);
int temp = 0;
long start = System.currentTimeMillis();
while ((temp = fc.read(buffer) )!=-1) {
buffer.flip();
foc.write(buffer);
buffer.clear();
System.out.println("byChannel:"+(System.currentTimeMillis() - start));
fc.close();
fins.close();
foc.close();
fos.close();
static void byStream() throws IOException{
File file = new File("F:"+File.separator+"spittr.war");
FileInputStream fins = new FileInputStream(file);
File file2 = new File("F:"+File.separator+"stream.war");
FileOutputStream fos = new FileOutputStream(file2);
int temp = 0;
long start = System.currentTimeMillis();
byte[] buffer = new byte[1024*1024];
while ((temp = fins.read(buffer) )!=-1) {
fos.write(buffer,0,temp);
System.out.println("byStream:"+(System.currentTimeMillis() - start));
fins.close();
fos.close();
输出结果:
第一次运行:
byStream:40
byChannel:30
第二次运行:
byStream:46
byChannel:27
第三次运行:
byStream:44
byChannel:28
上面的输出结果印证了第二条结果。
下面介绍两种读写文件的对比, 1:InputStream/OutputStream操作byte[] 2:Channel操作buffer(Reader /Writer读写文件的方式就不比较了,其性能比上面两种方式差很多)先来说说两种方式对比后的结果:总体来说第一种方式对比第二种方式有如下的缺点1:速度慢,下面代码运行结果表明 Channel操作buffer速度快于InputSt...
Java NIO的通道类似流,都是用于传输数据的。但通过又与流有些不同;流的数据走向是单向的,分为输入流(只能读取数据),输出流(只能写出数据),但NIO中的通道不一样,通道既可以写数据到Buffer,又可以从Buffer中读取数据;另外流的操作对象是数组,而通道的操作对象是Buffer;FileChannel是用于文件I/O编程的管道类;通过FileInputStream和FileOutputStream可以获取一个关联文件的Channel,即FileChannel;示例代码:
我们可以读取Channel
" 字节流\n" +
" 字节输出流: OutputStream\n" +
" 字节输入流: InputStream\n" +
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm");
try {
//追加模式创建FileOutputStream
FileOutputStream fos = new FileOutputStream("d:/tm...
在复制大文件时,FileChannel复制文件的速度比BufferedInputStream/BufferedOutputStream复制文件的速度快了近三分之一,体现出FileChannel的速度优势。而且FileChannel是多并发线程安全的。
但是:在复制小文件是,尤其是只有几KB的文件时,FIleChannel方式并不具备优势,反而比流的方式慢得多。
这里附上代码,如下:
FileChannel 可以通过 FileInputStream, FileOutputStream, RandomAccessFile 的实例方法 getChannel() 来获取,也可以同通过静态方法 FileChannel.open(Path, OpenOption …) 来打开。
1.1 从 FileInputStream / FileOutputStream 中获取
从 FileInputStream 对象中获取的通道是以读的方式打开文件,从 FileOutpuStream 对象中获.
HTTP 404 NOT FOUND for channel anaconda/pkgs/main/conda <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/conda>