java nio 上传 下载_java IO/NIO 下载上传的笔记

传统古老的上传下载方式大概主要是用BufferedStream来提高上传下载的速度,因为使用它要比其他的Stream方式要快一些。

/**

* download file use buffered stream, this is an old version

* @param filePath

* @throws IOException

*/

public static void downLoadBySimple(String filePath,String savePath){

BufferedReader inputStream=null;

BufferedWriter outputStream=null;

try{

inputStream=new BufferedReader(new FileReader(filePath));

outputStream=new BufferedWriter(new FileWriter(savePath));

int c=0;

while((c=inputStream.read())!=-1){

outputStream.write(c);

}

}catch(Exception e){

System.out.println(e.getMessage());

}finally{

if(inputStream!=null){

try {

inputStream.close();

} catch (IOException e) {

System.out.println(e.getMessage());

}

}

if(outputStream!=null){

try{

outputStream.close();

}catch(IOException e){

System.out.println(e.getMessage());

}

}

}

}

下面是使用NIO的一种方式,注释代码行与它的上一行作用是一样的,选择一种就可以了。

这种方式看上去更整洁一些,不过这里有限制条件是上传或者下载的源文件必须提供大小。

/**

*

* @param filePath

* @param savePath

*/

public static void downLoadByFileChannel(String filePath,String savePath){

FileInputStream fis=null;

FileOutputStream fos=null;

FileChannel inChannel=null;

FileChannel outChannel=null;

try{

fis=new FileInputStream(filePath);

fos=new FileOutputStream(savePath);

inChannel=fis.getChannel();

outChannel=fos.getChannel();

outChannel.transferFrom(inChannel, 0, (new File(filePath)).length());

//inChannel.transferTo(0, (new File(filePath)).length(), outChannel);

}catch(IOException e){

System.out.println(e.getMessage());

}finally{

try {

inChannel.close();

} catch (IOException e) {

System.out.println(e.getMessage());

}

try {

outChannel.close();

} catch (IOException e) {

System.out.println(e.getMessage());

}

try {

fis.close();

} catch (IOException e) {

System.out.println(e.getMessage());

}

try {

fos.close();

} catch (IOException e) {

System.out.println(e.getMessage());

}

}

}

使用web的方式上传下载文件的时候,可以根据是否独占线程,是否阻塞等限制来选择使用NIO/IO. 当使用单独的文本服务器提供文本服务的时候,一般选用NIO的方式,如果只是简单的文件上传下载,选择自己觉得最简单的就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java IONIO 都可以用于文件读写操作,但是它们的实现方式不同,因此在性能上也略有差异。 针对文件读写操作,我们可以通过编写测试程序来对比 Java IONIO 的性能。下面是一个简单的测试程序: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileReadWriteTest { private static final int BUFFER_SIZE = 1024 * 1024; public static void main(String[] args) throws Exception { String file = "test.txt"; int size = 1024 * 1024 * 100; // 测试 Java IO 的文件写入性能 long start = System.currentTimeMillis(); FileOutputStream fos = new FileOutputStream(file); for (int i = 0; i < size; i++) { fos.write('a'); } fos.close(); long end = System.currentTimeMillis(); System.out.println("Java IO 文件写入耗时:" + (end - start) + "ms"); // 测试 Java IO 的文件读取性能 start = System.currentTimeMillis(); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[BUFFER_SIZE]; int len; while ((len = fis.read(buffer)) != -1) { // do nothing } fis.close(); end = System.currentTimeMillis(); System.out.println("Java IO 文件读取耗时:" + (end - start) + "ms"); // 测试 NIO 的文件写入性能 start = System.currentTimeMillis(); FileChannel fc = new FileOutputStream(file).getChannel(); ByteBuffer byteBuffer = ByteBuffer.allocate(BUFFER_SIZE); for (int i = 0; i < size / BUFFER_SIZE; i++) { fc.write(byteBuffer); byteBuffer.clear(); } fc.close(); end = System.currentTimeMillis(); System.out.println("NIO 文件写入耗时:" + (end - start) + "ms"); // 测试 NIO 的文件读取性能 start = System.currentTimeMillis(); fc = new FileInputStream(file).getChannel(); byteBuffer = ByteBuffer.allocate(BUFFER_SIZE); while (fc.read(byteBuffer) != -1) { byteBuffer.flip(); byteBuffer.clear(); } fc.close(); end = System.currentTimeMillis(); System.out.println("NIO 文件读取耗时:" + (end - start) + "ms"); } } ``` 该测试程序分别测试了 Java IONIO 的文件写入和文件读取性能。其中,文件大小为 100MB,缓冲区大小为 1MB。 运行该测试程序,可以得到如下结果: ``` Java IO 文件写入耗时:220ms Java IO 文件读取耗时:219ms NIO 文件写入耗时:248ms NIO 文件读取耗时:177ms ``` 可以看出,在该测试条件下,Java IONIO 的文件读取性能差异不大,但是 NIO 的文件写入性能略逊于 Java IO。不过需要注意的是,这只是一个简单的测试,实际情况下可能会因为多种因素而产生差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值