Pular para o conteúdo principal

Manipulando Arquivos no Java

Olá a todos hoje falaremos de manipulação de arquivos, uma situação muito utilizada seja para persistência de dados como arquivos de cofiguração, relatórios simples, armazenamento para transferência de dados ou em até alguns casos pequenas bases de dados (para armazenamento de um grande volume de informações dê preferência aos DBMS, mesmo em dispositivos móveis com as versões compacts).

A classe File

É com ela que iremos trabalhar para manipular arquivos:

File arq = new File(“c:\\programero\\arquivo.txt”);
if (!arq.exists()){
   System.out.println(“Arquivo não existe !”);
}


Na classe File temos os métodos:

getName Retorna o nome do arquivo.
renameTo Renomeia o arquivo.
exists Verifica se o arquivo existe.
canWrite Verifica se é possível escrevet no arquivo.
canRead Verifica se um arquivo pode ser lido.
isFile Verifica se o caminho definido é um arquivo.
lastModified Recupera a data da última alteração do arquivo.
length Tamanho do arquivo.
delete Deleta o arquivo.
getPath Retorna o nome do diretório.
getAbsolutePath Nome completo do diretório.
getParent Retorna os diretórios acima do arquivo.
isDirectory Verifica se o caminho definido é um diretório.
isAbsolute Verifica se o caminho é absoluto.
mkDir Cria um diretório.
list Lista arquivo no diretório.


Para ler e gravar dados nos arquivos utilizamos classes para tratamento de stream:

Classe
Descrição
Reader Streams de entrada de caracteres.
Writer Streams de saída de caracteres.
InputStream Streams de entrada de bytes.
OutputStream Streams de saída de bytes, são manipulados por subclasses.
FileReader Leitura de caracteres de um arquivo.
FileWriter Escrita de caracteres em arquivo.
FileInputStream Serialização de objeto.
FileOutPutStream Deserializar objeto.

Exemplos:


Primeiro:

package programero.blog;

import java.io.*;

public class Arquivos1 {
    /**
     * Exemplo de leitura de arquivos   

     * http://programero.blogspot.com/
     */
    //
    public static void lerArquivo(String arquivo){
        File f = new File(arquivo);
        if (!f.exists()){
            System.out.println("Arquivo " + arquivo + " não existe!");
            return;
        }
        try{
            //
            // is representa um fluxo de entrada a partir  de um arquivo
            InputStream is = new FileInputStream(arquivo);
            //
            //InputStreamReader é uma classe para converter os bytes em char
            InputStreamReader isr = new InputStreamReader(is);
            //
            //BufferedReader é uma classe para armazenar os chars em memoria
            BufferedReader br = new BufferedReader(isr);
            String s = br.readLine(); //primeira linha
            //
            while (s != null){
                System.out.println(s);
                s = br.readLine();
            }
        }catch(Exception x){
            System.out.println(x.getMessage());
        }   
    }
    public static void main(String[] args) {
        lerArquivo("c:\\programero\\ler.txt");
    }
}

Segundo:

package programero.blog;

import java.io.*;

public class Arquivos2 {
    /**
     * Exemplo de escrita de arquivos    

     * http://programero.blogspot.com/
     */
    //
    public static void copiarArquivo(){
        //
        //lendo linhas
        try{
            FileReader     i  = new FileReader("c:\\programero\\ler.txt");
            FileWriter     o  = new FileWriter("c:\\programero\\Gravar.txt");
            BufferedReader in = new BufferedReader(i);
            PrintWriter    out= new PrintWriter(o);
            String Linha;
            //
            while ((Linha = in.readLine()) != null){
                System.out.println(Linha);
                out.println(Linha);
            }
            //
            out.flush();
            i.close();
            o.close();
        }catch (Exception x){
            System.out.println(x.getMessage());
        }
    }
    public static void main(String[] args) {
        copiarArquivo();
    }
}

Bom por enquanto é só, qualquer dúvida é postar um comentário que tentamos ajudar, nós próximos posts colocaremos alguns exemplos de interação com banco de dados.

