Eu tenho um exemplo aqui, mas o campos estão separados por espaço. Veja:
1 - Bean
package arquivoDeTextoSequencial;
public class ArquivoDeTextoSequencial{
private int conta;
private String nome,
sobrenome;
private double saldo;
public ArquivoDeTextoSequencial(){
this(0, "", "", 0.0);
}
public ArquivoDeTextoSequencial(int contaInformada, String nomeInformado,
String sobrenomeInformado, double saldoInformado){
setConta(contaInformada);
setNome(nomeInformado);
setSobrenome(sobrenomeInformado);
setSaldo(saldoInformado);
}
public void setConta(int nroConta){
conta = nroConta;
}
public int getConta(){
return conta;
}
public void setNome(String nomeCliente){
nome = nomeCliente;
}
public String getNome(){
return nome;
}
public void setSobrenome(String sobrenomeCliente){
sobrenome = sobrenomeCliente;
}
public String getSobrenome(){
return sobrenome;
}
public void setSaldo(double saldoDaConta){
saldo = saldoDaConta;
}
public double getSaldo(){
return saldo;
}
}
2 - Gerador da Leitura
package arquivoDeTextoSequencial;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.NoSuchElementException;
public class LerArquivoSequencial{
private Scanner entradaDoArquivo;
public void abrirArquivo(String caminho){
try{
String caminhoAbsoluto = caminho.concat("clientes.txt").substring(6);
entradaDoArquivo = new Scanner(new File(caminhoAbsoluto));
}catch(FileNotFoundException fne){
System.err.println("ERRO: impossível abrir o arquivo!\n");
System.exit(1);
}
}
public void lerRegistro(){
ArquivoDeTextoSequencial registro = new ArquivoDeTextoSequencial();
System.out.printf("\n\n%-7s %-20s%-32s %-12s \n",
"Conta",
"Nome",
"Sobrenome",
"Saldo"
);
System.out.println("------------------------------------------------------------------------");
try{
while(entradaDoArquivo.hasNextLine()){
String linha = entradaDoArquivo.nextLine();
String trechoConta = linha.substring(0, 7);
String trechoNome = linha.substring(8, 28);
String trechoSobrenome = linha.substring(29, 61);
String trechoSaldo = linha.substring(62);
registro.setConta(new Scanner(trechoConta).nextInt());
registro.setNome(trechoNome);
registro.setSobrenome(trechoSobrenome);
registro.setSaldo(new Scanner(trechoSaldo).nextDouble());
System.out.printf("%-7d %-52s %-12.2f\n",
registro.getConta(),
registro.getNome().concat(registro.getSobrenome()),
registro.getSaldo()
);
}
}catch(NoSuchElementException nse){
System.err.println("ERRO: formatação inadequada!\n" + nse);
entradaDoArquivo.close();
System.exit(1);
}catch(IllegalStateException ise){
System.err.println("ERRO: impossível ler o arquivo!\n");
System.exit(1);
}
}
public void fecharArquivo(){
if(entradaDoArquivo != null)
entradaDoArquivo.close();
}
}
3 - Leitor
package arquivoDeTextoSequencial;
public class LeitorDeArquivoSequencial{
public static void main(String[] args){
LerArquivoSequencial lerArquivoSequencial = new LerArquivoSequencial();
String caminho = lerArquivoSequencial.getClass().getResource("").toString();
lerArquivoSequencial.abrirArquivo(caminho);
lerArquivoSequencial.lerRegistro();
lerArquivoSequencial.fecharArquivo();
}
}
4 - Gerador do arquivo
package arquivoDeTextoSequencial;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Formatter;
import java.util.NoSuchElementException;
import java.util.FormatterClosedException;
public class CriarArquivoDeTexto{
private Formatter saidaFormatada;
public void abrirArquivo(String caminho){
try{
//Retira a parte "file:/" do caminho
String caminhoAbsoluto = caminho.concat("clientes.txt").substring(6);
saidaFormatada = new Formatter(caminhoAbsoluto);
}catch(SecurityException sexcp){
System.err.println("Você não tem permissão para escrever nesse arquivo!");
System.exit(1);
}catch(FileNotFoundException fnfe){
System.err.println("Ocorreu um erro ao abrir ou criar o arquivo!\n" + fnfe);
System.exit(1);
}
}
private String exibirFraseologiaPadrao(){
Scanner leitorTeclado = new Scanner(System.in);
System.out.print("\n\tDeseja continuar?(S/N): ");
return leitorTeclado.next();
}
public void adicionarRegistro(){
ArquivoDeTextoSequencial registro = new ArquivoDeTextoSequencial();
Scanner leitorTeclado = new Scanner(System.in);
System.out.printf("\n%s \n%s \n%s\n\n",
"Para finalizar a entrada, digite EOF.",
"No UNIX/Linux/Mac OS X, pressione <ctrl> d e pressione Enter.",
"No Windows pressione <ctrl> z e pressione Enter."
);
String teste = exibirFraseologiaPadrao();
while(teste.equals("S") || teste.equals("s")){
try{
System.out.print("\nNúmero da conta(> 0) : ");
registro.setConta(leitorTeclado.nextInt());
leitorTeclado.nextLine();
System.out.print("Nome do titular : ");
registro.setNome(leitorTeclado.nextLine());
System.out.print("Sobrenome do titular : ");
registro.setSobrenome(leitorTeclado.nextLine());
System.out.print("Saldo : ");
registro.setSaldo(leitorTeclado.nextDouble());
//%n: quabra de linha da plataforma (Sistema operacional)
if(registro.getConta() > 0){
saidaFormatada.format("%-7d %-20s %-32s %12.2f %n",
registro.getConta(),
registro.getNome(),
registro.getSobrenome(),
registro.getSaldo());
}else
System.out.println("Número de conta inválido!\n\n");
}catch(FormatterClosedException fce){
System.err.println("ERRO: impossível gravar no arquivo!\n\n");
return;
}catch(NoSuchElementException nse){
System.err.println("ERRO: entrada inválida. Tente novamente!\n\n");
leitorTeclado.nextLine();
}
teste = exibirFraseologiaPadrao();
}
}
public void fecharArquivo(){
if(saidaFormatada != null){
saidaFormatada.close();
}
}
}
5 - Criador do Arquivo
package arquivoDeTextoSequencial;
public class CriadorDeArquivoDeTexto{
public static void main(String[] args){
CriarArquivoDeTexto criarArquivoDeTexto = new CriarArquivoDeTexto();
String caminho = criarArquivoDeTexto.getClass().getResource("").toString();
criarArquivoDeTexto.abrirArquivo(caminho);
criarArquivoDeTexto.adicionarRegistro();
criarArquivoDeTexto.fecharArquivo();
}
}
Esse código é uma adaptação ao proposto no livro Java Como Programar 8, pág. 551 - 565.