Ver código fonte

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 anos atrás
pai
commit
2ba67bedae
1 arquivos alterados com 29 adições e 3 exclusões
  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 Ver arquivo

@@ -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 {

Carregando…
Cancelar
Salvar