Comentários

  1. Excelente post Eduardo. Já mexi com Java(não profissionalmente) e sei como é difícil para o novatos(ainda sou um). Seu post está muito bem explicado, bem "mastigado", hehehe. Alto e avante na blogosfera ;-)

    ResponderExcluir
  2. E aí Eduardo!! Bão né?!
    Te falar você tem MSN? Não sei se ja te perguntei isso hehe.. Se tiver me adiciona: betaopo@hotmail.com
    Abraço!

    ResponderExcluir
  3. Eduardo, não entendo lhufas de "informatiquês". Sou aquela usuária que ainda pergunta o óbvio e vive brigando com o micro achando que ele faz birra quando consegue fazer alguma coisa.
    Mas vim até aqui pra dizer que estou muito feliz por ter você como seguidor do meu blog.
    É sempre bom saber que jovens talentosos e "modernos" como você param para ler coisas que uma senhora escreve. Obrigada.
    Angela

    ResponderExcluir
  4. Muchasplatas que bom que tenha gostado, qualquer dúvida nos pergunte, Beto já está adicionado e Angel abrigado pelos elogios e volte sempre...

    ResponderExcluir
  5. Olá, Eduardo! Como vai?Eu gostei muito de seu post sobre arquivos, com ele pude esclarecer alumas dúvidas que me deixavam confusa sobre os fluxos de escrita e leitura. Você comentou que iria postar a respeito dainteração de arquivos com o banco, então, talvez possa me ajudar...tenho que ler uma tabela do banco de dadose transformar seu conteúdo em um arquivo txt que será meu propertie par a criação de uma árvore dinâmica do richFaces, mas não estou teno meito sucesso na passagem dos dados através do meu método getList que, na verdade, executa e retorna o resultado de uma consulta ao banco...Devo passar os valores do banco um a um? Como ocorre exatamente a interação entre a lista retornada e os métodos de escrita do arquivo? O banco que estou usando é o postgres e meu framework é o eclipse.Ah, caso tenha alguma idéia: como faço pra alterar os ícones que aparecem na árvore do richFaces, eu não quero que apareçam páginas oupastas para indicar os diretórios e arquivos, como é o padrão...
    Grata pela atenção,
    Hikaro

    ResponderExcluir
  6. Olá Hikaro, fico feliz que de alguma forma eu tenha lhe ajudado, peço desculpas pela demora na resposta (estou bem atarefado com projetos do trabalho) quanto as suas perguntas infelizmente acredito que não poderei ajudá-la, pois não conheço o richFaces, dei uma breve pesquisada na internet e achei bem interessante, assim que as coisas derem uma acalmada para mim (não creio que isso ocorra tão cedo) irei dar uma estudada nele mais afundo, por enquanto deixo aqui apenas dois links, um que você provavelmente já conhece http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/devguide/en/html_single/index.html , e outro que talvez lhe ajude em algo, ao menos na questão das figuras, espero que continue a nos visitar, abraços...

    ResponderExcluir
  7. alguem pode me ajudar a resolver alguns exercicios de repetição JAVA? todos tem k ser feitos em WHILE.

    ResponderExcluir
  8. Olá anônimo o uso do WHILE é simples:

    class WhileDemo {
    public static void main(String[] args){
    int count = 1;
    while (count < 11) {
    System.out.println("Count is: " + count);
    count++;
    }
    }
    }

    Nos diga do que você precisa e tentaremos te ajudar...

    ResponderExcluir
  9. Boa noit
    queria gravar caracteres a partir de um ponto no arquivo como faco?

    ResponderExcluir
  10. queria gravar um projeto qe to fazendo em algum .txt, queria saber onde implementar esses codigos para ele começar a salvar os dados digitados pelo usuario em .txt

    fiz uma classe Main onde todas as operações sao realizada.

    codigo:


    public class Main {


    public static void main(String[] args)
    {

    int op, cont=0, cont_autor = 0;
    Aluno al[];
    al= new Aluno[5];
    Autor au[];
    au = new Autor[5];

    do
    {
    op = Tela.scanInt("Systema de Bíblioteca...\n1- Console Aluno \n2-Console Autor"
    +"\n3- Console Livro.");

    switch (op)
    {
    case 1:
    {
    int op2 = Tela.scanInt("Systema de Bíblioteca...\n1-Cadastro Aluno\n2-Consultar Todos Alunos"
    +"\n3- Consultar Matricula Específica.\n 4- Alterar Status Matricula");
    switch (op2)
    {
    case 1:
    {
    al[cont] = new Aluno();
    cont++;
    break;

    } // fexa case 1
    case 2:
    {
    for(int i =0;i<cont;i++)
    al[i].print();
    break;
    } // fexa case 2
    case 3:
    {
    int aux_m;
    aux_m = Tela.scanInt("Informe a matrícula do aluno.");
    for(int i=0;i<cont;i++)
    {
    if(aux_m == al[i].getMatricula())
    {
    al[i].print();

    }else{Tela.print("Matricula não encontrada.");}
    }
    break;
    } // fexa case 3
    case 4:
    {
    int aux_m, ope=0;
    aux_m = Tela.scanInt("Informe a matrícula do aluno.");
    for (int i=0;i<cont;i++)
    {
    if(aux_m == al[i].getMatricula())
    {
    Tela.print("Status da Matrícula:"+al[i].StatusMatricula());
    ope = Tela.scanInt("Alterar Status da matrícula para:\n1 - Matriculado.\n2- Não Matriculado.");
    if (ope == 1)
    {
    al[i].matriculado();
    Tela.print("Status da Matricula alterado para: "+al[i].StatusMatricula());
    }else
    {
    al[i].NaoMatriculado();
    }
    }else{Tela.print("Matricula não encontrada.");}
    }// fexa FOR
    } // fexa case 4 OP
    } // fexa switch do OP2

    break;
    } // fexa switch: CASE 1 do OP
    case 2: // CASE OP - Autores
    {
    int op2 = Tela.scanInt("Systema de Bíblioteca...\n1-Cadastro Autor\n2-Consultar Todos Autores"
    +"\n3- Consultar Autor específico.\n");
    switch (op2)
    {
    case 1:
    {
    au[cont_autor] = new Autor();
    cont_autor++;
    break;
    }
    }
    } // fexa CASE 2 do OP
    }
    }while(true);
    }

    }




    queria saber onde coloco os cogidos. e se no meio do codigo é preciso colocar alguma função para ele salvar

    ResponderExcluir

