English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ruby oferece um conjunto completo de I/O métodos relacionados são implementados no módulo Kernel. Todos os I/O método deriva da classe IO.
classe IO 提供了一整套基础的方法,例如 read、write、gets、puts、readline、getc 和 printf.
Este capítulo explicará todos os I básicos disponíveis no Ruby/Funções. Para mais informações sobre as funções, consulte o Ruby IO classe.
Nos capítulos anteriores, você atribuiu valores às variáveis e usou puts A instrução imprime a saída.
puts A instrução indica ao programa exibir o valor armazenado na variável. Isso adicionará uma nova linha no final de cada linha.
#!/usr/bin/ruby val1 = "This is variable one" val2 = "This is variable two" puts val1 puts val2
Os resultados de execução dos exemplos acima são:
This is variable one This is variable two
gets A instrução pode ser usada para obter entrada do usuário da tela padrão STDIN.
O código a seguir demonstra como usar a instrução gets. O código solicitará ao usuário para inserir um valor, que será armazenado na variável val e, finalmente, será impresso no STDOUT.
#!/usr/bin/ruby puts "Enter a value :" val = gets puts val
Os resultados de execução dos exemplos acima são:
Enter a value : This is entered value This is entered value
é diferente de puts A instruçãoputs A instrução output a string inteira para a tela, enquanto putc A instrução pode ser usada para output caracter por caracter.
A saída do código a seguir é apenas o caractere H:
#!/usr/bin/ruby str="Hello Ruby!" putc str
Os resultados de execução dos exemplos acima são:
H
print instrução puts é semelhante. A única diferença está na puts A instrução pula para a próxima linha após concluir o conteúdo de saída, enquanto a instrução print Quando a instrução print é executada, o cursor é posicionado na mesma linha.
#!/usr/bin/ruby print "Hello World" print "Good Morning"
Os resultados de execução dos exemplos acima são:
Hello WorldGood Morning
Até agora, você já leu e escreveu na entrada e saída padrão. Agora, vamos ver como operar arquivos de dados reais.
您可以使用 File.new Método para criar um File Objeto usado para leitura, escrita ou leitura/escrita, as permissões de leitura/escrita dependem do parâmetro mode. Finalmente, você pode usar File.close Método para fechar o arquivo.
aFile = File.new("filename", "mode") # ... Tratar o arquivo aFile.close
您可以使用 File.open O método cria um novo objeto file e atribui esse objeto file ao arquivo. Mas,File.open 和 File.new Existem algumas diferenças entre os métodos. A diferença é File.open Método pode ser associado a um bloco, enquanto File.new Método não pode.
File.open("filename", "mode") do |aFile| # ... process the file end
下表列出了打开文件的不同模式:
模式 | descrição |
---|---|
r | 只读模式。文件指针被放置在文件的开头。这是默认模式。 |
r+ | 读写模式。文件指针被放置在文件的开头。 |
w | 只写模式。如果文件存在,则重写文件。如果文件不存在,则创建一个新文件用于写入。 |
w+ | 读写模式。如果文件存在,则重写已存在的文件。如果文件不存在,则创建一个新文件用于读写。 |
a | 只写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于写入。 |
a+ | 读写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于读写。 |
用于简单 I/O 的方法也可用于所有 file 对象。所以,gets 从标准输入读取一行,aFile.gets 从文件对象 aFile 读取一行。
但是,I/O 对象提供了访问方法的附加设置,为我们提供了便利。
您可以使用方法 sysread 来读取文件的内容。当使用方法 sysread 时,您可以使用任意一种模式打开文件。例如:
下面是输入文本文件:
This is a simple text file for testing purpose.
现在让我们尝试读取这个文件:
#!/usr/bin/ruby aFile = File.new("input.txt", "r") if aFile content = aFile.sysread(20) puts content else puts "Unable to open file!" end
该语句将输入文件的头 20 个字符。文件指针将被放置在文件中第 21 个字符的位置。
您可以使用方法 syswrite 来向文件写入内容。当使用方法 syswrite 时,您需要以写入模式打开文件。例如:
#!/usr/bin/ruby aFile = File.new("input.txt", "r"+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end
该语句将写入 "ABCDEF" 到文件中。
该方法属于类 File。方法 each_byte 是个可以迭代字符串中每个字符。请看下面的代码示例:
#!/usr/bin/ruby aFile = File.new("input.txt", "r"+") if aFile aFile.syswrite("ABCDEF") aFile.rewind aFile.each_byte {|ch| putc ch; putc ?. } else puts "Unable to open file!" end
caractere por caractere é passado para a variável ch e exibido na tela, conforme mostrado a seguir:
A.B.C.D.E.F.s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
classe File é uma subclasse da classe IO. A classe IO também possui métodos para operar arquivos.
IO.readlines é um método da classe IO. Este método retorna o conteúdo do arquivo linha por linha. O código a seguir mostra o método IO.readlines uso:
#!/usr/bin/ruby arr = IO.readlines("input.txt") puts arr[0] puts arr[1]
neste código, a variável arr é um array. O arquivo input.txt cada linha será um elemento do array arr. Portanto, arr[0] conterá a primeira linha, e arr[1] conterá a segunda linha do arquivo.
Este método também retorna a saída linha por linha. O método foreach metodo readlines diferente do método foreach associado ao bloco. No entanto, ao contrário do método readlines,método foreach não retorna um array. Por exemplo:
#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}
este código passará o arquivo test o conteúdo do arquivo é passado linha a linha para a variável block, e a saída será exibida na tela.
您可以通过 rename 和 delete métodos para renomear e excluir arquivos.
abaixo está um exemplo de renomeação de um arquivo existente test1.txt:
#!/usr/bin/ruby # renomeia arquivo test1.txt para test2.txt File.rename( "test1.txt", "test2.txt" )
abaixo está um exemplo de exclusão de um arquivo existente test2.txt:
#!/usr/bin/ruby # exclui arquivo test2.txt File.delete("text2.txt")
usando máscara com chmod método para alterar o modo ou permissões do arquivo/lista de acesso:
abaixo está um exemplo de alteração de um arquivo existente test.txt o modo é um valor de máscara:
#!/usr/bin/ruby file = File.new( "test.txt", "w" ) file.chmod( 0755 )
a tabela a seguir lista chmod máscaras diferentes disponíveis no método:
掩码 | descrição |
---|---|
0700 | máscara rwx, aplicável ao proprietário |
0400 | r, aplicável ao proprietário |
0200 | w, aplicável ao proprietário |
0100 | x, aplicável ao proprietário |
0070 | máscara rwx, aplicável ao grupo |
0040 | r, para o grupo |
0020 | w, para o grupo |
0010 | x, para o grupo |
0007 | máscara rwx, para outros |
0004 | r, para outros |
0002 | w, para outros |
0001 | x, para outros |
4000 | Define o ID do usuário ao executar |
2000 | Define o ID do grupo do proprietário ao executar |
1000 | Salva texto de troca, mesmo após o uso |
Os seguintes comandos verificam se o arquivo existe antes de abri-lo:
#!/usr/bin/ruby File.open("file.rb") if File::exists?("file.rb")
Os seguintes comandos consultam se o arquivo realmente é um arquivo:
#!/usr/bin/ruby # Retorna true ou false File.file?("text.txt")
Os seguintes comandos verificam se o nome do arquivo fornecido é um diretório:
#!/usr/bin/ruby # Uma diretório File::directory?("/usr/local/bin") => true # Um arquivo File::directory?("file.rb") => false
Os seguintes comandos verificam se o arquivo é legível, gravável ou executável:
#!/usr/bin/ruby File.readable?("test.txt") => true File.writable?("test.txt") => true File.executable?("test.txt") => false
Os seguintes comandos verificam se o tamanho do arquivo é zero:
#!/usr/bin/ruby File.zero?("test.txt") => true
Os seguintes comandos retornam o tamanho do arquivo:
#!/usr/bin/ruby File.size?("text.txt") => 1002
Os seguintes comandos são usados para verificar o tipo do arquivo:
#!/usr/bin/ruby File::ftype("test.txt") => file
O método ftype identifica o tipo do arquivo retornando um dos seguintes valores:file, directory, characterSpecial, blockSpecial, fifo, link, socket ou unknown.
Os seguintes comandos são usados para verificar o tempo de criação, modificação ou acesso do arquivo:
#!/usr/bin/ruby File::ctime("test.txt") => Sex May 09 10:06:37 -0700 2008 File::mtime("text.txt") => Sex May 09 10:44:44 -0700 2008 File::atime("text.txt") => Sex May 09 10:45:01 -0700 2008
所有的文件都是包含在目录中,Ruby 提供了处理文件和目录的方式。File 类用于处理文件,Dir 类用于处理目录。
为了在 Ruby 程序中改变目录,请使用 Dir.chdir。下面的示例改变当前目录为 /usr/bin.
Dir.chdir("/usr/bin")
您可以通过 Dir.pwd 查看当前目录:
puts Dir.pwd # 返回当前目录,类似 /usr/bin
您可以使用 Dir.entries 获取指定目录内的文件和目录列表:
puts Dir.entries("/usr/bin").join(' ')
Dir.entries 返回一个数组,包含指定目录内的所有项。Dir.foreach 提供了相同的功能:
Dir.foreach("/usr/bin") do |entry| puts entry end
获取目录列表的一个更简洁的方式是通过使用 Dir 的类数组的方法:
Dir["/usr/bin/*"]
Dir.mkdir 可用于创建目录:
Dir.mkdir("mynewdir")
您也可以通过 mkdir 在新目录(不是已存在的目录)上设置权限:
注意:掩码 755 设置所有者(owner)、所属组(group)、每个人(world [anyone])的权限为 rwxr-xr-x,其中 r = read 读取,w = write 写入,x = execute 执行。
Dir.mkdir( "mynewdir", 755 )
Dir.delete 可用于删除目录。Dir.unlink 和 Dir.rmdir 执行同样的功能,为我们提供了便利。
Dir.delete("testdir")
临时文件是那些在程序执行过程中被简单地创建,但不会永久性存储的信息。
Dir.tmpdir 提供了当前系统上临时目录的路径,但是该方法默认情况下是不可用的。为了让 Dir.tmpdir 可用,使用必需的 'tmpdir' 是必要的。
您可以把 Dir.tmpdir 和 File.join 一起使用,来创建一个独立于平台的临时文件:
require 'tmpdir' tempfilename = File.join(Dir.tmpdir, "tingtong") tempfile = File.new(tempfilename, "w") tempfile.puts "This is a temporary file" tempfile.close File.delete(tempfilename)
Este código cria um arquivo temporário, escreve dados nele e depois exclui o arquivo. A biblioteca padrão do Ruby também contém uma chamada Tempfile do biblioteca, que pode ser usada para criar arquivos temporários:
require 'tempfile' f = Tempfile.new('tingtong') f.puts "Hello" puts f.path f.close
A seguir, fornece-se uma lista completa de funções integradas para o tratamento de arquivos e diretórios no Ruby: