Capítulo 6 - Strings, Formatação e Parsing - Presentation Transcript
6. Strings, E/S, Formatação e Parsing João Sávio C. Longo 04:11
String, StringBuilder e StringBuffer
Objetos String são inalteráveis, mas as variáveis de referência String não;
String s = “abc”;
String s2 = s; //mesmo objeto
s = s.concat(“def”); //dois objetos!;
s2 = “abc” e s = “abcdef”;
João Sávio C. Longo 04:11
String, StringBuilder e StringBuffer
A classe String é final;
Os métodos de String usam índices iniciados em zero, exceto para o segundo argumento de substring();
String -> método length(), arrays -> length;
João Sávio C. Longo 04:11
StringBuilder vs StringBuffer
São alteráveis;
StringBuffer é sincronizada (segura em relação aos threads);
StringBuilder é mais rápida;
João Sávio C. Longo 04:11
Métodos
delete(int start, int end) -> começo inicia pelo “zero” e fim inicia pelo “um”;
Insert(int offset, String s) -> índice de deslocamento é o offset. Exemplo:
StringBuilder sb = new StringBuilder(“01234567”);
sb.insert(4, “---”);
//sb = “0123---4567”
João Sávio C. Longo 04:11
Navegação de Arquivos e E/S
File, FileReader, BufferedReader, FileWriter, BufferedWriter e PrintWriter;
Um novo objeto File não significa que há um novo arquivo no HD;
Objetos File podem representar um arquivo ou um diretório;
A classe File permite adicionar, remover e apagar arquivos e diretórios;
João Sávio C. Longo 04:11
Navegação de Arquivos e E/S
FileWriter e FileReader são classes de E/S de baixo nível;
É bastante comum “encapsular” um BufferedReader em um FileReader e/ou um BufferedWriter em um FileWriter, para se ter acesso a métodos de nível mais alto;
PrintWriters podem ser usados para encapsular outros Writers e podem ser criados diretamente a partir de Files ou Strings;
João Sávio C. Longo 04:11
Criando um arquivo
try {
File dir = new File(“diretorio”); //ainda não temos um diretório
dir.mkdir(); //agora temos
File file = new File(dir, “teste.txt”); //não cria o arquivo
file.createNewFile(); //cria o arquivo no HD
}
catch (Exception e) {}
João Sávio C. Longo 04:11
04:11 João Sávio C. Longo Classe de java.io Estende de Argumentos principais dos contrutores File Object File, String String String, String FileWriter Writer File String BufferedWriter Writer Write PrintWriter Writer File (Java 5) String (Java 5) Writer OutputStream FileReader Reader File String BufferedReader Reader Reader
Considerações
File file = new File(“teste”);
Se “teste” não existir, não é criado nenhum arquivo;
Senão, o novo objeto File refere-se ao arquivo existente;
File file = new File(“teste”);
try {
PrintWriter pw = new PrintWriter(file); //é criado
o arquivo “teste”;
} catch (Exception e) {}
João Sávio C. Longo 04:11
Serialização
Salvar o estado de um objeto;
A classe a ser serializada precisa implementar “Serializable”;
Se a superclasse implementar “Serializable”, então as suas subclasses também a implementam automaticamente;
Se a superclasse não implementar “Serializable”, então quando um objeto da subclasse for desserializado, o construtor da superclasse será executado;
As variáveis estáticas NUNCA serão salvas como parte do estado do objeto, porque elas não pertencem ao objeto!;
João Sávio C. Longo 04:11
Exemplo
class Cat implements Serializable { }
public class SerializaCat {
public static void main(String[] args) {
Cat c = new Cat();
//serializando
try {
FileOutputStream fs = new FileOutputStream(“teste.ser”);
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(c);
os.close();
}
catch (Exception e) { }
João Sávio C. Longo 04:11
//desserializando
try {
FileInputStream fis = new FileInputStream(“teste.ser);
ObjectInputStream ois = new ObjectInputStream(fis);
c = (Cat) ois.readObject();
ois.close();
}
catch(Exception e) { }
}
João Sávio C. Longo 04:11
Serialização
Quando você serializa um objeto, a serialização salva todo o “gráfico de objetos”;
class Cat implements Serializable {
private String nome;
private Dono dono;
//a classe Dono também precisa implementar Serializable
}
João Sávio C. Longo 04:11
Considerações
Se marcarmos a variável de instância “Dono” como “transient” a serialização ignorará o “Dono” durante o processo;
Mas você precisará restaurar o “Dono” na desserialização. Pode-se usar métodos especiais para este problema;
João Sávio C. Longo 04:11
Métodos Especiais
private void writeObject(ObjectOutputStream os) {
//aqui entra o código para salvar o “Dono”
}
private void readObject(ObjectInputStream os) {
//aqui entra o código para ler o estado do “Dono”, criar um novo “Dono” e atribuí-lo ao “Cat”
}
João Sávio C. Longo 04:11
Exemplo
public class Cat implements Serializable {
private String nome;
private transient Dono dono;
private void writeObject(ObjectOutputStream os) {
//lança IOException
try {
os.defaultWriteObject();
os.writeObject(dono);
}
catch(Exception e) { }
}
João Sávio C. Longo 04:11
private void readObject(ObjectInputStream ois) {
//lança IOException, ClassNotFoundException
try {
ois.defaultReadObject();
dono = (Dono) ois.readObject();
}
catch(Exception e) { }
}
}
João Sávio C. Longo 04:11
Considerações
As referências a objetos marcadas como transient serão sempre resetadas como null, independentemente se elas foram inicializadas no momento da declaração da classe;
class Cat implements Serializable {
transient int idade = 5;
}
Quando a instância de Cat for desserializada “idade” será definida como 0;
João Sávio C. Longo 04:11
Datas, Números e Moeda
java.util.Date;
java.util.Calendar;
java.text.DateFormat;
java.text.NumberFormat;
java.util.Locale;
João Sávio C. Longo 04:11
java.util.Date
Maioria dos métodos foram depreciados;
Um Date é armazenado como um long e refere-se ao número de milisegundos desde 1º de janeiro de 1970;
Objetos Date são uma espécie de ponte entre as classes Calendar e Locale;
João Sávio C. Longo 04:11
java.util.Calendar
Possui um conjunto poderoso de métodos para manipulação de datas;
Calendar c = Calendar.getInstance();
Métodos importantes -> add() e roll();
roll() funciona como um add(), mas não incrementa as partes maiores de uma data;
João Sávio C. Longo 04:11
java.util.Locale
Locale locPt = new Locale(“pt”);
Locale locBr = new Locale(“pt”, “br”);
DateFormat e NumberFormat podem ter os seus locais definidos somente no momento da instanciação;
DateFormat.getDateInstance(DateFormat.LONG) -> September 8, 2001;
DateFormat.getDateInstance(DateFormat.FULL) -> Saturday, September 8, 2001;
João Sávio C. Longo 04:11
java.text.NumberFormat
NumberFormat.getInstance() retorna o número com 3 casas após a vírgula;
NumberFormat.getCurrencyInstance() retorna o número com o símbolo da moeda;
métodos: -> getMaximumFractionDigits(), setMaximumFractionDigits(), parse() e setParseIntegerOnly();
João Sávio C. Longo 04:11
João Sávio C. Longo 04:11 Classes Principais Opções de criação para as instâncias java.util.Date new Date(); new Date(long milisegundos); java.util.Calendar Calendar.getInstance(); Calendar.getInstance(Locale); java.util.Locale Locale.getDefault(); new Locale(String língua); new Locale(String língua, String país); java.text.DateFormat DateFormat.getInstance(); DateFormat.getDateInstance(); DateFormat.getDateInstance(estilo); DateFormat.getDateInstance(estilo, Locale); java.text.NumberFormat NumberFormat.getInstance(); NumberFormat.getInstance(Locale); NumberFormat.getNumberInstance(); NumberFormat.getNumberInstance(Locale); NumberFormat.getCurrencyInstance(); NumberFormat.getCurrencyInstance(Locale);
Parsing, Tokenização e Formatação João Sávio C. Longo 04:11
Busca Simples
import java.util.regex.*;
class RegexTest {
Pattern p = Pattern.compile(“ab”); //expressão
Matcher m = p.matcher(“abaaaba”); //fonte
boolean b = false;
while (b = m.find()) {
System.out.println(m.start() + “ “);
}
}
Isso produz 0 4
João Sávio C. Longo 04:11
Busca Usando Metacaracteres
d -> um dígito;
s -> um caractere de espaço em branco;
w -> um caractere de palavra (letras, dígitos ou “_”);
Se fonte = “a 1 56 _z” e padrão = w então o regex retornará 0, 2, 4, 5, 7 e 8;
João Sávio C. Longo 04:11
Conjuntos de Caracteres
[abc] -> procura caracteres a, b ou c;
[a-f] -> procura caracteres a, b, c, d, e ou f;
[a-fA-F] -> não procura “fA”;
João Sávio C. Longo 04:11
Buscas Usando Quantificadores
+ -> uma ou mais ocorrências;
* -> zero ou mais ocorrências;
? -> zero ou uma ocorrência;
. -> qualquer caracter serve;
^ -> exceto;
João Sávio C. Longo 04:11
Exemplos
d+ -> encontre um ou mais dígitos seguidos;
0 [xX] ( 0-9a-fA-F )+ -> número hexadecimal;
[^abc] -> encontre tudo exceto a, b e c;
d d d ( [-s] )? d d d d -> nº de telefone válido;
[a.c]* -> encontre “a” seguido de qualquer caractere, seguido de “c”, zero ou mais ocorrências;
João Sávio C. Longo 04:11
Problema
fonte = yyxxxyxx;
padrão = .*xx;
Qual a saída?
a- 0 yyxx e 4 xyxx
b- 0 yyxxxyxx
João Sávio C. Longo 04:11
Quantificadores Gananciosos e Relutantes
? é ganancioso, ?? é relutante, para zero ou um;
* é ganancioso, *? é relutante, para zero ou mais;
+ é ganancioso, +? é relutante, para um ou mais;
João Sávio C. Longo 04:11
Ganancioso vs Relutante
Ganancioso -> olha o conjunto inteiro;
Relutante -> olha uma pequena parte do conjunto;
João Sávio C. Longo 04:11
Problema anterior
Se fonte = yyxxxyxx e padrão = .*xx então o quantificador é ganancioso, portanto a saída é
0 yyxxxyxx;
Se fonte = yyxxxyxx e padrão = .*?xx então o quantificador é relutante, portanto a saída é
0 yyxx e 4 xyxx;
João Sávio C. Longo 04:11
Considerações
String pattern = “d”; //erro de compilação!!!;
String pattern = “\d”; //agora sim;
String p = “.”; //o regex vê isso como um metaracter “.”;
1 comments
Comments 1 - 1 of 1 previous next Post a comment