Para ler arquivos no Scala, há
Source.fromFile("file.txt").mkString
Existe uma maneira equivalente e concisa de escrever uma string no arquivo?
A maioria dos idiomas suporta algo assim. O meu favorito é o Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Eu gostaria de usar o código para programas que variam de uma única linha a uma pequena página de código. Ter que usar sua própria biblioteca não faz sentido aqui. Espero que uma linguagem moderna me permita escrever algo em um arquivo convenientemente.
Existem posts semelhantes a este, mas eles não respondem à minha pergunta exata ou estão focados nas versões mais antigas do Scala.
Por exemplo:
Respostas:
Uma linha concisa:
fonte
write()
,close
nunca será chamado e o arquivo não será fechado.PrintWriter
também usa a codificação padrão do sistema, o que é muito ruim para a portabilidade. E, finalmente, essa abordagem gera uma classe separada especificamente para essa linha (no entanto, dado que o Scala já gera toneladas de classes, mesmo para um código simples, isso dificilmente é uma desvantagem).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
, eu achonew java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
É estranho que ninguém tenha sugerido operações NIO.2 (disponíveis desde o Java 7):
Eu acho que essa é de longe a maneira mais simples, fácil e idiomática, e não precisa de nenhuma dependência do próprio Java.
fonte
reflect.io.File.writeAll(contents)
. Por quê? Três linhas quando você inclui as duas instruções de importação. Talvez o IDE faça isso automaticamente, mas se no REPL não for tão fácil.Files.write
também aceita umjava.lang.Iterable
como o segundo argumento, e podemos obter isso de um ScalaIterable
, ou seja, praticamente qualquer tipo de coleção, usando um conversor:import java.nio.file.{Files, Paths}; import scala.collection.JavaConverters.asJavaIterableConverter; val output = List("1", "2", "3"); Files.write(Paths.get("output.txt"), output.asJava)
Aqui está um alinhamento conciso usando o reflect.io.file, que funciona com o Scala 2.12:
Como alternativa, se você quiser usar as bibliotecas Java, poderá fazer isso:
fonte
Some
/foreach
combo é um pouco descolado, mas vem com o benefício de não tentar / pegar / finalmente.Some
/foreach
hack é exatamente por que muitas pessoas odeiam o Scala pelo código ilegível que ele faz com que os hackers produzam.scala.tootls.nsc.io.File
é um alias para oreflect.io.File
. API ainda interna, mas pelo menos um pouco menor.Se você gosta da sintaxe Groovy, pode usar o padrão de design do Pimp-My-Library para trazê-lo para o Scala:
Funcionará conforme o esperado:
fonte
fonte
#>
, o que!
faz?echo
ferramenta de linha de comando .Uma micro biblioteca que escrevi: https://github.com/pathikrit/better-files
ou
fonte
Você pode usar facilmente o Apache File Utils . Veja a função
writeStringToFile
. Usamos essa biblioteca em nossos projetos.fonte
Também se tem esse formato, que é conciso e a biblioteca subjacente é lindamente escrita (consulte o código-fonte):
fonte
Isso é conciso o suficiente, eu acho:
fonte
Você pode fazer isso com uma mistura de bibliotecas Java e Scala. Você terá controle total sobre a codificação de caracteres. Mas, infelizmente, os identificadores de arquivo não serão fechados corretamente.
fonte
Eu sei que não é uma linha, mas resolve os problemas de segurança, tanto quanto posso dizer;
Se você não se importou com o tratamento de exceções, pode escrever
fonte
ATUALIZAÇÃO: Desde então, criei uma solução mais eficaz sobre a qual elaborei aqui: https://stackoverflow.com/a/34277491/501113
Eu me pego trabalhando cada vez mais na Planilha Scala dentro do Scala IDE para Eclipse (e acredito que exista algo equivalente no IntelliJ IDEA). De qualquer forma, eu preciso ser capaz de criar uma única linha para produzir parte do conteúdo, pois obtenho o "Saída excede o limite de corte". mensagem se estou fazendo algo significativo, especialmente com as coleções Scala.
Eu vim com uma linha que eu insiro na parte superior de cada nova planilha Scala para simplificar isso (e, portanto, não preciso fazer todo o exercício de importação de biblioteca externa para uma necessidade muito simples). Se você é um defensor e percebe que são tecnicamente duas linhas, é apenas para torná-lo mais legível neste fórum. É uma única linha na minha planilha Scala.
E o uso é simplesmente:
Isso permite que eu forneça opcionalmente o nome do arquivo, caso eu queira ter arquivos adicionais além do padrão (que substitui completamente o arquivo toda vez que o método é chamado).
Portanto, o segundo uso é simplesmente:
Aproveitar!
fonte
Use a biblioteca de operações de amonite . A sintaxe é muito mínima, mas a amplitude da biblioteca é quase tão ampla quanto o que se esperaria de tentar uma tarefa dessas em uma linguagem de script de shell como o bash.
Na página a que vinculei, ele mostra inúmeras operações que podemos fazer com a biblioteca, mas para responder a essa pergunta, este é um exemplo de gravação em um arquivo
fonte
Com a magia do ponto e vírgula, você pode fazer o que quiser como uma linha.
fonte