2013-02-12 1 views
0

Good Evening, сегодня я столкнулся с странной ситуацией, когда я использовал Print Writer при загрузке файлов на сервер, файл передан, и я попытался использовать FileOutPutStream вместо этого. решает проблемы, на мой вопрос, почему PrintWriter делает это странное поведение, вот код, который я использовал в загрузке файла и сохранить его на сервере:Print Writer повреждает файлы, когда он используется для загрузки файлов на сервер

public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{ 
int i; 
if(request instanceof MultipartWrapper){ 

String DestinationPath="C:\\"; 
MultipartWrapper request1=(MultipartWrapper)request; 
File f=request1.getFile("photo"); 
java.io.FileInputStream fis=new java.io.FileInputStream(f); 
//PrintWriter out=new PrintWriter(DestinationPath+f.getName()); causes the problem mentioned above 
java.io.FileOutputStream out=new java.io.FileOutputStream(DestinationPath+f.getName()); 
while((i=fis.read())!=-1){ 
out.write(i); 
} 
fis.close(); 
out.close(); 


} 

} 

ответ

3

Вы должны понимать разницу между писателей и OutputStreams. PrintWriter.write(int) пишет знак, в то время как FileOutputStream.write(int) пишет байт. вы случайно конвертировали байты в символы, что искажало ваш файл. в общем, когда вы просто копируете потоки, вы хотите придерживаться байтов.

1

PrintWriter создаст Writer, используя кодировку по умолчанию, в то время как FileOutputStream просто напишет необработанные байты. Если исходный контент и серверная часть используют одну и ту же кодировку, у вас не будет проблем с написанием байтов и их интерпретацией. Однако, когда вы используете PrintWriter, используется системная кодировка по умолчанию, что потенциально может сбрасывать ваши данные.

+0

независимо от используемой кодировки, чтения байтов и записи их в виде символов будут разбиты (за исключением, может быть, однобайтовой кодировки). – jtahlborn

+0

@jtahlborn Я не видел код на стороне сервера OP, но он может читать байты на стороне сервера, а – Miquel

+0

серверная сторона не имеет значения. если кодировка по умолчанию на стороне клиента является многобайтовой, данные будут обработаны до того, как она покинет клиент (или если однобайтовая кодировка изменяет определенные недопустимые символы). – jtahlborn

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

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