Подключение через сокет - чтение XML-файла вставляет ненужные символы - PullRequest
2 голосов
/ 27 декабря 2011

В Android я пытаюсь передать XML-файл между двумя устройствами, открыв сокетное соединение между ними. Я могу успешно найти устройства, подключиться и открыть сокет.

Проблема в том, что при чтении XML-файла, отправляемого первым устройством, в нем обнаруживается много ненужных символов. Например, следующий XML-файл, отправленный устройством:

  <?xml version="1.0" encoding="ISO-8859-1" ?> 
  <note>
     <to>Tove</to> 
     <from>Jani</from> 
     <heading>Reminder</heading> 
     <body>Don't forget me this weekend!</body> 
  </note>

принимается другим устройством следующим образом:

  ¬íwµ<?xml version="1.0" encoding="ISO-8859-1" ?> 
  <note>
     <to>Tove</to> 
     <from>Jani</from> 
     <heading>Reminder</heading> 
     <body>Don't forget me this weekend!</body> 
  </note>

Символы барахла, видимые в этом XML-файле, вставляются в несколько точек для большего XML-файла. Вот код для чтения XML-файла на клиенте:

 InputStream tmpIn = null;
 FileOutputStream fos = null;
 BufferedOutputStream bos = null;
 byte[] buffer = null;
 int current = 0;
 try { 
     tmpIn = socket.getInputStream(); 

        // create a new file
     File newTempFile = new File("/mnt/sdcard/test.xml");
        if(!newTempFile.exists()) {
        newTempFile.createNewFile();
     }
        else {
        newTempFile.delete();
        newTempFile.createNewFile();
     }
    fos = new FileOutputStream(newTempFile);
        try {
        byte[] buffer1 = new byte[2048]; 
        int length; 
        while ((length = tmpIn.read(buffer1))>0){
                fos.write(buffer1, 0, length); 
        } 

       fos.flush();
       fos.close();
       tmpIn.close();

     } 
     catch (IOException e) {
       Log.d("Sync", "IOException: "+ e);
     }
}
catch (Exception e) {
   Log.d("Sync", "Exception: "+ e);
}

А вот код для записи файла XML:

File file = new File ("/mnt/sdcard/sample.xml");
byte[] fileBytes = new byte[(int) file.length()];

try {
    BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID); 
    socket.connect(); 
    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 

    FileInputStream fis = new FileInputStream(file);
    fis.read(fileBytes);

    // Send the file 
    out.write(fileBytes); 
    out.flush();  
    out.close();
 }
 catch (Exception e) {
       Log.d("Sync", "Exception in writing file: "+ e);
 }

Я твердо верю, что произошла ошибка при чтении потока ввода сокета в клинете и создании из него XML-файла. Не уверен, что это? Я пишу какие-либо управляющие символы в файл XML. Мое убеждение также подтверждается тем фактом, что подобные ненужные символы находятся в большем XML-файле в нескольких местах (возможно, один набор для записи одного буфера?)

1 Ответ

5 голосов
/ 27 декабря 2011

Вы используете ObjectOutputStream при записи, но не при чтении.

ObjectOutputStream предназначен для сериализации сериализуемых объектов, а также примитивов, поэтому, когда вы пишете байтовый массив, он включает информацию о тегах типов.

Вам либо нужно изменить код клиента, чтобы использовать ObjectInputStream, либо просто использовать "обычный" OutputStream при записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...