Java - 文件和 I/O
java.io 包几乎包含了您在 Java 中执行输入和输出 (I/O) 时可能需要的所有类。所有这些流代表一个输入源和一个输出目的地。 java.io包中的流支持原语、对象、本地化字符等多种数据。
流
流可以定义为数据序列。有两种 Streams -
-
输入流 − InputStream 用于从源中读取数据。
-
输出流 − OutputStream 用于将数据写入目的地。
Java 为与文件和网络相关的 I/O 提供了强大而灵活的支持,但本教程涵盖了与流和 I/O 相关的非常基本的功能。我们将一一看到最常用的示例 -
字节流
Java 字节流用于执行 8 位字节的输入和输出。虽然有很多与字节流相关的类,但最常用的类是 FileInputStream 和 FileOutputStream .以下是利用这两个类将输入文件复制到输出文件的示例 -
示例
import java.io.*; public class CopyFile { public static void main(String args[]) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
现在让我们有一个文件 input.txt 具有以下内容 -
This is test for copy file.
下一步,编译并执行上面的程序,这将导致创建 output.txt 文件,其内容与我们在 input.txt 中的内容相同。因此,让我们将上面的代码放在 CopyFile.java 文件中并执行以下操作 -
$javac CopyFile.java $java CopyFile
字符流
Java 字节 流用于执行 8 位字节的输入和输出,而 Java Character 流用于执行 16 位 unicode 的输入和输出。虽然有很多与字符流相关的类,但最常用的类是 FileReader 和 FileWriter .虽然在内部 FileReader 使用 FileInputStream 而 FileWriter 使用 FileOutputStream 但这里的主要区别是 FileReader 一次读取两个字节,而 FileWriter 一次写入两个字节。
我们可以重写上面的例子,利用这两个类将一个输入文件(包含 unicode 字符)复制到一个输出文件中 -
示例
import java.io.*; public class CopyFile { public static void main(String args[]) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
现在让我们有一个文件 input.txt 具有以下内容 -
This is test for copy file.
下一步,编译并执行上面的程序,这将导致创建 output.txt 文件,其内容与我们在 input.txt 中的内容相同。因此,让我们将上面的代码放在 CopyFile.java 文件中并执行以下操作 -
$javac CopyFile.java $java CopyFile
标准流
所有编程语言都支持标准 I/O,用户的程序可以从键盘获取输入,然后在计算机屏幕上产生输出。如果您知道 C 或 C+;+编程语言,那么您必须知道三个标准设备 STDIN、STDOUT 和 STDERR。同样,Java 提供以下三个标准流 -
-
标准输入 − 这用于将数据提供给用户程序,通常使用键盘作为标准输入流并表示为 System.in .
-
标准输出 − 这用于输出用户程序产生的数据,通常使用计算机屏幕作为标准输出流,表示为System.out .
-
标准错误 − 这用于输出用户程序产生的错误数据,通常使用计算机屏幕作为标准错误流,表示为System.err .
以下是一个简单的程序,它创建 InputStreamReader 读取标准输入流,直到用户键入“q” -
示例
现场演示import java.io.*; public class ReadConsole { public static void main(String args[]) throws IOException { InputStreamReader cin = null; try { cin = new InputStreamReader(System.in); System.out.println("Enter characters, 'q' to quit."); char c; do { c = (char) cin.read(); System.out.print(c); } while(c != 'q'); }finally { if (cin != null) { cin.close(); } } } }
让我们将上面的代码保存在 ReadConsole.java 文件中,并尝试编译并执行它,如下面的程序所示。该程序继续读取并输出相同的字符,直到我们按下 'q' -
$javac ReadConsole.java $java ReadConsole Enter characters, 'q' to quit. 1 1 e e q q
读写文件
如前所述,流可以定义为数据序列。 输入流 用于从源和 OutputStream 读取数据 用于将数据写入目的地。
这是处理输入和输出流的类层次结构。
两个重要的流是 FileInputStream 和 FileOutputStream ,这将在本教程中讨论。
文件输入流
此流用于从文件中读取数据。可以使用关键字 new 创建对象 并且有几种类型的构造函数可用。
以下构造函数将文件名作为字符串创建输入流对象以读取文件 -
InputStream f = new FileInputStream("C:/java/hello");
下面的构造函数接受一个文件对象来创建一个输入流对象来读取文件。首先,我们使用 File() 方法创建一个文件对象,如下所示 -
File f = new File("C:/java/hello"); InputStream f = new FileInputStream(f);
一旦你有 InputStream 对象在手,然后有一个辅助方法列表,可用于读取流或对流执行其他操作。
Sr.No. | 方法和说明 |
---|---|
1 | public void close() 抛出 IOException{} 此方法关闭文件输出流。释放与文件关联的任何系统资源。抛出 IOException。 |
2 | 受保护的 void finalize() 抛出 IOException {} 此方法清除与文件的连接。确保在不再引用此流时调用此文件输出流的 close 方法。抛出 IOException。 |
3 | public int read(int r)throws IOException{} 该方法从 InputStream 中读取指定字节的数据。返回一个整数。返回下一个字节的数据,如果是文件末尾则返回-1。 |
4 | public int read(byte[] r) 抛出 IOException{} 此方法将 r.length 字节从输入流中读取到数组中。返回读取的总字节数。如果是文件末尾,则返回-1。 |
5 | public int available() 抛出 IOException{} 给出可以从此文件输入流中读取的字节数。返回一个整数。 |
还有其他重要的输入流可用,更多细节可以参考以下链接 -
-
字节数组输入流
-
数据输入流
文件输出流
FileOutputStream 用于创建文件并将数据写入其中。如果文件不存在,流将创建一个文件,然后再打开它进行输出。
这里有两个构造函数可以用来创建 FileOutputStream 对象。
以下构造函数将文件名作为字符串创建输入流对象以写入文件 -
OutputStream f = new FileOutputStream("C:/java/hello")
下面的构造函数接受一个文件对象来创建一个输出流对象来写入文件。首先,我们使用 File() 方法创建一个文件对象,如下所示 -
File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);
一旦你有 OutputStream 对象在手,然后是一个辅助方法列表,可以用来写入流或对流进行其他操作。
Sr.No. | 方法和说明 |
---|---|
1 | public void close() 抛出 IOException{} 此方法关闭文件输出流。释放与文件关联的任何系统资源。抛出 IOException。 |
2 | 受保护的 void finalize() 抛出 IOException {} 此方法清除与文件的连接。确保在不再引用此流时调用此文件输出流的 close 方法。抛出 IOException。 |
3 | public void write(int w)throws IOException{} 该方法将指定的字节写入输出流。 |
4 | 公共无效写入(字节[] w) 将上述字节数组中的 w.length 个字节写入 OutputStream。 |
还有其他重要的输出流可用,更多细节可以参考以下链接 -
-
字节数组输出流
-
数据输出流
示例
以下是演示 InputStream 和 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"); } } }
上面的代码将创建文件 test.txt 并以二进制格式写入给定的数字。标准输出屏幕上的输出也是如此。
文件导航和 I/O
我们将学习其他几个课程来了解文件导航和 I/O 的基础知识。
-
文件类
-
文件阅读器类
-
FileWriter类
Java 中的目录
目录是一个文件,它可以包含其他文件和目录的列表。您使用 文件 对象创建目录,列出目录中可用的文件。有关完整的详细信息,请查看您可以在 File 对象上调用的所有方法的列表以及与目录相关的内容。
创建目录
有两个有用的文件 实用方法,可用于创建目录 -
-
mkdir( ) 方法创建一个目录,成功返回 true,失败返回 false。失败表示File对象中指定的路径已经存在,或者因为整个路径还不存在而无法创建目录。
-
mkdirs() 方法创建一个目录和该目录的所有父目录。
以下示例创建“/tmp/user/java/bin”目录 -
示例
import java.io.File; public class CreateDir { public static void main(String args[]) { String dirname = "/tmp/user/java/bin"; File d = new File(dirname); // Create directory now. d.mkdirs(); } }
编译执行以上代码,创建“/tmp/user/java/bin”。
注意 − Java 根据约定自动处理 UNIX 和 Windows 上的路径分隔符。如果在 Windows 版本的 Java 上使用正斜杠 (/),路径仍将正确解析。
列出目录
您可以使用 list( ) 文件提供的方法 对象列出目录中可用的所有文件和目录,如下所示 -
示例
import java.io.File; public class ReadDir { public static void main(String[] args) { File file = null; String[] paths; try { // create new file object file = new File("/tmp"); // array of files and directory paths = file.list(); // for each name in the path array for(String path:paths) { // prints filename and directory name System.out.println(path); } } catch (Exception e) { // if any error occurs e.printStackTrace(); } } }
这将根据您的 /tmp 中可用的目录和文件产生以下结果 目录 -
输出
test1.txt test2.txt ReadDir.java ReadDir.class
java