2010-04-27 3 views
1

Хорошо, поэтому я работаю над проектом, в котором я использую Java-программу для инициирования соединения сокета между двумя классами (FileSender и FileReceiver). Моя основная идея заключалась в том, что FileSender будет выглядеть следующим образом:Создание и запись файла из FileOutputStream в Java

try { 
writer = new DataOutputStream(connect.getOutputStream()); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

//While we have bytes to send 
while(filein.available() >0){ 
//We write them out to our buffer 
writer.write(filein.read(outBuffer)); 
writer.flush(); 
} 
//Then close our filein 
filein.close(); 
//And then our socket; 
connect.close(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 

Конструктор содержит код, который проверяет, существует ли файл, и что сокет подключен, и так далее. Внутри моего FileReader это все равно:

input = recvSocket.accept(); 
BufferedReader br = new BufferedReader(new InputStreamReader(input.getInputStream())); 
FileOutputStream fOut= new FileOutputStream(filename); 
String line = br.readLine(); 
while(line != null){ 
    fOut.write(line.getBytes()); 
    fOut.flush(); 
    line = br.readLine(); 
} 
System.out.println("Before RECV close statements"); 
fOut.close(); 
input.close(); 
recvSocket.close(); 
System.out.println("After RECV clsoe statements"); 

Все внутри блока try-catch. Итак, что я пытаюсь сделать, это чтение в файле FileSender, преобразование в байты, отправка и очистка. FileReceiver, затем читает в байтах, записывает в файлOut, сбрасывает и продолжает ждать больше. Я обязательно закрою все, что открываю, так что ... здесь идет странная часть.

Когда я пытаюсь открыть созданный текстовый файл в Eclipse, он сообщает мне: «Произошла ошибка SWT ... рекомендуется выйти из рабочей среды ... см. .log для более подробной информации». Появится другое окно, в котором говорится: «Исключено исключение цикла обработки событий (не больше дескрипторов)». Однако, если я пытаюсь открыть присланный текстовый файл в Notepad2, я получаю

ThisIsASentTextfile 

который хорош (ну, минус то, что должно быть разрывы строк, но я работаю над этим ...) , Кто-нибудь знает, почему это происходит? И пока мы проверяем, как добавить разрывы строк?

(И это особенно плохой способ передачи файлов через Java, не получив некоторые другие библиотеки?)

Edit: Обновление: Я изменил код к следующему (FileReceiver), без изменения отправителя:

try { 
     input = recvSocket.accept(); 
     //InputStream br = new InputStream(input.getInputStream()); 
     FileWriter fOut= new FileWriter(filename); 
     //BufferedWriter out = new BufferedWriter(fOut); 
     //String line = br. 
     byte info = (byte) input.getInputStream().read(); 
     while((int)info != 0){ 
      fOut.write(info); 
      fOut.flush(); 
      info = (byte) input.getInputStream().read(); 
     } 
     fOut.flush(); 
     System.out.println("Before RECV close statements"); 
     fOut.close(); 
     //input.close(); 
     recvSocket.close(); 
     System.out.println("After RECV clsoe statements"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Это работает. Я получаю текстовый файл, который является правильным размером в байтах (до того, как я получил стандартный размер 4Kb) и имеет правильное форматирование. Я собираюсь попробовать его на следующем изображении и держать вас в курсе.

+1

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

ответ

1

С первого взгляда: Почему вы используете DataOutputStream? Полностью неадекватен для вашей цели. Просто используйте предоставленную OutputStream:

writer = connect.getOutputStream(); 

Кстати, это сомнительный практика называть «писатель», что переменная, Java делает четкое концептуальное различие между чтения/записи (полукокса ориентированных) и потоков (побайтно).

UPDATE: Еще одна плохая практика, которая требует неприятностей: вы смешиваете читателей/писателей (ориентированных на символы) и потоков (байт-ориентированных) без необходимости - и без специфического кодирования кодировки.

BufferedReader br = new BufferedReader(new InputStreamReader(input.getInputStream())); 

Вы должны использовать устройство для чтения, когда вы имеете дело с текстом (в кодировке ноу), использовать InputStream, если ваш просто дело с байтами.

+1

Привычка. Я использую DOS в остальной части моей программы (там, где они работают нормально), поэтому я просто использовал ее здесь. * идет искать различия ... чем больше вы знаете, верно? * – Althane

+0

@Althane, +1 для этого курсивом бит – Pops

+0

Итак, leonbloy, некоторые пояснения, которые мне нужны. Означает ли это, что в обоих классах (FileSender и FileReceiver) я должен использовать одни и те же устройства ввода/вывода (читатели/писатели или потоки?). Поскольку прямо сейчас я работаю с ним, кажется, что он будет читать содержимое текстового файла и распечатывать его в «копию» файла. Но я не уверен, как это изменится с потоками. Извините, я в замешательстве, и это тема, которую я никогда раньше не видел .. так что да .. – Althane

0

Что касается разрывов строк, BufferedReader.readLine() считывает данные, завершаемые строкой строки, но не возвращает строку. Поэтому, когда вы его отпишете, вы захотите написать фид строки. Кроме того, вы можете читать и писать байты, поэтому вы не ошибетесь, преобразуя символы строки или искажая двоичные файлы, которые включают значения ascii для перевода строки или возврата каретки.

1

Если вы хотите открыть отчеты после экспорта/сохранения, то это, безусловно, работать

 JasperReportBuilder report = DynamicReports.report();// a new report 
     report.setDataSource(dataSource); 

     String path = "d:\\PriceReport"+Math.random()+".pdf"; 
     File generatedfile= new File(path); 
     FileOutputStream fileOutStream = new FileOutputStream(generatedfile); 
     report.toPdf(fileOutStream); 
     fileOutStream.close(); 
     fileOutStream.flush(); 
     if(generatedfile.exists()){ 
      if(Desktop.isDesktopSupported()){ 
       Desktop.getDesktop().open(generatedfile); 
      }else{ 
       System.out.println("Not Supported by your desktop"); 
      } 
     }else{ 
      System.out.println("File does not Exists"); 
     } 

 Смежные вопросы

  • Нет связанных вопросов^_^