java.io包几乎包含了在Java中执行输入和输出(I/O)所需的所有类.所有这些流代表输入源和输出目的地. java.io包中的流支持许多数据,如基元,对象,本地化字符等.
可以定义流作为一系列数据.有两种Streams :
InPutStream : InputStream用于从源读取数据.
OutPutStream : 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文件,其内容与我们在输入中的内容相同.文本.所以让我们把上面的代码放在CopyFile.java文件中并执行以下 :
$javac CopyFile.java $java CopyFile
Java 字节流用于执行8的输入和输出-bit字节,而Java 字符流用于执行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 具有以下内容 :
这是对复制文件的测试.
下一步,编译上面的程序并执行它,这将导致创建output.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
如前所述,流可以定义为数据序列. InputStream 用于从源读取数据, 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()throws IOException {} 此方法关闭文件输出流.释放与该文件关联的所有系统资源.抛出IOException. |
2 | protected void finalize()throws IOException {} 此方法清除与文件的连接.确保在没有对此流的引用时调用此文件输出流的close方法.抛出IOException. |
3 | public int read(int r)throws IOException {} 此方法从InputStream读取指定的数据字节.返回一个int.返回数据的下一个字节,如果它是文件的末尾,则返回-1. |
4 | public int read(byte [] r)抛出IOException {} 此方法将输入流中的r.length个字节读入数组.返回读取的总字节数.如果它是文件的结尾,则返回-1. |
5 | public int available()抛出IOException {} 给出的数量可以从此文件输入流中读取的字节数.返回一个int. |
还有其他重要的输入流,更多细节你可以参考以下链接 :
ByteArrayInputStream
DataInputStream
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()throws IOException {} 此方法关闭文件输出流.释放与该文件关联的所有系统资源.抛出IOException. |
2 | protected void finalize()throws IOException {} 此方法清除与文件的连接.确保在没有对此流的引用时调用此文件输出流的close方法.抛出IOException. |
3 | public void write(int w)throws IOException {} 此方法将指定的字节写入输出流. |
4 | public void write(byte [] w) 将w.length个字节从上述字节数组写入OutputStream. |
还有其他重要的输出流可供使用,有关详细信息,请参阅以下链接 :
ByteArrayOutputStream
DataOutputStream
示例
以下是演示InputStream和OutputStream&minus的示例;
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并以二进制格式写出给定的数字.同样是stdout屏幕上的输出.
我们将要进行的其他几个类了解文件导航和I/O的基础知识.
文件类
FileReader课程
FileWriter Class
目录是一个文件,可以包含其他文件和目录的列表.使用文件对象创建目录,列出目录中可用的文件.有关完整的详细信息,请检查可以在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(); } } }
这将根据
输出
test1.txt test2.txt ReadDir.java ReadDir.class