开篇几个问题:
你所知道的IO的内容有哪些?假设给你一个任务快速复制大文件甚至是超大文件,你怎么应对?你用什么技术实现?在巨多无比及其变态的用户下载这个文件的时候,你怎么解决这个问题?
如果你还不能回答完整第一个问题,那么即使你学了N久,那你也还没有入门。假设你能回答第二个问题你基础还行,假设你能回答并且能实现第三个和第四个问题你就是已经比较强大了。
作为一个常用的IO技术---通道技术,很多人都不甚了解,尤其是那些初学者认为IO及其简单。
今天写这篇文章的目的很明确,就是很大家分享一种高层的IO技术---通道技术。
在大家看过的视频甚至很多书上对这个没有怎么涉及,网上的资料也不是很多,更不用说可用了,所以有必要在此和大家分享。
第一步:在网上找关于通道的文章(注意搜索的技巧否则你找不到这方面的答案,只能看到N多人问的问题),了解一下IO通道的基本原理。
第二步: 扎实你的面相对象思想。
第三步:且看以下源码:
package cn.ccsu.cooole.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
*
* @author CoolPrince
*
* 描述读取大的流文件这个类利用的是通道的技术
* 测试的时的赋值速度大概是6M/s;(这个根据具体的机器而定)
*
*/
public class ChannelCopy {
//设置缓冲区的大小
private static final int BSIZE = 1024;
/**
*
* @param fileFrom :要被复制文件全限名
* @param fileTo :要复制到目的地的文件全限名
* @return boolean 返回复制成功与否的信息
*
*/
@SuppressWarnings("finally")
public static boolean copyFile(String fileFrom, String fileTo) throws FileNotFoundException,IOException{
boolean flag = true;//初始化返回文件复制成功与否的信息标志
File file = new File(fileFrom); //源文件名
FileChannel in = null, out = null; //通道初始化
try {
in = new FileInputStream(file).getChannel(); //获取文件通道
out = new FileOutputStream(new File(fileTo)).getChannel(); // 得到输出流的通道
} catch (FileNotFoundException e) {
flag = false;//此时文件没有找到故将此设置为false
throw new FileNotFoundException(e.getMessage());
}
try {
ByteBuffer buff = ByteBuffer.allocate(BSIZE); //分配缓冲区的大小
while(in.read(buff) != -1){ //一直读到文件的结尾的地方
buff.flip();//将缓冲区的内容“倒出来”
out.write(buff);//将缓冲区的内容直接写到目标文件中
buff.clear();//清除缓冲区的内容
}
in.close();//关闭输入流
} catch (IOException e) {
flag = false;
throw new IOException(e);
}
return flag;
}
/**
* 第二种方式对copyFile进行重载 一适应用户传入文件时的情况
* 使其更为通用
* 具体解释参考上面的内容
* @param fileFrom :要被复制文件
* @param fileTo :要复制到目的地的文件
* @return boolean 返回复制成功与否的信息
*
*/
@SuppressWarnings("finally")
public static boolean copyFile(File fileFrom,File fileTo) throws FileNotFoundException,IOException{
boolean flag = true;
FileChannel fc = null, out = null;
try {
fc = new FileInputStream(fileFrom).getChannel();
out = new FileOutputStream(fileTo).getChannel();
} catch (FileNotFoundException e) {
flag = false;
throw new FileNotFoundException(e.getMessage());
}
ByteBuffer buff = ByteBuffer.allocate(BSIZE);
try {
while(fc.read(buff) != -1){
buff.flip();
out.write(buff);
buff.clear();
}
out.close();
fc.close();
} catch (IOException e1) {
flag = false;
throw new IOException(e1);
}
return flag;
}
/**
*
* 直接将一个通道和另一个通道进行相连
* 这里是从fileFrom到fileTo 利用tansferTo进行拷贝
* 被拷贝的是fileFrom,新的文件是fileTo
* @param fileFrom
* @param fileTo
* @return boolean
* @throws FileNotFoundException
* @throws IOException
*/
public static boolean tansferTocopyFile(File fileFrom,File fileTo) throws FileNotFoundException,IOException{
boolean flag = true;
FileChannel fc = null, out = null;
try {
fc = new FileInputStream(fileFrom).getChannel();
out = new FileOutputStream(fileTo).getChannel();
} catch (FileNotFoundException e) {
flag = false;
throw new FileNotFoundException(e.getMessage());
}
try {
fc.transferTo(0,fc.size(),out);
} catch (IOException e1) {
flag = false;
throw new IOException(e1);
}
return flag;
}
/**第二种方式对tansferTocopyFile进行重载 一适应用户传入文件时的情况
* 使其更为通用
* 直接将一个通道和另一个通道进行相连
* 这里是从fileTo到fileFrom 利用tansferFrom进行拷贝
* 被拷贝的是fileFrom,新的文件是fileTo
* 具体解释参考上面的内容
* @param fileFrom
* @param fileTo
* @return boolean
* @throws FileNotFoundException
* @throws IOException
*/
public static boolean tansferFromcopyFile(File fileFrom,File fileTo) throws FileNotFoundException,IOException{
boolean flag = true;
FileChannel fc = null, out = null;
try {
fc = new FileInputStream(fileFrom).getChannel();
out = new FileOutputStream(fileTo).getChannel();
} catch (FileNotFoundException e) {
flag = false;
throw new FileNotFoundException(e.getMessage());
}
try {
out.transferFrom(fc,0,fc.size());
} catch (IOException e1) {
flag = false;
throw new IOException(e1);
}
return flag;
}
}
第四步:自己将其实现 并写成多线程的 慢慢体会
第五步:看下下面的这篇文章(《浅析学习技术的误区》) http://hi.baidu.com/voyage_mh/blog/item/933f2407b6565c7303088161.html)或许对你有所帮助,无论是学习技术的还是做其他事的。限于博客的篇幅限制,以及时间紧张的关系我也就此驻笔,希望对你有所帮助。
<转>
分享到:
相关推荐
java 使用IO流实现文件的复制 java 使用IO流实现文件的复制
io操作
其实用IO包复制文件很简单,学过这个的一般都能理解,我上传主要是为了获得积分,供自己下载,希望大家能支持!!!!
IO流的文件复制,和整个文件夹的复制,并检查是否复制成功,如果复制成功返回true,否则返回false
通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;
标准io流复制文件
IO流文件的复制
io流复制文本文件图解,自己画的 可以下来看下有助于理解
java的IO流实现文件复制20190726.zip,使用的是字节流。
基于java的开发源码-二进制IO类与文件复制操作实例.zip 基于java的开发源码-二进制IO类与文件复制操作实例.zip 基于java的开发源码-二进制IO类与文件复制操作实例.zip 基于java的开发源码-二进制IO类与文件复制操作...
- 由第三方研发的工具类 - 要使用commons-io工具包,就需要先从第三方下载该工具包 - 在当前项目工程下,导入commons-io工具包(借鉴之前使用过的logback) ...commons-io可以简化IO复制文件的操作
Java实现文件复制,File文件读取,写入,IO流的读取写入
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络...阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。
java io file 文件复制,可直接运行。java io file 文件复制,可直接运行。
主要介绍了Java基于IO流读取文件的方法,涉及Java文件流操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
Java IO文件操作类与复制文件实例,有关文本编辑、FileWriter文件写入、FileReade文件读娶DataStream文件数据流、BufferedReader文件暂存器、FileViewer文件浏览器、复制文件Copy等方面的操作要领,仅供学习参考。
文件IO 文件操作 操作文件 标准IO和文件IO
瑞德泰科 RE100分布式总线IO GSD配置文件zip,瑞德泰科 RE100分布式总线IO GSD配置文件
通过IO流把文件传到前端并下载
java新IO文件流java新IO文件流java新IO文件流java新IO文件流java新IO文件流java新IO文件流java新IO文件流