Java中的IO的性能优化
在使用IO的时候注意一下细节,能使性能得到很大的优化.
首先读写大文件,使用Buffer是肯定的了,使用方法,有下边两个
1
方法一:
2
public
static
void
test1(String fileName)
{
3
long
start
=
System.currentTimeMillis();
4
try
{
5
FileInputStream fis
=
new
FileInputStream(fileName);
6
BufferedReader br
=
new
BufferedReader(
new
InputStreamReader(fis) );
7
StringBuffer sb
=
new
StringBuffer();
8
String str;
9
while
((str
=
br.readLine())
!=
null
)
{
10
sb.append(str);
11
}
12
}
catch
(IOException e)
{
13
}
14
long
end
=
System.currentTimeMillis();
15
long
time
=
end
-
start;
16
System.out.println(time);
17
}
18
方法二:
19
public
static
void
test2(String fileName)
{
20
long
start
=
System.currentTimeMillis();
21
try
{
22
FileInputStream fis
=
new
FileInputStream(fileName);
23
byte
buf[]
=
new
byte
[
8192
];
24
int
n;
25
StringBuffer sb
=
new
StringBuffer();
26
while
((n
=
fis.read(buf))
!=
-
1
)
{
27
sb.append(buf);
28
}
29
fis.close();
30
}
catch
(IOException e)
{
31
}
32
long
end
=
System.currentTimeMillis();
33
long
time
=
end
-
start;
34
System.out.println(time);
35
}
方法一:2

public
static
void
test1(String fileName)
{3
long
start
=
System.currentTimeMillis();4

try
{5
FileInputStream fis
=
new
FileInputStream(fileName);6
BufferedReader br
=
new
BufferedReader(
new
InputStreamReader(fis) );7
StringBuffer sb
=
new
StringBuffer();8
String str;9

while
((str
=
br.readLine())
!=
null
)
{10
sb.append(str);11
}
12

}
catch
(IOException e)
{13
}
14
long
end
=
System.currentTimeMillis();15
long
time
=
end
-
start;16
System.out.println(time);17
}
18
方法二:19

public
static
void
test2(String fileName)
{20
long
start
=
System.currentTimeMillis();21

try
{22
FileInputStream fis
=
new
FileInputStream(fileName);23
byte
buf[]
=
new
byte
[
8192
];24
int
n;25
StringBuffer sb
=
new
StringBuffer();26

while
((n
=
fis.read(buf))
!=
-
1
)
{27
sb.append(buf);28
}
29
fis.close();30

}
catch
(IOException e)
{31
}
32
long
end
=
System.currentTimeMillis();33
long
time
=
end
-
start;34
System.out.println(time);35
}
方法一1937ms
方法二47ms
测试结果相差大概50倍左有,很大。
而我平时的习惯是方法一。问题主要出在readLine()上。
如果只是简单的文件拷贝,下边两种方法也不错
1

public
static
void
test3()
{
2
String cmd
=
"
copy d:/out1.txt out2.txt
"
;
3
try
{
4
Runtime.getRuntime().exec(cmd);
5
}
catch
(Exception e)
{
6
e.printStackTrace();
7
}
8
}
9
public
static
void
test4()
{
10
String inFileName
=
"
d:/out1.txt
"
;
11
String outFileName
=
"
d:/out2.txt
"
;
12
long
start
=
System.currentTimeMillis();
13
try
{
14
File inFile
=
new
File(inFileName);
15
File outFile
=
new
File(outFileName);
16
RandomAccessFile inRaf
=
new
RandomAccessFile(inFile,
"
r
"
);
17
RandomAccessFile outRaf
=
new
RandomAccessFile(outFile,
"
rw
"
);
18
FileChannel infc
=
inRaf.getChannel();
19
FileChannel outfc
=
outRaf.getChannel();
20
infc.transferTo(
0
, inFile.length(),outfc );
21
infc.close();
22
outfc.close();
23
}
catch
(Exception e)
{
24
e.printStackTrace();
25
}
26
long
end
=
System.currentTimeMillis();
27
long
time
=
end
-
start;
28
System.out.println(time);
29
}

public
static
void
test3()
{2
String cmd
=
"
copy d:/out1.txt out2.txt
"
;3

try
{4
Runtime.getRuntime().exec(cmd);5

}
catch
(Exception e)
{6
e.printStackTrace();7
}
8
}
9

public
static
void
test4()
{10
String inFileName
=
"
d:/out1.txt
"
;11
String outFileName
=
"
d:/out2.txt
"
;12
long
start
=
System.currentTimeMillis();13

try
{14
File inFile
=
new
File(inFileName);15
File outFile
=
new
File(outFileName); 16
RandomAccessFile inRaf
=
new
RandomAccessFile(inFile,
"
r
"
);17
RandomAccessFile outRaf
=
new
RandomAccessFile(outFile,
"
rw
"
); 18
FileChannel infc
=
inRaf.getChannel();19
FileChannel outfc
=
outRaf.getChannel(); 20
infc.transferTo(
0
, inFile.length(),outfc ); 21
infc.close();22
outfc.close();23

}
catch
(Exception e)
{24
e.printStackTrace();25
}
26
long
end
=
System.currentTimeMillis();27
long
time
=
end
-
start;28
System.out.println(time);29
}
本文介绍两种Java中优化大文件读写的实现方法,并通过实例对比它们的性能差异。同时提供了利用系统命令和FileChannel进行文件复制的高效替代方案。
3482

被折叠的 条评论
为什么被折叠?



