2014-12-16 3 views
1

Я пытаюсь написать файл csv. После выполнения кода ниже csv-файл по-прежнему пуст. Файл находится в папке .../webapp/resources/.Файл Csv пуст, когда я пишу содержимое

Это мой дао класс:

public class UserDaoImpl implements UserDao { 

private Resource cvsFile; 

public void setCvsFile(Resource cvsFile) { 
    this.cvsFile = cvsFile; 
} 

@Override 
public void createUser(User user) { 

    String userPropertiesAsString = user.getId() + "," + user.getName() 
      + "," + user.getSurname() +"\n";; 

    System.out.println(cvsFile.getFilename()); 

    FileWriter outputStream = null; 
    try { 
     outputStream = new FileWriter(cvsFile.getFile()); 
     outputStream.append(userPropertiesAsString); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      outputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public List<User> getAll() { 
    return null; 
} 
} 

Это часть beans.xml.

<bean id="userDao" class="pl.project.dao.UserDaoImpl" 
    p:cvsFile="/resources/users.cvs"/> 

Программа компилирует и не выбрасывает никаких исключений, но CSV-файл пуст.

+0

Причина его пустым связано с тем, что вы не закрыть поток. Кроме того, как @fge написал выше, используйте подход try-with-resources, чтобы избежать необходимости вручную закрывать streHam. Ссылка: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html –

ответ

0

попробуйте использовать outputStream.flush() в качестве заключительного заявления в первом блоке try.

+1

'close()' автоматически удаляет данные. – pbespechnyi

+1

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – svmrajesh

+0

@SVMRAJESH Это похоже на ответ. –

2

Если вы используете приложение в IDE, то /webapp/resources, используемое для запуска приложения, будет отличаться от /webapp/resources в вашей среде IDE. Попробуйте записать полный путь к файлу и проверить там.

0

Try с этим кодом, он будет по крайней мере сказать вам, где проблема лежит (Java 7+):

// Why doesn't this method throw an IOException? 
@Override 
public void createUser(final User user) 
{ 
    final String s = String.format("%s,%s,%s", 
     Objects.requireNonNull(user).getId(), 
     user.getName(), user.getSurname() 
    ); 

    // Note: supposes that .getFile() returns a File object 
    final Path path = csvFile.getFile().toPath().toAbsolutePath(); 

    final Path csv; 

    // Note: this supposes that the CSV is supposed to exist! 
    try { 
     csv = path.toRealPath(); 
    } catch (IOException e) { 
     throw new RuntimeException("cannot locate CSV " + path, e); 
    } 

    try (
     // Note: default is to TRUNCATE the destination. 
     // If you want to append, add StandardOpenOption.APPEND. 
     // See javadoc for more details. 
     final BufferedWriter writer = Files.newBufferedWriter(csv, 
      StandardCharsets.UTF_8); 
    ) { 
     writer.write(s); 
     writer.newLine(); 
     writer.flush(); 
    } catch (IOException e) { 
     throw new RuntimeException("write failure", e); 
    } 
} 
1

Я думаю, что вы смотрите на неправильном файле. Если вы укажете абсолютный путь /resources/users.cvs, то он, вероятно, не будет записан в папку по отношению к webapp. Вместо этого он будет записан в /resources/users.cvs

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

0

Когда я использовал полный путь:

<bean id="userDao" class="pl.project.dao.UserDaoImpl" 
    p:cvsFile="C:\\users.cvs"/> 

я получаю исключение, как это:

java.io.FileNotFoundException: ServletContext resource [/C:/users.cvs] cannot be resolved to URL because it does not exist