2013-08-01 1 views
0

Я не особенно разбираюсь в Java.JVM_Close возвращается -1 при закрытии PrintStream

Я преобразовываю массив байтов в строку (каждый байт с десятичным представлением), а затем записываю в файл. Вот минимальный пример, который воспроизводит эту проблему, что у меня (я оставил файл именования вещи в, только в случае, если это связано):

public class PacketWriter { 
    public static void writeBytes(byte[] in) { 
     Calendar cal = Calendar.getInstance(); 
     cal.getTime(); 
     SimpleDateFormat sdf = new SimpleDateFormat("ddmmyyHHmmss"); 
     PrintStream out = null; 
     File outFile = null; 
     try { 
      outFile = new File("recpacket"+sdf.format(cal.getTime())+".txt"); 
      outFile.createNewFile(); // also checks for existence of file alre ady 
      out = new PrintStream(new FileOutputStream(outFile,false)); 
      System.out.println(Arrays.toString(in)); 
      out.print(Arrays.toString(in)); 
      out.flush(); 
      System.out.println("Did the writing!"); 
     } catch (FileNotFoundException e) { 
       System.err.println("Packet output file not found."); 
     } catch (IOException e) { 
      System.err.println("Could not write packets (I/O error)."); 
     } 
     finally {     
      System.out.println("Closing..."); 
      if (out != null) out.close(); 
      System.out.println("Closed."); 
     } 
    } 
} 

Когда я называю PacketWriter.writeBytes(/* some nonempty byte array */) я получаю следующий результат:

... array ... 
Did the writing! 
Closing... 
JVM_Close returned -1 
Closed. 

записан на стандартный вывод.

Файл пуст по возвращении и не содержит строку, которую я хочу.

Что случилось?

+1

Проверки вы входные данные для функции writeBytes, потому что я пытался сделать это с вашим кодом он работает нормально, и данные были также написан в файле – Vijay

+0

Спасибо. Ввод в порядке - он успешно печатает массив в stdout. Интересно, что это ошибка разрешения файлов? Я запускаю JVM как root (по другим причинам), так может ли это быть частью проблемы? – Froskoy

ответ

2

Класс PrintStream имеет очень плохую отчетность об ошибках: похоже, что запись в файл не удалась, но невозможно понять почему; это может быть связано с тем, что в файловой системе, например, нет места. Попробуйте с помощью FileWriter вместо:

Writer out = null; 

     out = new FileWriter(outFile,false); 
     System.out.println(Arrays.toString(in)); 
     out.write(Arrays.toString(in)); 
     out.flush(); 
+0

Спасибо, теперь я действительно получаю полезную ошибку. Я получаю java.io.IOException: превышена дисковая квота, но это странно, так как у меня осталось много свободного места на диске. Однако это согласуется с тем, что это работает для небольших файлов, но не для больших файлов, поэтому я буду исследовать дальше. Благодаря! – Froskoy

+0

Вы можете использовать команду quota', чтобы определить, сколько дискового пространства вам разрешено использовать, а если вы sysadmin, отключите квоты на диске с помощью quotaoff. Точные детали зависят от того, какая у вас система Unix. – Joni