Postar um comentário

Obrigado por Participar do programero, fique a vontade para agradecer, retificar, perguntar ou sugerir.

Postagens mais visitadas deste blog

Iniciar e Parar Serviços do Windows (Delphi)

Em certas ocasiões nos deparamos com a necessidade de manipular determinadas atividades do SO, como iniciar ou parar um banco de dados, ou qualquer outro serviço que esteja funcionando no momento. Segue abaixo um código que encontrei na Internet para tal finalidade (não me recordo à fonte, assim que eu a encontrar colocarei).
Iniciar Serviço:

uses WinSvc;
//
// start service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStart(
  sMachine,
  sService : string ) : boolean;
var
//
  // service control
  // manager handle
  schm,
//
  // service handle
  schs   : SC_Handle;
//
  // service status
  ss     : TServiceStatus;
//
  // temp char pointer
  psTemp : PChar;
//
  // check point
  dwChkP : DWord;
begin
  ss.dwCurrentState := -1;
// connect to the service
  // contr…

Alterar cores do PageControl (Delphi)

O padrão Windows todo cinza não é muito atraente, por isso quando nos utilizarmos do PageControl podemos alterar suas cores e fontes da seguinte maneira:
Em primeiro lugar devemos alterar a propriedade OwnerDraw para TRUE;
Depois implementar seu método DrawTab da seguinte maneira: //pinta a fonte
Control.Canvas.Font.Color:=clBlack;
//
// pinta a paleta / aba
Control.Canvas.brush.Color:=clSkyBlue;

PageControl1.Canvas.Rectangle(Rect);
Control.Canvas.TextOut(Rect.left+5,Rect.top+3,PageControl1.Pages[tabindex].Caption);
// pinta a parte interna (tabsheet)
PageControl1.Pages[TabIndex].brush.Color := Control.Canvas.brush.Color;
PageControl1.Pages[TabIndex].Repaint;

Caso a intenção seja manter cada aba com seu próprio estilo basta adicionar um CASE filtrando o índice das abas: case TabIndex of
  0: Control.Canvas.Font.Color:=clBlack;
  1: Control.Canvas.Font.Color:=clWindow;
  2: Control.Canvas.Font.Color:=clRed;
en…

Listar arquivos existentes em diretório (Delphi)

Mostraremos uma maneira simples e prática para listar o conteúdo de um diretório com a opção de incluir nessa listagem os arquivos de seus subdiretórios. No exemplo abaixo temos um Edit para receber o diretório a ser pesquisado um CheckBox para indicar se os subdiretórios entrarão na pesquisa um botão para efetuar a pesquisa e um Memo para listar os arquivos encontrados, no final um Edit que receberá o cálculo final (em bytes) da soma do tamanho dos arquivos. procedure TForm1.Button1Click(Sender: TObject);
begin
  tamanhoTotal := 0;
  memLista.Lines.Clear;
  ListarArquivos(edtDiretorio.Text, chkSub.Checked);
  Edit1.Text := IntToStr( tamanhoTotal );
end;
procedure TForm1.ListarArquivos(Diretorio: string; Sub:Boolean);
var
  F: TSearchRec;
  Ret: Integer;
  TempNome: string;
begin
  Ret := FindFirst(Diretorio+'\*.*', faAnyFile, F);
try
while Ret = 0 do
begin
if TemAtributo(F.Attr, faDirectory) then
begin
if (F.Name <> '.') And (F.Name &l…