Хорошо, поэтому я работаю над проектом, в котором я использую 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) и имеет правильное форматирование. Я собираюсь попробовать его на следующем изображении и держать вас в курсе.
Попробуйте открыть созданный текстовый файл в шестнадцатеричном редакторе, чтобы увидеть, если есть странные байт, которые могут быть вызывая проблемы для Eclipse. –