像我这样写效率会很低,请问有其他方法能以读取字节的方式达到这种复制文件的效果而且效率还很快的做法吗?

yyxgs 2018-05-23 04:18:55
	public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
StringBuffer path = Conver.nsb("c:/下载/1.mp3");
ArrayList<Integer> data = ReadData.readByte(path);

long end = System.currentTimeMillis();
System.out.println("读取结束! 用时: " + (end - start));

start = System.currentTimeMillis();
WriteData.writeByte(Conver.nsb("c:/下载/2.mp3"), data);
end = System.currentTimeMillis();
System.out.println("写入结束! 用时: " + (end - start));
}




	public static ArrayList<Integer> readByte(StringBuffer path) {
if (path == null || path.length() == 0) {
return null;
}

ArrayList<Integer> data = null;
LinkedList<Integer> tempData = new LinkedList<Integer>();

byte[] buff = new byte[1024];

FileInputStream fis = null;
try {
fis = new FileInputStream(path.toString());
}
catch (IOException e) {
e.printStackTrace();
}

for (int i = 0;;i += 1024) {
try {
if (fis.read(buff) == -1) {
break;
}
tempData.addAll(Conver.byteArrayToArrayInteger(buff));
}
catch (IOException e) {
e.printStackTrace();
}
}

try {
fis.close();
}
catch (IOException e) {
e.printStackTrace();
}

data = new ArrayList<Integer>(tempData);

return data;
}


	public static void writeByte(StringBuffer path, ArrayList<Integer> data) {
if (path == null || path.length() == 0) {
return;
}

if (data == null || data.size() == 0) {
return;
}

FileOutputStream fos = null;
try {
fos = new FileOutputStream(path.toString(), true);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}

for (int i = 0;i < data.size();++i) {
try {
fos.write(data.get(i));
}
catch (IOException e) {
e.printStackTrace();
}
}

// 关闭文件
try {
fos.close();
}
catch (IOException e) {
e.printStackTrace();
}
}


	public static ArrayList<Integer> byteArrayToArrayInteger(byte[] byteArray) {
if (byteArray == null || byteArray.length == 0) {
return null;
}

LinkedList<Integer> temp = new LinkedList<Integer>(); // 使用 LinkedList 添加数据

int number = 0;
for (int i = 0;i < byteArray.length;++i) {
number = byteArray[i];
temp.add(number);
}

// 将 LinkedList 转换为 ArrayList
ArrayList<Integer> data = new ArrayList<Integer>(temp);
return data;
}
...全文
696 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lindafengmiao 2018-05-24
  • 打赏
  • 举报
回复
读文件自然用RandomAccessFile
东咀铁观音 2018-05-24
  • 打赏
  • 举报
回复
因为你那种写法是每个byte都写一次,你可以用个数组存一下,例如1024字节写一次,就会快了
yyxgs 2018-05-24
  • 打赏
  • 举报
回复
引用 14 楼 lyx7610460 的回复:
因为你那种写法是每个byte都写一次,你可以用个数组存一下,例如1024字节写一次,就会快了
正解!我刚测试了下,同样的数据,一个用时14秒,一个用时0.5秒,差别太大了!
yyxgs 2018-05-24
  • 打赏
  • 举报
回复
引用 12 楼 yjsl__ 的回复:
原始文件多大?太小的话,看不出来的
3M
yjsl__ 2018-05-24
  • 打赏
  • 举报
回复
原始文件多大?太小的话,看不出来的
maradona1984 2018-05-24
  • 打赏
  • 举报
回复
读文件自然用RandomAccessFile
yyxgs 2018-05-23
  • 打赏
  • 举报
回复
引用 9 楼 yjsl__ 的回复:
1024调大,用缓冲流


用了缓冲流,然而1024调小速度却变快了。
4096:


5:


这是为什么?
yjsl__ 2018-05-23
  • 打赏
  • 举报
回复
1024调大,用缓冲流
yyxgs 2018-05-23
  • 打赏
  • 举报
