Java如何快速复制大文件

时间:2020-12-31 17:18:27
我希望从本地和远程复制文件,文件都很大,10G级的,如何快速的复制?看网上有人说使用管道到管道,这确实比其他的快,不知道fastcopy是怎样实现的,各位有什么想法?

85 个解决方案

#1


百度搜一下bufferedStream 和 FileStream

#2


内存文件映射

#3


学习中..

#4


学习中......

#5


用CLOB类型吧,单个变量可以存储4G,再加上BufferedStream.

#6


本地远程复制大文件啊,而且还是10G这么大的。你看看迅雷啊,他是多部分一起传的。java传输文件就是一般的文件操作啊,你可以模仿迅雷,开多个线程下载,每个线程记录下载部分的开始和结束索引,一起下到远程去。

至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。

#7


引用 6 楼 youjianbo_han_87 的回复:
至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。


楼上的,你见过用 java 开发的运行在 windows 上的桌面应用软件吗


快车这些东西之所以不用 java 做,最大的原因不是它的效率,而是它必须要安装JVM

快车只不过客户端的东西,服务端运行 java 是很常见的。楼主的这个问题用多线程来解决应该不存在效率问题。

#8


关注

#9


用nio,比io效率好点

#10


支持

#11


学习中。。。。。。

#12


多线程 + FTP

#13


我使用nio和io来测试一个100m的文件,虽然每次速度不同,但是都是io的比nio的快怎么回事

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class CopyFile {
/**
 * nio拷贝
 * @param inFile  源文件
 * @param outFile 目标文件
 * @return
 * @throws Exception
 */
public static long FileChannelCopy(String inFile,String outFile) throws Exception
{
long begin = System.currentTimeMillis();
File in = new File(inFile);
File out = new File(outFile);
FileInputStream fin = new FileInputStream(in);
FileOutputStream fout = new FileOutputStream(out);
FileChannel inc = fin.getChannel();
FileChannel outc = fout.getChannel();
int bufferLen = 2097152;
ByteBuffer bb = ByteBuffer.allocateDirect(bufferLen);
while (true)
{
int ret = inc.read(bb);
if (ret == -1)
{   
fin.close();
fout.flush();
fout.close();
break;
}
bb.flip();
outc.write(bb);
bb.clear();
}
long end = System.currentTimeMillis();
long runtime = 0;
if(end >  begin)
runtime = end - begin;
return runtime;

}
/**
 * io拷贝
 * @param inFile 源文件
 * @param outFile 目标文件
 * @return
 * @throws Exception
 */
public static long FileStraeamCopy(String inFile,String outFile) throws Exception
{
long begin = System.currentTimeMillis();

File in = new File(inFile);
File out = new File(outFile);
FileInputStream fin=new FileInputStream(in);
FileOutputStream fout=new FileOutputStream(out);

int length=2097152;//2m内存
byte[] buffer=new byte[length];

while(true)
{
int ins=fin.read(buffer);
if(ins==-1)
{
fin.close();
fout.flush();
fout.close();
break;

}else
fout.write(buffer,0,ins);

}
long end = System.currentTimeMillis();
long runtime = 0;
if(end > begin)
runtime = end - begin;
return runtime;

}
static public void main(String args[]) throws Exception {
String inFile = "D:\\big4.pdf"; //源文件
String outFile = "D:\\big4copy1.pdf"; //输出文件1
String outFile2 = "D:\\big4copy2.pdf"; //输出文件2
long runtime1,runtime2;
runtime1 = FileChannelCopy(inFile,outFile);
runtime2 = FileStraeamCopy(inFile,outFile2);
System.out.println("FileChannelCopy running time:" + runtime1);
System.out.println("FileStraeamCopy running time:" + runtime2);





}
}



某一次运行输出结果

FileChannelCopy running time:9969
FileStraeamCopy running time:6421

#14


有时FileChannelCopy 比FileChannelCopy 快

#15


