Curso JAVA
Unidad 7:
"Entrada/Salida"Objetivos de la Unidad:
1.- Introducci�n
2.-
RandomAccessFile
// EjemploRandomAccessFile.java
import java.io.*;
public class
EjemploRandomAccessFile
{
public static void main (String
args[]) throws Exception
{
RandomAccessFile f = new
RandomAccessFile("salida.txt", "rw");
String cadena = "Frase de
prueba";
f.writeBytes(cadena);
f.writeBytes("\r\n");
f.writeChars(cadena);
f.close();
}
}
3.- FileOutputStream
import java.io.*;
public class
EjemploFileOutputStream
{
public static void main (String args[]) throws
Exception
{
FileOutputStream f = new FileOutputStream("salida.txt");
DataOutputStream d = new DataOutputStream(f);
String cadena = "Frase de prueba";
d.writeBytes(cadena);
d.writeBytes("\r\n");
d.writeChars(cadena);
d.close(); //
desencadena el close de f
}
}
3.1.- Operaciones de
"fontaner�a"
Los streams se conectan unos a otros mediante el
constructor. DataOutputStream est� basado en el Patr�n de Dise�o denominado
Decorator. En los apartados siguientes se muestra c�mo se realizan estas
conexiones.
3.2.- Compresi�n de streams y ficheros zip
// EjemploFileOutputStream.java
import java.io.*;
import java.util.zip.*;public class EjemploFileOutputStream
{
public static void main (String args[]) throws Exception
{
FileOutputStream f = new FileOutputStream("salida.zip");
ZipOutputStream z = new ZipOutputStream(f);
z.putNextEntry(new ZipEntry("salida.txt"));
DataOutputStream d = new DataOutputStream(z);String cadena = "Frase de prueba";
d.writeBytes(cadena);
d.writeBytes("\r\n");
d.writeChars(cadena);
d.close(); // desencadena el close de z y de f
}
}
3.3.-
Serializaci�n
Para que una clase sea serializable, �sta o una clase
de la que derive debe implementar el interface Serializable. Para el correcto funcionamiento del ejemplo
siguiente se recomienda que la clase ObjGraf implemente Serializable.
import java.io.*;
public class PruebaSerializacion
{
public static void main(String args[]) throws Exception
{
// Fase 1: Creaci�n de los objetos
Rectangulo r = new Rectangulo(1, 2, 3, 4);
Circulo c = new Circulo(30, 20, 10);
// Fase 2: Apertura de un fichero stream de salida y serializaci�n hacia �l
// de objetos
FileOutputStream f = new FileOutputStream("salida.dat");
ObjectOutputStream objOut = new ObjectOutputStream(f);
objOut.writeObject(r);
objOut.writeObject(c);
objOut.close();
System.out.println("creado salida.dat");
// Fase 3: Comprobaci�n: Deserializaci�n de los objetos
FileInputStream f2 = new FileInputStream("salida.dat");
ObjectInputStream objIn = new ObjectInputStream(f2);
Rectangulo r2 = (Rectangulo) objIn.readObject();
System.out.println("Rect: " + r2.getX());
Circulo c2 = (Circulo) objIn.readObject();
System.out.println("Circ: " + c2.getX());
}
}
4.-
FileInputStream
// type.java
import java.io.*;
public class type
{
public static void main (String args[]) throws Exception
{
FileInputStream f = new FileInputStream(args[0]);
int c;
while ((c = f.read()) != -1)
{
System.out.print((char) c);
}
}
}
// type.java
import java.io.*;
public class
type
{
public
static void main (String args[]) throws Exception
{
FileInputStream f = new FileInputStream(args[0]);
byte buf[] = new byte[2048]; // buffer de
2Kb
int n;
while ((n = f.read(buf)) ! =
-1)
{
System.out.print(new String(buf, 0, n));
}
}
}
// type.java
import java.io.*;
public class
type
{
public
static void main (String args[]) throws Exception
{
String
linea = "";
FileInputStream f =
new FileInputStream(args[0]);
DataInputStream d = new
DataInputStream(f);
while ((linea = d.readLine()) ! =
null)
{
System.out.println(linea);
}
}
}
import java.io.*;
public class InputDeTeclado
{
public static void main(String[] args) throws Exception
{
DataInputStream d = new DataInputStream(System.in);
System.out.print("Nombre: ");
String nombre = d.readLine();
System.out.print("Cantidad: ");
int cantidad = Integer.parseInt(d.readLine());
System.out.println("Nombre: " + nombre + ", Cantidad: " + cantidad);
}
}
import java.io.*;
public class InputDeTeclado2
{
public static void main(String[] args) throws Exception
{
InputStreamReader ir = new InputStreamReader(System.in);
LineNumberReader lr = new LineNumberReader(ir);
System.out.print("Nombre: ");
String nombre = lr.readLine();
System.out.print("Cantidad: ");
int cantidad = Integer.parseInt(lr.readLine());
System.out.println("Nombre: " + nombre + ", Cantidad: " + cantidad);
}
}
import java.io.*;
public class type
{
public static void main (String args[]) throws Exception
{
String linea = "";
FileInputStream f = new FileInputStream(args[0]);
BufferedInputStream b = new BufferedInputStream(f);
DataInputStream d = new DataInputStream(b);while ( (linea = d.readLine()) ! = null)
{
System.out.println(linea);
}
}
import java.io.*;
public class
copy
{
public
static void main (String args[]) throws Exception
{
FileInputStream f = new FileInputStream(args[0]);
FileOutputStream f2 = new
FileOutputStream(args[1]);
int
c;
while ((c = f.read()) !=
-1)
{
f2.write(c);
}
f.close();
f2.close();
}
}
En la Unidad 6 explic�bamos c�mo ejecutar comandos del sistema mediante el m�todo exec() de la clase Runtime. Jugando con los streams se puede conseguir evitar el paso por ficheros intermedios lo cual se agradece en caso de sistemas concurrentes o en caso de querer evitar escribir en disco para evitar depender de disponer de privilegios. El c�digo ser�a:
... Process p = Runtime.getRuntime().exec(cmd); InputStream pin = p.getInputStream(); ByteArrayOutputStream bo = new ByteArrayOutputStream(); int c; while ((c = pin.read()) != -1) bo.write(c);String respuesta = bo.toString(); ...
5.- File
// Demostraci�n de File.
import java.io.File;public class FileDemo
{
static void p(String s)
{
System.out.println(s);
}public static void main(String args[])
{
File f1 = new File("/midirectorio");
p("Nombre fichero: " + f1.getName());
p("Path: " + f1.getPath());
p("Abs Path: " + f1.getAbsolutePath());
p("Parent: " + f1.getParent());
p(f1.exists() ? "existe" : "no existe");
p(f1.canWrite() ? "es de escritura" : "no es de escritura");
p(f1.canRead() ? "es de lectura" : "no es de lectura");
p("" + (f1.isDirectory() ? "es" : "no es" + " un directorio"));
p(f1.isFile() ? "es fichero normal" : "es fichero especial");
p(f1.isAbsolute() ? "es absoluto" : "no es absoluto");
p("�ltima modificaci�n: " + f1.lastModified());
p("Tama�o fichero: " + f1.length() + " Bytes");
}
}
6.- Listas de ficheros y directorios
public class
DirList
{
public
static void main(String args[])
{
String dirname =
"/midirectorio";
File f1 =
new File(dirname);
if
(f1.isDirectory())
{
System.out.println("Directorio de " + dirname);
String s[] = f1.list();
for (int i=0; i < s.length;
i++)
{
File f = new File(dirname + "/" + s[i]);
if
(f.isDirectory())
{
System.out.println(s[i] + " es un directorio");
}
else
{
System.out.println(s[i] + " es un fichero");
}
}
}
else
{
System.out.println(dirname + " no es un directorio");
}
}
}
En el API est�ndar no
hab�an inicialmente servicios de ordenaci�n. Posteriormente la clase Arrays
ofrece m�todos sort() a tal
efecto. En nuestro caso ser�a �til por ejemplo para obtener la lista de
ficheros ordenada. Ello no es debido a que sus creadores como James
Gosling no hayan ca�do en ello. En el propio JDK viene el ejemplo sortDemo en
el que se incluyen varios algoritmos de ordenaci�n como BubbleSort y
QSort.
En base a ellos se listan a continuaci�n dos
rutinas est�ticas y gen�ricas de ordenaci�n por el m�todo de la burbuja que en
un momento dado pueden ser de utilidad:
Ordenaci�n de un array de elementos tipo String:
public static void
bubbleSort(String[] a)
{
for (int i = 0; i < a.length;
i++)
for (int j = a.length-1; j > i;
j--)
{
if
(a[j-1].compareTo(a[j]) >
0)
{
String
T = a[j-1];
a[j-1] =
a[j];
a[j] = T;
}
}
}
Ordenaci�n de un array de
elementos tipo int:
public static void bubbleSort(int[]
a)
{
for (int i = 0; i < a.length;
i++)
for (int j = a.length-1; j > i;
j--)
{
if
(a[j-1] >
0)
{
int T =
a[j-1];
a[j-1] =
a[j];
a[j] = T;
}
}
}
public class PruebaRecursividad
{
public static void main(String[] args)
{
System.out.println("fRecur(0, 5) :");
fRecur(0, 5);
System.out.println("fIter(0, 5) :");
fBucle(0, 5);
} private static void fRecur (int i, int n)
{
if (i < n)
{
System.out.println("i = " + i);
fRecur(++i, n); // se llama a s� mismo
} // else return (impl�cito)
} public static void fBucle (int i, int n)
{
for (; i < n; i++)
System.out.println("i = " + i);
}
}
Las llamadas recursivas se
van acumulando en la pila hasta que se produce un return. A partir de ah� se
cierran en cadena y en orden inverso las llamadas pendientes.
La clase
Enzipador.java crea un fichero zip de un
directorio, recorriendo recursivamente su estructura para incluir los
subdirectorios. Puede se una clase �til para realizar copias de seguridad o
preparar env�os de datos.
public class
DirListOnly
{
public
static void main(String args[])
{
String dirname =
"/midirectorio";
File f1 =
new File(dirname);
FilenameFilter only = new OnlyExt("html");
String s[] = f1.list(only);
for (int i=0; i < s.length; i++)
{
System.out.println(s[i]);
}
}
}
public
OnlyExt(String ext)
{
this.ext = "." +
ext;
}
public boolean
accept(File dir, String name)
{
return
name.endsWith(ext);
}
}
7.- StreamTokenizer
public class
CuentaPalabras
{
public static int words=0;
public
static int lines=0;
public static int
chars=0;
public static
void cuenta(InputStream f) throws IOException
{
StreamTokenizer tok = new StreamTokenizer(f);
tok.resetSyntax();
tok.wordChars(33, 255);
tok.whitespaceChars(0, ' ');
tok.eolIsSignificant(true);
while (tok.nextToken() !=
tok.TT_EOF)
{
switch (tok.ttype)
{
case tok.TT_EOL:
lines++;
chars++;
break;
case tok.TT_WORD:
words++;
default:
chars +=
tok.sval.length();
break;
}
}
}
public static
void main(String args[])
{
if (args.length == 0) //
se trabaja con stdin
{
try
{
cuenta(System.in);
System.out.println(lines + "
" + words + " " + chars);
}
catch
(IOException e) {};
}
else
{
int twords = 0, tchars =
0, tlines = 0;
for (int i=0; i<args.length; i++)
{
try
{
words = chars =
lines = 0;
cuenta(new
FileInputStream(args[i]));
twords +=
words;
tchars +=
chars;
tlines +=
lines;
System.out.println(args[i] + ": " +
lines + " " + words + " " + chars);
}
catch (IOException
e)
{
System.out.println(args[i] + ": error.");
}
}
System.out.println("total: "
+
tlines + " "
+ twords + " " + tchars);
}
}
}
8.- Ficheros indexados con Java
Unidad anterior - Unidad siguiente
Copyright DENVIR STUDIOS �
Lima - Per�, 2002