回复
引用 5 楼 sinat_37774909 的回复:
[quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 sinat_37774909 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 sinat_37774909 的回复:]

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写
哦哦,不过我不是真的要实现复制文件,其实我就学一些基础,怎么以字节读取文件,我这种写法好慢。[/quote] 你的写法蛮奇怪的,直接上流从文件读写不就完了吗,感觉你写的特别复杂[/quote] 我从百度查的是这么写的,请问我该怎么写才能从流读取文件呢?[/quote] 这是我在网上找的,比你的肯定简单多了
File f = new File("文件路径");
File f2 = new File("文件路径");
InsputStream is = new FileInputStream(f);
OutputStream os = new FileOutPutStream(f2);
try{
        byte[] byte = new byte[4096];
        int n = 0;
        while(-1!=(n=is.read(byte))){
                os.write(byte, 0, n);
        }
        is.close();
        os.close();
}catch(Exception e){
}
[/quote] 边读边写当然很简单,我要将读出来的字节数据保存在变量里,然后给另一个方法写进去。
竹子_bamboo 2018-05-23
  • 打赏
  • 举报
回复
https://blog.csdn.net/kern_/article/details/39397949 这个也是网上搜的,你的那种写法我还真是第一天见
yyxgs 2018-05-23
  • 打赏
  • 举报
回复
引用 5 楼 sinat_37774909 的回复:
[quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 sinat_37774909 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 sinat_37774909 的回复:]

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写
哦哦,不过我不是真的要实现复制文件,其实我就学一些基础,怎么以字节读取文件,我这种写法好慢。[/quote] 你的写法蛮奇怪的,直接上流从文件读写不就完了吗,感觉你写的特别复杂[/quote] 我从百度查的是这么写的,请问我该怎么写才能从流读取文件呢?[/quote] 这是我在网上找的,比你的肯定简单多了
File f = new File("文件路径");
File f2 = new File("文件路径");
InsputStream is = new FileInputStream(f);
OutputStream os = new FileOutPutStream(f2);
try{
        byte[] byte = new byte[4096];
        int n = 0;
        while(-1!=(n=is.read(byte))){
                os.write(byte, 0, n);
        }
        is.close();
        os.close();
}catch(Exception e){
}
[/quote] 不能混在一起,我要写一个方法专门用来读,另一个专门用来写
竹子_bamboo 2018-05-23
  • 打赏
  • 举报
回复
引用 4 楼 yyxgs 的回复:
[quote=引用 3 楼 sinat_37774909 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 sinat_37774909 的回复:]

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写
哦哦,不过我不是真的要实现复制文件,其实我就学一些基础,怎么以字节读取文件,我这种写法好慢。[/quote] 你的写法蛮奇怪的,直接上流从文件读写不就完了吗,感觉你写的特别复杂[/quote] 我从百度查的是这么写的,请问我该怎么写才能从流读取文件呢?[/quote] 这是我在网上找的,比你的肯定简单多了
File f = new File("文件路径");
File f2 = new File("文件路径");
InsputStream is = new FileInputStream(f);
OutputStream os = new FileOutPutStream(f2);
try{
        byte[] byte = new byte[4096];
        int n = 0;
        while(-1!=(n=is.read(byte))){
                os.write(byte, 0, n);
        }
        is.close();
        os.close();
}catch(Exception e){
}
yyxgs 2018-05-23
  • 打赏
  • 举报
回复
引用 3 楼 sinat_37774909 的回复:
[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 sinat_37774909 的回复:]

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写
哦哦,不过我不是真的要实现复制文件,其实我就学一些基础,怎么以字节读取文件,我这种写法好慢。[/quote] 你的写法蛮奇怪的,直接上流从文件读写不就完了吗,感觉你写的特别复杂[/quote] 我从百度查的是这么写的,请问我该怎么写才能从流读取文件呢?
竹子_bamboo 2018-05-23
  • 打赏
  • 举报
回复
引用 2 楼 yyxgs 的回复:
[quote=引用 1 楼 sinat_37774909 的回复:]

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写
哦哦,不过我不是真的要实现复制文件,其实我就学一些基础,怎么以字节读取文件,我这种写法好慢。[/quote] 你的写法蛮奇怪的,直接上流从文件读写不就完了吗,感觉你写的特别复杂
yyxgs 2018-05-23
  • 打赏
  • 举报
回复
引用 1 楼 sinat_37774909 的回复:

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写
哦哦,不过我不是真的要实现复制文件,其实我就学一些基础,怎么以字节读取文件,我这种写法好慢。
竹子_bamboo 2018-05-23
  • 打赏
  • 举报
回复

//org.apache.commons.io
FileUtils.copyFile(new File("c:/下载/1.mp3"),new File("c:/下载/2.mp3"));
这样最快,直接用工具,不用自己写

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