2016-02-27 11 views
1

У меня есть программа, которая открывает файлInputStream, читая его и записывая его в выходной поток.Java FileInputStream ограничен 65535 байтами

Я использую AIX.

Когда я бегу с терминала, у меня нет проблем. Однако, когда мое стороннее приложение запускает его, оно сталкивается с проблемой, когда FileInputStream только считывает первые 65535 байт из файла, а затем следующий вызов функции .read() возвращает -1, хотя файл немного больше, чем 65535 байт (это 68372 байта). Это приводит к усеченному выходному файлу.

Мой вопрос в том, что может вызвать это ограничение? Он не является внутренним пределом FileInputStream. Я подозреваю, что есть параметр java, который устанавливается где-то, но я не могу на всю жизнь определить, где. Возможно ли это как ограничение ОС?

Вот мой основной код:

OutputStream lOut = new FileOutputStream("/home/fileOut.txt"); 
FileInputStream fIn = new FileInputStream(new File("/home/fileIn.txt")); 
int ch; 
byte[] buf = new byte[65536]; 

while((ch = fIn.read(buf)) > 0) 
{ 
    lOut.write(buf); 
} 

fIn.close(); 
lOut.close(); 
+3

Трудно поверить. NB Ваш вызов для записи неверен. Это должно быть 'lOut.write (buf, 0 'ch);' Странный размер буфера тоже. Вы должны использовать силу два. – EJP

+0

Просто nit: это должно быть 'lOut.write (buf, 0, ch);' –

+0

И почему вы все-таки переопределили 'cp'? – chrylis

ответ

2

Оставляя в стороне, что ваш тестовый код сломан; см. комментарии @ EJP. (Да. Он >> является < < правильно. Доверься мне/его.)

Мой вопрос, что может привести это ограничение?

AFAIK, таких ограничений нет.

Он не является внутренним пределом FileInputStream.

Существует не один.

Я подозреваю, что есть опция java, которая устанавливается где-то, но я не могу на всю жизнь определить, где.

Нет опции JVM, которая могла бы вызвать такое поведение .

Возможно ли это как ограничение ОС?

В теории да. Или это может быть ошибка/ограничение в драйверах файловой системы, «ограничение ресурсов» (см. «Man ulimit») или ошибка носителя. На практике все эти объяснения маловероятны. Но вы можете подтвердить эту проблему, пытаясь прочитать ... или скопировать ... тот же файл, используя служебную программу ОС, которая, как известно, работает.


На самом деле, я подозреваю, что реальная проблема является ошибка в стороннем приложении вы пытаетесь использовать. Это может быть похоже на ошибку в вашем тестовом коде или что-то еще.


1 - Незначительное преувеличение. Если стороннее приложение сделало что-то действительно глупое (т. Е. Ловить и раздавить Throwable), то установка слишком большого размера кучи может теоретически «вызвать» это поведение. Если вы столкнулись с такой проблемой, смените поставщиков, как только сможете!

2 - Для того, чтобы быть понятным, «сторонняя заявка» - это приложение, написанное &, предоставленное третьей стороной. Вы/ваша организация являются первой стороной, ваш поставщик JVM является второй стороной ...

+0

Третье приложение - peopleoft, и все, что он делает, - это создание объекта Java и вызов моего класса. – zeusalmighty

+0

Итак, основываясь на вашей оценке, я вернулся и дважды проверял, и вы правы. Третье приложение не закрыло свой файл, прежде чем передать его мне. При закрытии файла их буфер, очевидно, покраснел, и я получил все данные. – zeusalmighty