Преглед изворни кода

Don't use java.nio channel for file size determination

Java NIO has some problems (like files closing unexpectedly because the
thread was interrupted). To avoid those problems, don't use a NIO
channel to determine the size of a file, but rather ask the File itself.

We have to be prepared to handle wrong/outdated information in this case
too, as the inode of the File may change between opening and determining
file size.

Change-Id: Ic7aa6c3337480879efcce4a3058b548cd0e2cef0
tags/v2.0.0.201206130900-r
Markus Duft пре 12 година
родитељ
комит
2ba67bedae
1 измењених фајлова са 29 додато и 3 уклоњено
  1. 29
    3
      org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java

+ 29
- 3
org.eclipse.jgit/src/org/eclipse/jgit/util/IO.java Прегледај датотеку

@@ -137,12 +137,38 @@ public class IO {
throws FileNotFoundException, IOException {
final FileInputStream in = new FileInputStream(path);
try {
final long sz = in.getChannel().size();
long sz = Math.max(path.length(), 1);
if (sz > max)
throw new IOException(MessageFormat.format(
JGitText.get().fileIsTooLarge, path));
final byte[] buf = new byte[(int) sz];
IO.readFully(in, buf, 0);

byte[] buf = new byte[(int) sz];
int valid = 0;
for (;;) {
if (buf.length == valid) {
if (buf.length == max) {
int next = in.read();
if (next < 0)
break;

throw new IOException(MessageFormat.format(
JGitText.get().fileIsTooLarge, path));
}

byte[] nb = new byte[Math.min(buf.length * 2, max)];
System.arraycopy(buf, 0, nb, 0, valid);
buf = nb;
}
int n = in.read(buf, valid, buf.length - valid);
if (n < 0)
break;
valid += n;
}
if (valid < buf.length) {
byte[] nb = new byte[valid];
System.arraycopy(buf, 0, nb, 0, valid);
buf = nb;
}
return buf;
} finally {
try {

Loading…
Откажи
Сачувај