相关文章推荐
帅气的洋葱  ·  VSCode报错 Unexpected ...·  2 周前    · 
爱旅游的手套  ·  java - Google Maps ...·  1 年前    · 
傲视众生的烈酒  ·  PostgreSQL ...·  1 年前    · 
飞翔的小刀  ·  android - Avoiding ...·  1 年前    · 

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>