有个工具叫fastcopy,不知道是采用什么思想

#16


#17


呵呵,有人吗

#18


引用 7 楼 hemowolf 的回复:
引用 6 楼 youjianbo_han_87 的回复:

 至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。


 楼上的,你见过用 java 开发的运行在 windows 上的桌面应用软件吗


 快车这些东西之所以不用 java 做,最大的原因不是它的效率,而是它必须要安装JVM

 快车只不过客户端的东西,服务端运行 java 是很常见的。楼主的这个问题用多线程来解决应该不存在效率问题。


多线程下载,我同意,我也是这样说的,至于你说的 服务器端运行 java ,而 客户端不用 java 做是因为JVM的关系,我不同意。想这种远程IO操作,C++效率肯定要比java高。你用脚指头想想,并看下java io部分那个.dll是用什么实现的,你就知道了。

#19


引用楼主 paodan 的回复:
我希望从本地和远程复制文件,文件都很大,10G级的,如何快速的复制?看网上有人说使用管道到管道,这确实比其他的快,不知道fastcopy是怎样实现的,各位有什么想法?


使用nio

#20


引用 13 楼 paodan 的回复:
我使用nio和io来测试一个100m的文件,虽然每次速度不同,但是都是io的比nio的快怎么回事
Java codeimport java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;publicclass CopyFile {/**
     * nio拷贝
     *@param inFile  源文件
     *@param outFile 目标文件
     *@return
     *@throws Exception*/publicstaticlong FileChannelCopy(String inFile,String outFile)throws Exception
    {long begin= System.currentTimeMillis();
        File in=new File(inFile);    
        File out=new File(outFile);
        FileInputStream fin=new FileInputStream(in);
        FileOutputStream fout=new FileOutputStream(out);
        FileChannel inc= fin.getChannel();
        FileChannel outc= fout.getChannel();int bufferLen=2097152;
        ByteBuffer bb= ByteBuffer.allocateDirect(bufferLen);while (true)
        {int ret= inc.read(bb);if (ret==-1)
            {      
                fin.close();
                fout.flush();
                fout.close();break;
            }
            bb.flip();
            outc.write(bb);
            bb.clear();
        }long end= System.currentTimeMillis();long runtime=0;if(end>  begin)
            runtime= end- begin;return runtime;

    }/**
     * io拷贝
     *@param inFile 源文件
     *@param outFile 目标文件
     *@return
     *@throws Exception*/publicstaticlong FileStraeamCopy(String inFile,String outFile)throws Exception
    {long begin= System.currentTimeMillis();
        
        File in=new File(inFile);
        File out=new File(outFile);
        FileInputStream fin=new FileInputStream(in);
        FileOutputStream fout=new FileOutputStream(out);int length=2097152;//2m内存byte[] buffer=newbyte[length];while(true)
        {int ins=fin.read(buffer);if(ins==-1)
            {
                fin.close();
                fout.flush();
                fout.close();break;
                
            }else
                fout.write(buffer,0,ins);
            
        }long end= System.currentTimeMillis();long runtime=0;if(end> begin)
            runtime= end- begin;return runtime;

    }staticpublicvoid main(String args[])throws Exception {
        String inFile="D:\\big4.pdf";//源文件        String outFile="D:\\big4copy1.pdf";//输出文件1        String outFile2="D:\\big4copy2.pdf";//输出文件2long runtime1,runtime2;
        runtime1= FileChannelCopy(inFile,outFile);
        runtime2= FileStraeamCopy(inFile,outFile2);
        System.out.println("FileChannelCopy running time:"+ runtime1);
        System.out.println("FileStraeamCopy running time:"+ runtime2);
        
        
        


    }
}
 某一次运行输出结果
Java code
FileChannelCopy running time:9969
FileStraeamCopy running time:6421


不可能 
nio 肯定更快

#21


lz可以test下

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

//从得到的耗时结果来看 nio效率高很多!!

