2010-11-24 30 views
39

Creé una pequeña función que simplemente escribe texto en un archivo, pero tengo problemas para escribir cada información en una nueva línea. ¿Alguien puede explicar por qué pone todo en la misma línea?Groovy write to file (newline)

Aquí es mi función:

public void writeToFile(def directory, def fileName, def extension, def infoList) { 
    File file = new File("$directory/$fileName$extension") 

    infoList.each { 
     file << ("${it}\n") 
    } 
} 

El código simple que estoy probando con algo como esto:

def directory = 'C:/' 
def folderName = 'testFolder' 
def c 

def txtFileInfo = [] 

String a = "Today is a new day" 
String b = "Tomorrow is the future" 
String d = "Yesterday is the past" 

txtFileInfo << a 
txtFileInfo << b 
txtFileInfo << d 

c = createFolder(directory, folderName) //this simply creates a folder to drop the txt file in 

writeToFile(c, "garbage", ".txt", txtFileInfo) 

Lo anterior crea un archivo de texto en la carpeta y el contenido de el archivo de texto se ve así:

Today is a new dayTomorrow is the futureYesterday is the past 

Como puede ver, el texto está agrupado en conjunto o f separado en una nueva línea por texto. ¿Supongo que tiene algo que ver con la forma en que lo estoy agregando a mi lista?

Respuesta

28

se ve a mí, como si estuvieras trabajando en las ventanas en cuyo caso un carácter de nueva línea en no simplemente \n sino \r\n

Siempre se puede obtener el carácter correcto nueva línea a través System.getProperty("line.separator") por ejemplo.

+0

Hah, es correcto, no puedo creer que me haya olvidado de eso (ya que lo he tratado antes). Puedo cambiar a line.separator ya que eso parece más universal. Gracias mfloryan – StartingGroovy

+0

Eso es casi exactamente lo que 'java.io.PrintWriter' hace para obtener la cadena del separador de líneas, por lo que es probablemente la mejor manera de hacerlo. –

7

podría ser más limpio para usar PrintStream y es el método: println Sólo asegúrese de cerrar el escritor cuando el hecho

+0

+1 Tienes razón: http://stackoverflow.com/questions/4272330/groovy-write-to-file-newline/4275240#4275240 –

71

Como @Steven señala, una mejor manera sería:

public void writeToFile(def directory, def fileName, def extension, def infoList) { 
    new File("$directory/$fileName$extension").withWriter { out -> 
    infoList.each { 
     out.println it 
    } 
    } 
} 

Como esto maneja el separador de línea para usted y maneja el cierre del escritor también

(y no abre y cierra el archivo cada vez que escribe una línea, lo que podría ser lento en su versión original)

+0

@eskatos edición revertida, ya que la cadena coincide con esa en la pregunta (el ' .'se está pasando en' extensión') –

+0

Oh mi mal, no vi el punto en la pregunta, lo siento por el ruido. Bastante extraño :) – eskatos

+0

Sin mencionar que este código evita la variable temporal, que probablemente lo hace más eficiente y definitivamente lo hace más idiomáticamente Groovy :) –

7

Me encontré con esta pregunta e inspirado por otros colaboradores. Necesito anexar algo de contenido a un archivo una vez por línea. Aquí esta lo que hice.

class Doh { 
    def ln = System.getProperty('line.separator') 
    File file //assume it's initialized 

    void append(String content) { 
     file << "$content$ln" 
    } 
} 

Bastante limpio creo :)

+1

Genial, pero eso abrirá el archivo, se agregará a él y luego lo cerrará de nuevo cada vez. Sería más rápido (según su caso de uso) mantener un escritor durante toda la vida de Doh –

+0

true. debería usar file.withWriter en su lugar. – Patrick

+1

Y como referencia, he tenido que arreglar una tonelada de scripts que usan esta sintaxis 'file <<" whatever "' porque son muy lentos, más aún si el resultado es más de NFS. Como, en el caso extremo, he visto guiones que pasaron de 18 horas a media hora simplemente arreglando esto. Una que arreglé hace poco pasó de 4h20m a 5m. –

1

@Comment ID: 14. Es para mí en lugar más fácil de escribir:

out.append it 

en lugar de

out.println it 

println hice en mi máquina de escribir solamente el primer archivo de la ArrayList, con append consigo toda la lista escrita en el archivo .

Amablemente de todos modos para la solución rápida y sucia.