El paquete Java.io contiene casi todas las clases necesarias para operar la entrada y la salida. Todas estas clases de flujo representan fuentes de entrada y destinos de salida.
Las transmisiones en el paquete Java.io admiten muchos formatos, como tipos básicos, objetos, conjuntos de caracteres localizados, etc.
Una secuencia puede entenderse como una secuencia de datos. Un flujo de entrada representa la lectura de datos de una fuente y un flujo de salida representa la escritura de datos en un destino.
Java proporciona soporte potente y flexible para E/S, lo que lo hace más utilizado en transferencia de archivos y programación de redes.
Pero esta sección cubre las funciones más básicas relacionadas con transmisiones y E/S. Aprenderemos estas funciones a través de ejemplos uno por uno.
La entrada de la consola de Java la realiza System.in.
Para obtener una secuencia de caracteres vinculada a la consola, puede envolver System.in en un objeto BufferedReader para crear una secuencia de caracteres.
La siguiente es la sintaxis básica para crear un BufferedReader:
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
Después de crear el objeto BufferedReader, podemos usar el método read() para leer un carácter desde la consola, o el método readLine() para leer una cadena.
Para leer un carácter de un objeto BufferedReader, utilice el método read(), cuya sintaxis es la siguiente:
intread()throwsIOException
Cada vez que se llama al método read(), lee un carácter del flujo de entrada y devuelve ese carácter como un valor entero. Devuelve -1 cuando finaliza la transmisión. Este método arroja IOException.
El siguiente programa demuestra el uso del método read() para leer continuamente caracteres desde la consola hasta que el usuario ingresa "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'); } }
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
Leer una cadena desde una entrada estándar requiere utilizar el método readLine() de BufferedReader.
Su formato general es:
StringreadLine()throwsIOException
El siguiente programa lee y muestra líneas de caracteres hasta que ingresa la palabra "fin".
//使用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")); } }
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
Como se mencionó anteriormente, la salida de la consola se completa con print() y println(). Estos métodos están definidos por la clase PrintStream y System.out es una referencia al objeto de esta clase.
PrintStream hereda la clase OutputStream e implementa el método write(). De esta manera, write() también se puede utilizar para escribir operaciones en la consola.
PrintStream define write() en su forma más simple de la siguiente manera:
voidwrite(intbyteval)
Este método escribe los octetos inferiores de byteval en la secuencia.
El siguiente ejemplo utiliza write() para imprimir el carácter "A" seguido de un carácter de nueva línea en la pantalla:
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
Ejecute el ejemplo anterior para generar el carácter "A" en la ventana de salida.
A
Nota: El método write() no se usa con frecuencia porque los métodos print() y println() son más convenientes de usar.
Como se mencionó anteriormente, una secuencia se define como una secuencia de datos. El flujo de entrada se utiliza para leer datos del origen y el flujo de salida se utiliza para escribir datos en el destino.
La siguiente figura es un diagrama de jerarquía de clases que describe el flujo de entrada y el flujo de salida.
Las dos corrientes importantes que se analizarán a continuación son FileInputStream y FileOutputStream:
Esta secuencia se utiliza para leer datos de un archivo y sus objetos se pueden crear utilizando la palabra clave nueva.
Existen varios métodos constructores que se utilizan para crear objetos.
Puede utilizar un nombre de archivo de cadena para crear un objeto de flujo de entrada para leer el archivo:
InputStreamf=newFileInputStream("C:/java/hello");
También puede utilizar un objeto de archivo para crear un objeto de flujo de entrada para leer el archivo. Primero tenemos que crear un objeto de archivo usando el método File():
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
Después de crear un objeto InputStream, puede utilizar los siguientes métodos para leer la secuencia o realizar otras operaciones de secuencia.
número de serie | Métodos y descripción |
---|---|
1 | public void close() lanza IOException{} Cierra este flujo de entrada de archivo y libera todos los recursos del sistema relacionados con este flujo. Lanza una IOException. |
2 | protected void finalize() lanza IOException {} Este método borra la conexión al archivo. Asegúrese de llamar al método de cierre del flujo de entrada del archivo cuando ya no se haga referencia a él. Lanza una IOException. |
3 | public int read(int r)throws IOException{} Este método lee bytes de datos específicos del objeto InputStream. Devuelto como un valor entero. Devuelve el siguiente byte de datos, o -1 si se ha llegado al final. |
4 | public int read(byte[] r) lanza IOException{} Este método lee r.length bytes del flujo de entrada. Devuelve el número de bytes leídos. Si es el final del archivo, se devuelve -1. |
5 | public int disponible() throws IOException{} Devuelve el número de bytes que se pueden leer de este flujo de entrada sin bloquearlo la siguiente llamada al método en este flujo de entrada. Devuelve un valor entero. |
Además de InputStream, existen otros flujos de entrada. Para obtener más detalles, consulte el siguiente enlace:
ByteArrayInputStream
Flujo de entrada de datos
Esta clase se utiliza para crear un archivo y escribir datos en el archivo.
Si el archivo de destino no existe antes de que la secuencia abra el archivo para su salida, la secuencia crea el archivo.
Hay dos constructores que se pueden utilizar para crear objetos FileOutputStream.
Cree un objeto de flujo de salida usando un nombre de archivo de cadena:
OutputStreamf=newFileOutputStream("C:/java/hello")
También puede utilizar un objeto de archivo para crear una secuencia de salida para escribir en el archivo. Primero tenemos que crear un objeto de archivo usando el método File():
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
Después de crear el objeto OutputStream, puede utilizar los siguientes métodos para escribir en la secuencia o realizar otras operaciones de secuencia.
número de serie | Métodos y descripción |
---|---|
1 | public void close() lanza IOException{} Cierra este flujo de entrada de archivo y libera todos los recursos del sistema relacionados con este flujo. Lanza una IOException. |
2 | protected void finalize() lanza IOException {} Este método borra la conexión al archivo. Asegúrese de llamar al método de cierre del flujo de entrada del archivo cuando ya no se haga referencia a él. Lanza una IOException. |
3 | public void write(int w)throws IOException{} Este método escribe los bytes especificados en el flujo de salida. |
4 | public void write(byte[] w) escribe los bytes de longitud w.length en la matriz especificada en OutputStream. |
Además de OutputStream, existen otros flujos de salida. Para obtener más detalles, consulte el siguiente enlace:
ByteArrayOutputStream
Flujo de salida de datos
A continuación se muestra un ejemplo que demuestra el uso de InputStream y 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"); } } }
El programa anterior primero crea el archivo test.txt, escribe el número dado en el archivo en formato binario y lo envía a la consola.
Dado que el código anterior está escrito en binario, es posible que haya caracteres confusos. Puede utilizar los siguientes ejemplos de código para resolver el problema del código confuso:
//文件名: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(); //关闭输入流,释放系统资源 } }
También hay algunas clases sobre archivos y E/S que también necesitamos saber:
Clase de archivo(clase)
Clase FileReader(clase)
Clase FileWriter(clase)
Hay dos métodos en la clase Archivo que se pueden usar para crear carpetas:
El método mkdir() crea una carpeta y devuelve verdadero si tiene éxito y falso si falla. El error indica que la ruta especificada por el objeto Archivo ya existe o que la carpeta no se puede crear porque la ruta completa aún no existe.
El método mkdirs() crea una carpeta y todas sus carpetas principales.
El siguiente ejemplo crea la carpeta "/tmp/user/java/bin":
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
Compile y ejecute el código anterior para crear el directorio "/tmp/user/java/bin".
Nota: Java resuelve automáticamente los separadores de rutas de archivos por convención en UNIX y Windows. Si usa el delimitador (/) en la versión Windows de Java, la ruta aún se analizará correctamente.
Un directorio es en realidad un objeto Archivo que contiene otros archivos y carpetas.
Si crea un objeto Archivo y es un directorio, llamar al método isDirectory() devolverá verdadero.
Puede extraer la lista de archivos y carpetas que contiene llamando al método list() en el objeto.
El ejemplo que se muestra a continuación ilustra cómo utilizar el método list() para comprobar el contenido de una carpeta:
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+"不是一个目录");
} } }
Los resultados de compilación y ejecución del ejemplo anterior son los siguientes:
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
Para eliminar un archivo, utilice el método java.io.File.delete().
El siguiente código eliminará el directorio /tmp/java/. Cabe señalar que al eliminar un determinado directorio, debe asegurarse de que no haya otros archivos en el directorio para eliminarlo correctamente; de lo contrario, la eliminación fallará.
Estructura del directorio de prueba:
/tmp/java/ |-- 1.registro |-- prueba
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(); } }