Создание и запись файла из FileOutputStream в Java - PullRequest
1 голос
/ 27 апреля 2010

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

  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 без получения других библиотек?)

Редактировать: обновление: я изменил свой код на следующий (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();
    }

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

Ответы [ 3 ]

1 голос
/ 14 апреля 2016

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

       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");
         }
1 голос
/ 27 апреля 2010

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

writer = connect.getOutputStream();

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

ОБНОВЛЕНИЕ: еще одна плохая практика, которая требует проблем: вы без необходимости смешиваете устройства чтения / записи (ориентированные на символы) и потоки (ориентированные на байты) - без указания кодировки charset.

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

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

0 голосов
/ 27 апреля 2010

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

...