public class TestFileChannel {
/*
public static void main(String args[])throws Exception{
  
ByteBuffer buff=ByteBuffer.allocate(1024);
FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileChannelOut.txt");
FileChannel in=fileIn.getChannel();
FileChannel out=fileOut.getChannel();
long l=System.currentTimeMillis();

while(in.read(buff)!=-1){
buff.flip();   //把极限设为位置  再把位置设为0
out.write(buff);
buff.clear(); //不改变极限  把位置设为0
}

System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//31ms
in.close();
out.close();
fileIn.close();
fileOut.close();
}  */

public static void main(String[] args)throws Exception{

FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileOutputStreamCopyTime.txt");
int i;
long l=System.currentTimeMillis();
while((i=fileIn.read())!=-1){
fileOut.write(i);
}
System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//516ms
fileIn.close();
fileOut.close();

}
    
}

#22


引用 21 楼 pywepe 的回复:
lz可以test下
Java codeimport java.io.*;import java.nio.*;import java.nio.channels.*;//从得到的耗时结果来看 nio效率高很多!!publicclass TestFileChannel {/*
    public static void main(String args[])throws Exception{
          
        ByteBuffer buff=ByteBuffer.allocate(1024);
        FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
    
我测试了一下,某一次结果:用nio复制一个100m的文件用时10469ms,使用io等了好久不出来,我就关了,申请的都是2m的内存,ByteBuffer buff=ByteBuffer.allocate(2097152);

#23


.

#24


引用 23 楼 lsd123 的回复:
.
就一个“.”?太深奥了

#25


#26


#27


引用 15 楼 paodan 的回复:
有个工具叫fastcopy,不知道是采用什么思想

好像有源代码: http://www.ipmsg.org/archive/FastCopy199r4src.zip

#28


用13楼代码,使用nio和io实验了一下,复制一个1.1G的文件夹,io用时13分钟,nio用时6分钟,其中该文件夹中有个子文件夹a,大小40M,故意设置其子文件夹有更多的层数,即子文件夹a下还下有多个孙文件夹,孙文件夹下也同样有更多的子文件夹,因此递归遍历复制时消耗了好多时间,测试了一下,单单复制这个40M的子文件夹,nio用了2分18秒,而io用了将近7分。因此改进一下遍历算法还能够提高复制效率

#29


引用 28 楼 paodan 的回复:
用13楼代码,使用nio和io实验了一下,复制一个1.1G的文件夹,io用时13分钟,nio用时6分钟,其中该文件夹中有个子文件夹a,大小40M,故意设置其子文件夹有更多的层数,即子文件夹a下还下有多个孙文件夹,孙文件夹下也同样有更多的子文件夹,因此递归遍历复制时消耗了好多时间,测试了一下,单单复制这个40M的子文件夹,nio用了2分18秒,而io用了将近7分。因此改进一下遍历算法还能够提高复制效¡­


这么长时间的连接,我估计早就 time out了。

#30


UP

#31


该回复于2009-10-12 13:30:03被版主删除

#32


学习学习了,这代码真有用,真的能复制东西了,呵呵!!

#33


其实NIO的主要提高源自共享内存,native code和java code能共享非jvm堆的内存,这是一个最显著的提高

#34


学习了, 下次自己试一下.

#35


mm

#36


百度搜一下bufferedStream 和 FileStream

#37


学习中~~

#38


学习!!

#39


用FileChannel的transferTo(long position, long count, WritableByteChannel target)方法试试

#40


引用 9 楼 lovecj6185 的回复:
用nio,比io效率好点

同意 假期写过用channel的复制功能 挺不错的 4G的多久就搞定了 nio里面

#41


  期待好的解决方法
    收藏了!~

#42


并不是线程开的越多,速度就越来。

#43


学习中、、、

#44


#45


google一下不就知道了

#46


...

#47


学习中。。。。。。

#48



学习了

#49


顶!

#50


mark,学习

#1


百度搜一下bufferedStream 和 FileStream

#2


内存文件映射

#3


学习中..

#4


学习中......

#5


用CLOB类型吧,单个变量可以存储4G,再加上BufferedStream.

#6


本地远程复制大文件啊,而且还是10G这么大的。你看看迅雷啊,他是多部分一起传的。java传输文件就是一般的文件操作啊,你可以模仿迅雷,开多个线程下载,每个线程记录下载部分的开始和结束索引,一起下到远程去。

至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。

#7


引用 6 楼 youjianbo_han_87 的回复:
至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。


楼上的,你见过用 java 开发的运行在 windows 上的桌面应用软件吗


快车这些东西之所以不用 java 做,最大的原因不是它的效率,而是它必须要安装JVM

快车只不过客户端的东西,服务端运行 java 是很常见的。楼主的这个问题用多线程来解决应该不存在效率问题。

#8


关注

#9


用nio,比io效率好点

#10


支持

#11


学习中。。。。。。

#12


多线程 + FTP

#13


我使用nio和io来测试一个100m的文件,虽然每次速度不同,但是都是io的比nio的快怎么回事

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class CopyFile {
/**
 * nio拷贝
 * @param inFile  源文件
 * @param outFile 目标文件
 * @return
 * @throws Exception
 */
public static long FileChannelCopy(String inFile,String outFile) throws Exception
{
long begin = System.currentTimeMillis();
File in = new File(inFile);
File out = new File(outFile);
FileInputStream fin = new FileInputStream(in);
FileOutputStream fout = new FileOutputStream(out);
FileChannel inc = fin.getChannel();
FileChannel outc = fout.getChannel();
int bufferLen = 2097152;
ByteBuffer bb = ByteBuffer.allocateDirect(bufferLen);
while (true)
{
int ret = inc.read(bb);
if (ret == -1)
{   
fin.close();
fout.flush();
fout.close();
break;
}
bb.flip();
outc.write(bb);
bb.clear();
}
long end = System.currentTimeMillis();
long runtime = 0;
if(end >  begin)
runtime = end - begin;
return runtime;

}
/**
 * io拷贝
 * @param inFile 源文件
 * @param outFile 目标文件
 * @return
 * @throws Exception
 */
public static long FileStraeamCopy(String inFile,String outFile) throws Exception
{
long begin = System.currentTimeMillis();

File in = new File(inFile);
File out = new File(outFile);
FileInputStream fin=new FileInputStream(in);
FileOutputStream fout=new FileOutputStream(out);

int length=2097152;//2m内存
byte[] buffer=new byte[length];

while(true)
{
int ins=fin.read(buffer);
if(ins==-1)
{
fin.close();
fout.flush();
fout.close();
break;

}else
fout.write(buffer,0,ins);

}
long end = System.currentTimeMillis();
long runtime = 0;
if(end > begin)
runtime = end - begin;
return runtime;

}
static public void main(String args[]) throws Exception {
String inFile = "D:\\big4.pdf"; //源文件
String outFile = "D:\\big4copy1.pdf"; //输出文件1
String outFile2 = "D:\\big4copy2.pdf"; //输出文件2
long runtime1,runtime2;
runtime1 = FileChannelCopy(inFile,outFile);
runtime2 = FileStraeamCopy(inFile,outFile2);
System.out.println("FileChannelCopy running time:" + runtime1);
System.out.println("FileStraeamCopy running time:" + runtime2);





}
}



某一次运行输出结果

FileChannelCopy running time:9969
FileStraeamCopy running time:6421

#14


有时FileChannelCopy 比FileChannelCopy 快

#15


有个工具叫fastcopy,不知道是采用什么思想

#16


#17


呵呵,有人吗

#18


引用 7 楼 hemowolf 的回复:
引用 6 楼 youjianbo_han_87 的回复:

 至于效率有多高,java我还真不敢说,要不迅雷,快车这种工具怎么不用java来开发。


 楼上的,你见过用 java 开发的运行在 windows 上的桌面应用软件吗


 快车这些东西之所以不用 java 做,最大的原因不是它的效率,而是它必须要安装JVM

 快车只不过客户端的东西,服务端运行 java 是很常见的。楼主的这个问题用多线程来解决应该不存在效率问题。


多线程下载,我同意,我也是这样说的,至于你说的 服务器端运行 java ,而 客户端不用 java 做是因为JVM的关系,我不同意。想这种远程IO操作,C++效率肯定要比java高。你用脚指头想想,并看下java io部分那个.dll是用什么实现的,你就知道了。

#19


引用楼主 paodan 的回复:
我希望从本地和远程复制文件,文件都很大,10G级的,如何快速的复制?看网上有人说使用管道到管道,这确实比其他的快,不知道fastcopy是怎样实现的,各位有什么想法?


使用nio

#20


引用 13 楼 paodan 的回复:
我使用nio和io来测试一个100m的文件,虽然每次速度不同,但是都是io的比nio的快怎么回事
Java codeimport java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;publicclass CopyFile {/**
     * nio拷贝
     *@param inFile  源文件
     *@param outFile 目标文件
     *@return
     *@throws Exception*/publicstaticlong FileChannelCopy(String inFile,String outFile)throws Exception
    {long begin= System.currentTimeMillis();
        File in=new File(inFile);    
        File out=new File(outFile);
        FileInputStream fin=new FileInputStream(in);
        FileOutputStream fout=new FileOutputStream(out);
        FileChannel inc= fin.getChannel();
        FileChannel outc= fout.getChannel();int bufferLen=2097152;
        ByteBuffer bb= ByteBuffer.allocateDirect(bufferLen);while (true)
        {int ret= inc.read(bb);if (ret==-1)
            {      
                fin.close();
                fout.flush();
                fout.close();break;
            }
            bb.flip();
            outc.write(bb);
            bb.clear();
        }long end= System.currentTimeMillis();long runtime=0;if(end>  begin)
            runtime= end- begin;return runtime;

    }/**
     * io拷贝
     *@param inFile 源文件
     *@param outFile 目标文件
     *@return
     *@throws Exception*/publicstaticlong FileStraeamCopy(String inFile,String outFile)throws Exception
    {long begin= System.currentTimeMillis();
        
        File in=new File(inFile);
        File out=new File(outFile);
        FileInputStream fin=new FileInputStream(in);
        FileOutputStream fout=new FileOutputStream(out);int length=2097152;//2m内存byte[] buffer=newbyte[length];while(true)
        {int ins=fin.read(buffer);if(ins==-1)
            {
                fin.close();
                fout.flush();
                fout.close();break;
                
            }else
                fout.write(buffer,0,ins);
            
        }long end= System.currentTimeMillis();long runtime=0;if(end> begin)
            runtime= end- begin;return runtime;

    }staticpublicvoid main(String args[])throws Exception {
        String inFile="D:\\big4.pdf";//源文件        String outFile="D:\\big4copy1.pdf";//输出文件1        String outFile2="D:\\big4copy2.pdf";//输出文件2long runtime1,runtime2;
        runtime1= FileChannelCopy(inFile,outFile);
        runtime2= FileStraeamCopy(inFile,outFile2);
        System.out.println("FileChannelCopy running time:"+ runtime1);
        System.out.println("FileStraeamCopy running time:"+ runtime2);
        
        
        


    }
}
 某一次运行输出结果
Java code
FileChannelCopy running time:9969
FileStraeamCopy running time:6421


不可能 
nio 肯定更快

#21


lz可以test下

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

//从得到的耗时结果来看 nio效率高很多!!

public class TestFileChannel {
/*
public static void main(String args[])throws Exception{
  
ByteBuffer buff=ByteBuffer.allocate(1024);
FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileChannelOut.txt");
FileChannel in=fileIn.getChannel();
FileChannel out=fileOut.getChannel();
long l=System.currentTimeMillis();

while(in.read(buff)!=-1){
buff.flip();   //把极限设为位置  再把位置设为0
out.write(buff);
buff.clear(); //不改变极限  把位置设为0
}

System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//31ms
in.close();
out.close();
fileIn.close();
fileOut.close();
}  */

public static void main(String[] args)throws Exception{

FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
FileOutputStream fileOut=new FileOutputStream("d:/JavaTests/TestFileOutputStreamCopyTime.txt");
int i;
long l=System.currentTimeMillis();
while((i=fileIn.read())!=-1){
fileOut.write(i);
}
System.out.println("Take time:"+(System.currentTimeMillis()-l)+"ms");//516ms
fileIn.close();
fileOut.close();

}
    
}

#22


引用 21 楼 pywepe 的回复:
lz可以test下
Java codeimport java.io.*;import java.nio.*;import java.nio.channels.*;//从得到的耗时结果来看 nio效率高很多!!publicclass TestFileChannel {/*
    public static void main(String args[])throws Exception{
          
        ByteBuffer buff=ByteBuffer.allocate(1024);
        FileInputStream fileIn=new FileInputStream("d:/JavaTests/TestFileChannel.txt");
    
我测试了一下,某一次结果:用nio复制一个100m的文件用时10469ms,使用io等了好久不出来,我就关了,申请的都是2m的内存,ByteBuffer buff=ByteBuffer.allocate(2097152);

#23


.

#24


引用 23 楼 lsd123 的回复:
.
就一个“.”?太深奥了

#25


#26


#27


引用 15 楼 paodan 的回复:
有个工具叫fastcopy,不知道是采用什么思想

好像有源代码: http://www.ipmsg.org/archive/FastCopy199r4src.zip

#28


用13楼代码,使用nio和io实验了一下,复制一个1.1G的文件夹,io用时13分钟,nio用时6分钟,其中该文件夹中有个子文件夹a,大小40M,故意设置其子文件夹有更多的层数,即子文件夹a下还下有多个孙文件夹,孙文件夹下也同样有更多的子文件夹,因此递归遍历复制时消耗了好多时间,测试了一下,单单复制这个40M的子文件夹,nio用了2分18秒,而io用了将近7分。因此改进一下遍历算法还能够提高复制效率

#29


引用 28 楼 paodan 的回复:
用13楼代码,使用nio和io实验了一下,复制一个1.1G的文件夹,io用时13分钟,nio用时6分钟,其中该文件夹中有个子文件夹a,大小40M,故意设置其子文件夹有更多的层数,即子文件夹a下还下有多个孙文件夹,孙文件夹下也同样有更多的子文件夹,因此递归遍历复制时消耗了好多时间,测试了一下,单单复制这个40M的子文件夹,nio用了2分18秒,而io用了将近7分。因此改进一下遍历算法还能够提高复制效¡­


这么长时间的连接,我估计早就 time out了。

#30


UP

#31


该回复于2009-10-12 13:30:03被版主删除

#32


学习学习了,这代码真有用,真的能复制东西了,呵呵!!

#33


其实NIO的主要提高源自共享内存,native code和java code能共享非jvm堆的内存,这是一个最显著的提高

#34


学习了, 下次自己试一下.

#35


mm

#36


百度搜一下bufferedStream 和 FileStream

#37


学习中~~

#38


学习!!

#39


用FileChannel的transferTo(long position, long count, WritableByteChannel target)方法试试

#40


引用 9 楼 lovecj6185 的回复:
用nio,比io效率好点

同意 假期写过用channel的复制功能 挺不错的 4G的多久就搞定了 nio里面

#41


  期待好的解决方法
    收藏了!~

#42


并不是线程开的越多,速度就越来。

#43


学习中、、、

#44


#45


google一下不就知道了

#46


...

#47


学习中。。。。。。

#48



学习了

#49


顶!

#50


mark,学习