Java - 文件I/O

Java - 文件I/O 首页 / Java入门教程 / Java - 文件I/O

java.io包含几乎所有在Java中执行输入和输出(I/O)所需的类。所有这些Stream都表示输入源和输出目的地。java.io包中的流支持许多数据,如primitives、object、localized字符等。

Stream 流

Stream可以定义为数据序列。 有两种流-

  • InPutStream     - InputStream用于从源读取数据。

  • OutPutStream  - OutputStream用于将数据写入目标。

Streams

JAVA为与文件和网络相关的I/O提供了强大而灵活的支持,但本教程涵盖了与流和I/O相关的非常基本的功能。无涯教程将逐个查看最常用的示例-

Byte Streams

Java byte streams 用于执行8位字节的输入和输出。 尽管有许多与字节流相关的类,但最常用的类是FileInputStreamFileOutputStream。 以下是利用这两个类将输入文件复制到输出文件的示例-

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

Character Streams

Java byte stream 用于执行8位字节的输入和输出,而Java Character streams 用于执行16位unicode的输入和输出。 尽管有许多与字符流相关的类,但最常用的类是FileReaderFileWriter。 尽管在内部FileReader使用FileInputStreamFileWriter使用FileOutputStream,但是这里的主要区别在于FileReader一次读取两个字节,而FileWriter一次写入两个字节。

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

Standard Streams

所有的编程语言都提供对标准I/O的支持,其中用户程序可以从键盘上获取输入,然后在计算机屏幕上产生输出。 如果您了解C或C ++编程语言,则必须了解三种标准设备STDINSTDOUTSTDERR。 类似地,Java提供了以下三个标准流-

  • Standard Input     - 用于将数据发送到用户的程序,通常使用键盘作为标准输入流并表示为system.in。

  • Standard Output  -用于输出用户程序产生的数据,通常计算机屏幕用于标准输出流并表示为System.out。

  • Standard Error     -用于输出用户程序产生的错误数据,通常计算机屏幕用于标准错误流并表示为System.err。

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用于将数据写入目标。

下面是处理输入和输出流的类层次结构。

Files IO

FileInputStream

此流用于从文件读取数据。 可以使用关键字new创建对象 ,并且有几种可用的构造函数。

下面的构造函数将文件名作为字符串,以创建一个输入流对象来读取文件-

InputStream f=new FileInputStream("C:/java/hello");

下面的构造函数接受一个文件对象来创建一个输入流对象来读取文件。首先,无涯教程使用File()方法创建一个文件对象 ,如下所示-

File f=new File("C:/java/hello");
InputStream f=new FileInputStream(f);
Sr.No.Method & Remark
1

public void close() throws IOException{}

链接:https://www.learnfk.comhttps://www.learnfk.com/java/java-files-io.html

来源:LearnFk无涯教程网

此方法关闭文件输出流,释放与文件关联的任何系统资源,引发IOException。

2

protected void finalize() throws IOException{}

此方法清理与文件的连接,确保在没有对此流的引用时调用此文件输出流的Close方法。引发IOException。

3

public int read(int R) throws IOException{}

此方法从InputStream读取指定的数据字节,返回一个整数。 返回数据的下一个字节,如果在文件末尾,则返回-1。

4

public int read(byte[] r) throws IOException{}

此方法将输入流中的r.length字节读取到数组中,返回读取的总字节数。如果是文件的结尾,将返回-1。

5

public int available() throws IOException{}

给出可以从此文件输入流中读取的字节数。返回int。

还有其他重要的输入流(inputStream)可用,有关更多详细信息,请参阅以下链接-

FileOutputStream

FileOutputStream用于创建文件并将数据写入其中。 在打开流进行输出之前,流将创建一个文件(如果尚不存在)。

这是两个可用于创建FileOutputStream对象的构造函数。

OutputStream f=new FileOutputStream("C:/java/hello") 

下面的构造函数接受一个文件对象来创建一个输出流对象来写入文件。首先,无涯教程使用File()方法创建一个文件对象 ,如下所示-

File f=new File("C:/java/hello");
OutputStream f=new FileOutputStream(f);
Sr.No.Method & Remark
1

public void close() throws IOException{}

链接:https://www.learnfk.comhttps://www.learnfk.com/java/java-files-io.html

来源:LearnFk无涯教程网

此方法关闭文件输出流,释放与文件关联的任何系统资源,引发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。

还有其他重要的输出流(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的基础知识。

Java 目录

目录是一个文件,它可以包含其他文件和目录的列表,使用文件对象创建目录,列出目录中可用的文件。

创建目录

有两个有用的文件实用程序方法,可用于创建目录-

  • mkdir()   -  方法创建一个目录,成功时返回true,失败时返回false。

  • 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);
      
      //现在创建目录。
      d.mkdirs();
   }
}

编译并执行以上代码以创建 "/tmp/user/java/bin".

注意UNIX JAVA根据约定自动处理Windows上的路径分隔符。如果在Windows版本的Java上使用正斜杠(/),路径仍然可以正确解析。

列出目录

对象提供的List()方法列出目录中所有可用的文件和目录,如下所示-

import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;
  
      try {      
         //创建新的文件对象
         file = new File("/tmp");

         //文件和目录数组
         paths = file.list();

         //对于路径数组中的每个名称
         for(String path:paths) {
            //打印文件名和目录名
            System.out.println(path);
         }
      } catch (Exception e) {
         //if any error occurs
         e.printStackTrace();
      }
   }
}

这将根据/tmp目录-中提供的目录和文件产生以下输出

test1.txt
test2.txt
ReadDir.java
ReadDir.class

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

苏杰的产品创新课 -〔苏杰〕

职场求生攻略 -〔臧萌〕

手机摄影 -〔@随你们去〕

容器实战高手课 -〔李程远〕

A/B测试从0到1 -〔张博伟〕

手把手教你玩音乐 -〔邓柯〕

手把手带你搭建秒杀系统 -〔佘志东〕

反爬虫兵法演绎20讲 -〔DS Hunter〕

运维监控系统实战笔记 -〔秦晓辉〕

好记忆不如烂笔头。留下您的足迹吧 :)