2016-01-15 6 views
0

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

Это то, что я хочу использовать:

ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream(nombreArchivo())); 

Intead это, что это единственный способ заставить его работать:

ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream("NameOfTheFileOrCompletePath.txt")); 

Но я всегда получаю сообщение о улове блока, когда Выполнение:

Когда я выполняю программу и пытается экспортировать данные, я получаю сообщение блока catch:

/*nombreArchivo is the String with the String returned by nombreArchivo. 

Было бы так же, как писать FileOutputStream (nombreArchivo())); */ try { ObjectOutputStream fpsalida = new ObjectOutputStream (новый FileOutputStream (nombreArchivo)); // SERIA EL ARG NOMBREARCHIVO

  fpsalida.writeObject(listaprod); //Hay que pasarle el return de la lista de prod.CREAR LA FUNC RETORNAPROD 
      System.out.println("\nExportado!\n"); 

     }catch (IOException e){ 
      System.out.println("No se ha podido exportar!\n"); 
     } 

    return; 
} 

Здесь часть метода nombreArchivo, что нас интересует:

System.out.println("\nWrite the name of the file you want: "); 
    archivoSalida += sc.nextLine() + ".txt"; 
    System.out.println("==============================================\n"); 

    //archivoSalida is defined as a String 
    return archivoSalida; 

} 

Спасибо.

+0

В чем проблема? Вы получаете исключение? Почему вы говорите, что это не работает? –

+1

Я отредактировал исходное сообщение с ошибкой, которую я получил –

ответ

1

Причина проблемы заключалась в том, что wasn't папка, созданная before.I думал метод, если существуют каталог это не распространяется, он создает его.

+0

FYI Javier, вы можете принять свой собственный ответ как правильный. :) –

0

Поскольку вы не получаете IOException при жестком кодировании имени файла, ваша проблема - это фактическое содержимое строки, возвращаемой nombreArchivo().

Для отладки специфики задачи, присвоить возвращенную строку в переменную, и либо зарегистрировать ее, или распечатать его на System.err, так что вы можете увидеть, что это на самом деле:

String fileName = nombreArchivo(); 
System.err.println("str = \"" + str + \""); 
ObjectOutputStream fpsalida = new ObjectOutputStream(new FileOutputStream(fileName)); 

Проблема будет очевидна, если вы посмотрите на поток ошибок. Вы должны также рассмотреть регистрацию или распечатка трассировки стека, за исключением в улове блока:

}catch (IOException e){ 
    e.printStackTrace(); 
    System.out.println("No se ha podido exportar!\n"); 
} 

Я подозреваю имя_файла либо пустым, пустая строка («»), или нарушает ограничения имен файлов ОС путем (например) содержащие недопустимые символы, например, строки.

Обновление: На основе вашего нижеследующего сообщения проблема в том, как FileOutputStream вычисляет путь к файлу. Попробуйте вместо этого, убедившись, что возвращаемая строка из nombreArchivo() только имя файла, без пути к каталогу:

String fileName = nombreArchivo(); 
String filePath = "file://" + System.getProperty("user.home"); //* You may need to verify that file:// isn't already included in the user's home directory 
URL url = new URL(filePath); 
File directory = new File(url.toURI()); 
ObjectOutputStream fpsalida = new ObjectOutputStream(new 
FileOutputStream(new File(directory, fileName))); 

Объяснение: Я узнал этот трюк из школы жестких ударов. Есть тонкости в том, как рассчитывается путь к файлу, и это один из способов, с помощью которого я работаю независимо от платформы.

+1

Вот что я сделал. Я назначаю возвращаемое значение в String, а затем передаю его методу между скобками. Также я пробовал то, что вы написали, и я получаю следующий путь в String: «/ Users/javserher/Desktop/tienda/Almacen/almacen .txt ", так что это правильно, и проблемы нет –

0

Функция nombreArchivo, кажется, возвращает неправильный путь, так как вместо этого вы кодируете путь.Я бы сказал, что ваш hardcoded путь тоже неверен, но вам нужно увидеть точные сообщения об ошибках, чтобы они могли сказать.

Я проверил этот пример ObjectOutputStream и, похоже, работает нормально.

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.util.Scanner; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class SandBox { 

    // get absolute path from relative 
    public static String getPath(String relativePath){ 
     return "/home/mack" + relativePath; 
    } 

    public static void main(String [] args){ 
     System.out.println("Write the name of the file you want: "); 
     //extract filename from user 
     String filename = new Scanner(System.in).nextLine() + ".txt"; 
     try { 
      ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(SandBox.getPath("/" + filename))); 
      //write integer to stream 
      stream.writeInt(12345); 
      stream.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(SandBox.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
+0

Мне нужно получить домашнюю папку пользователей, а затем, когда приложение должно находиться в определенной папке на рабочем столе, остальное будет одинаковым для каждого пользователя. Вот почему я используйте .getProperty («user.home»). Поэтому я не могу использовать определенную строку типа yours («/ home/mack») –