O pacote Java.io contém quase todas as classes necessárias para operar entrada e saída. Todas essas classes de fluxo representam fontes de entrada e destinos de saída.
Os fluxos no pacote Java.io suportam muitos formatos, como tipos básicos, objetos, conjuntos de caracteres localizados, etc.
Um fluxo pode ser entendido como uma sequência de dados. Um fluxo de entrada representa a leitura de dados de uma origem e um fluxo de saída representa a gravação de dados em um destino.
Java fornece suporte poderoso e flexível para E/S, tornando-o mais amplamente utilizado em transferência de arquivos e programação de rede.
Mas esta seção cobre as funções mais básicas relacionadas a fluxos e E/S. Aprenderemos essas funções por meio de exemplos um por um.
A entrada do console Java é feita por System.in.
Para obter um fluxo de caracteres vinculado ao console, você pode agrupar System.in em um objeto BufferedReader para criar um fluxo de caracteres.
A seguir está a sintaxe básica para criar um BufferedReader:
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
Após a criação do objeto BufferedReader, podemos usar o método read() para ler um caractere do console ou o método readLine() para ler uma string.
Para ler um caractere de um objeto BufferedReader, use o método read(), cuja sintaxe é a seguinte:
intread()throwsIOException
Cada vez que o método read() é chamado, ele lê um caractere do fluxo de entrada e retorna esse caractere como um valor inteiro. Retorna -1 quando o stream termina. Este método lança IOException.
O programa a seguir demonstra o uso do método read() para ler continuamente caracteres do console até que o usuário insira "q".
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
Os resultados de compilação e execução do exemplo acima são os seguintes:
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
A leitura de uma string da entrada padrão requer o uso do método readLine() de BufferedReader.
Seu formato geral é:
StringreadLine()throwsIOException
O programa a seguir lê e exibe linhas de caracteres até você inserir a palavra “end”.
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
Os resultados de compilação e execução do exemplo acima são os seguintes:
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
Como mencionado anteriormente, a saída do console é completada por print() e println(). Esses métodos são definidos pela classe PrintStream e System.out é uma referência ao objeto desta classe.
PrintStream herda a classe OutputStream e implementa o método write(). Desta forma, write() também pode ser usado para escrever operações no console.
PrintStream define write() em sua forma mais simples como segue:
voidwrite(intbyteval)
Este método grava os octetos inferiores do byteval no fluxo.
O exemplo a seguir usa write() para imprimir o caractere "A" seguido por um caractere de nova linha na tela:
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
Execute o exemplo acima para gerar o caractere “A” na janela de saída.
A
Nota: O método write() não é usado com frequência porque os métodos print() e println() são mais convenientes de usar.
Conforme mencionado antes, um fluxo é definido como uma sequência de dados. O fluxo de entrada é usado para ler dados da origem e o fluxo de saída é usado para gravar dados no destino.
A figura a seguir é um diagrama de hierarquia de classes que descreve o fluxo de entrada e o fluxo de saída.
Os dois fluxos importantes que serão discutidos abaixo são FileInputStream e FileOutputStream:
Este fluxo é usado para ler dados de um arquivo, e seus objetos podem ser criados usando a palavra-chave new.
Existem vários métodos construtores usados para criar objetos.
Você pode usar um nome de arquivo de string para criar um objeto de fluxo de entrada para ler o arquivo:
InputStreamf=newFileInputStream("C:/java/hello");
Você também pode usar um objeto de arquivo para criar um objeto de fluxo de entrada para ler o arquivo. Primeiro temos que criar um objeto de arquivo usando o método File():
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
Depois de criar um objeto InputStream, você pode usar os métodos a seguir para ler o fluxo ou executar outras operações de fluxo.
número de série | Métodos e Descrição |
---|---|
1 | public void close() lança IOException{} Fecha este fluxo de entrada de arquivo e libera todos os recursos do sistema relacionados a este fluxo. Lança uma IOException. |
2 | protected void finalize()throws IOException {} Este método limpa a conexão com o arquivo. Certifique-se de chamar o método close do fluxo de entrada do arquivo quando ele não for mais referenciado. Lança uma IOException. |
3 | public int read(int r)throws IOException{} Este método lê bytes especificados de dados do objeto InputStream. Retornado como um valor inteiro. Retorna o próximo byte de dados ou -1 se o fim tiver sido alcançado. |
4 | public int read(byte[] r) throws IOException{} Este método lê r.length bytes do fluxo de entrada. Retorna o número de bytes lidos. Se for o fim do arquivo, -1 será retornado. |
5 | public int available() throws IOException{} Retorna o número de bytes que podem ser lidos neste fluxo de entrada sem bloqueio pela próxima chamada de método neste fluxo de entrada. Retorna um valor inteiro. |
Além do InputStream, existem alguns outros fluxos de entrada. Para obter mais detalhes, consulte o link abaixo:
ByteArrayInputStream
DataInputStream
Esta classe é usada para criar um arquivo e gravar dados nele.
Se o arquivo de destino não existir antes do fluxo abrir o arquivo para saída, o fluxo criará o arquivo.
Existem dois construtores que podem ser usados para criar objetos FileOutputStream.
Crie um objeto de fluxo de saída usando um nome de arquivo de string:
OutputStreamf=newFileOutputStream("C:/java/hello")
Você também pode usar um objeto de arquivo para criar um fluxo de saída para gravar no arquivo. Primeiro temos que criar um objeto de arquivo usando o método File():
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
Depois de criar o objeto OutputStream, você pode usar os métodos a seguir para gravar no fluxo ou executar outras operações de fluxo.
número de série | Métodos e Descrição |
---|---|
1 | public void close() lança IOException{} Fecha este fluxo de entrada de arquivo e libera todos os recursos do sistema relacionados a este fluxo. Lança uma IOException. |
2 | protected void finalize()throws IOException {} Este método limpa a conexão com o arquivo. Certifique-se de chamar o método close do fluxo de entrada do arquivo quando ele não for mais referenciado. Lança uma IOException. |
3 | public void write(int w)throws IOException{} Este método grava os bytes especificados no fluxo de saída. |
4 | public void write(byte[] w) grava os bytes de comprimento w.length na matriz especificada em OutputStream. |
Além do OutputStream, existem alguns outros fluxos de saída. Para obter mais detalhes, consulte o link abaixo:
ByteArrayOutputStream
DataOutputStream
Aqui está um exemplo que demonstra o uso de InputStream e OutputStream:
import java.io.*; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite[] = { 11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("test.txt"); for (int x = 0; x < bWrite.length; x++) { os.write(bWrite[x]); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for (int i = 0; i < size; i++) { System.out.print((char) is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
O programa acima primeiro cria o arquivo test.txt, grava o número fornecido no arquivo em formato binário e o envia para o console.
Como o código acima é escrito em binário, pode haver caracteres ilegíveis. Você pode usar os seguintes exemplos de código para resolver o problema do código ilegível:
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
Existem também algumas classes sobre arquivos e E/S que também precisamos saber:
Classe de arquivo(classe)
Classe FileReader(classe)
Classe FileWriter(classe)
Existem dois métodos na classe File que podem ser usados para criar pastas:
O método mkdir() cria uma pasta e retorna verdadeiro se for bem-sucedido e falso se falhar. A falha indica que o caminho especificado pelo objeto Arquivo já existe ou que a pasta não pode ser criada porque o caminho completo ainda não existe.
O método mkdirs() cria uma pasta e todas as suas pastas pai.
O exemplo a seguir cria a pasta "/tmp/user/java/bin":
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
Compile e execute o código acima para criar o diretório "/tmp/user/java/bin".
Nota: Java resolve automaticamente os separadores de caminho de arquivo por convenção no UNIX e no Windows. Se você usar o delimitador (/) na versão Windows do Java, o caminho ainda será analisado corretamente.
Um diretório é na verdade um objeto Arquivo que contém outros arquivos e pastas.
Se você criar um objeto File e ele for um diretório, chamar o método isDirectory() retornará verdadeiro.
Você pode extrair a lista de arquivos e pastas que ele contém chamando o método list() no objeto.
O exemplo mostrado abaixo ilustra como usar o método list() para verificar o conteúdo de uma pasta:
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
Os resultados de compilação e execução do exemplo acima são os seguintes:
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
Para excluir um arquivo, use o método java.io.File.delete().
O código a seguir excluirá o diretório /tmp/java/. Deve-se observar que ao excluir um determinado diretório, você deve garantir que não haja outros arquivos no diretório para excluí-lo corretamente, caso contrário a exclusão falhará.
Estrutura de diretório de teste:
/tmp/java/ |-- 1.log |-- teste
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }