S2/JAVA/10-File I/O

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S2/JAVA/10-File I/O相关的知识,希望对你有一定的参考价值。

java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。

 

File对象即可表示文件,也可表示目录。

 

创建一个File对象的语法格式如下:

File file=new File(String pathName);

其中,pathName表示所指向的文件路径名。

例如,“File file=new File("C:\\test.txt");”创建了一个指向C盘根目录下test.txt文本文件的对象。

需要注意的是,在windows操作系统中,文件路径名中的分隔符可以使用正斜杠“/”,如“C:/test.txt”也可以使用反斜杠“\”,但必须写成“\\”,其中第一个表示转义符,例如“C:\\test.txt”。

 

File对象是java.io包中引用磁盘文件的唯一对象。File类仅仅是描述File对象的属性,而并未说明数据是如何存储的。File类提供了一些重要的方法来管理文件或目录的属性,常用方法如下表所示:

File类的常用方法

方法名称

说明

boolean exists()

判断文件或目录是否存在

boolean isFile()

判断是否是文件

boolean isDirectory()

判断是否是目录

String getPath()

返回此对象表示的文件的相对路径名

String getAbsolutePath()

返回此对象表示的文件的绝对路径名

String getName()

返回此对象表示的文件或目录的名称

boolean delete()

删除此对象指定的文件或目录

boolean createNewFile()

创建名称的空文件,不创建文件夹

long length()

返回文件的长度,单位为字节,若文件不存在,则返回 0L

 

读文件,是指把文件中的数据读取到内存中。反之,写文件时把内存中的数据写到文件中。通过流去读写文件,流,是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。

 

当向一个流写入数据时,这个流被称为输出流,输出流可以将信息送往程序的外部。可以从一个输出流读取数据。

 

在java.io包中,封装了许多输入/输出流的API。在程序中,这些输入/输出流的类的对象称为流对象。可以通过这些流对象将内存中的数据以流的方式写入文件,也可通过流对象将文件中的数据以流的方式读取到内存。

流对象构造的时候往往会和数据源(如文件)联系起来。数据源分为源数据源和目标数据源。输入流联系的是源数据源,输出流联系的是目标数据源。

 

(1)按照不同的分类方式,可以将流分为不同的类型。

1、输入流:只能从中读取数据,而不能向其中写入数据。

2、输出流:只能向其中写入数据,而不能从中读取数据。

例如,数据从内存到硬盘,通常我们称为输出流。也就是说,这里的输入和输出,我们都是从程序运行所在的内存角度来划分的。

Java的输出流主要由OutputStream和Writer作为基类,而输入流则主要由InputStream和Reader作为基类。

(2)按照所操作的数据单元的不同,流又可划分为字节流和字符流。

字节流操作的最小数据单元为8位的字节,而字符流操作的最小数据单元是16位的字符。

字节流和字符流的区分非常简单、字节流建议用于二进制数据(如图片),而字符流用于文本,它们的用法几乎是完全一样的。

按照流的流向,我们还可以对字节流和字符流继续进行划分,分出字节输入流、字节输出流,字符输入流、字符输出流。

 

  • 字节输入流InputStream类

字节输入流InputStream的作用就是将文件中的数据输入到内部存储器(简称内存)中,它提供了一系列和读取数据有关的方法,常用方法如下:

读取数据的常用方法

方法名称

说明

int read()

读取一个字节数据

int read(byte[] b)

将数据读取到字节数组中

int read(byte[] b,int off,int len)

从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始

void close()

关闭输入流

int available

返回输入流读取的估计字节数

 

无参的read()方法从输入流读取1个8位的字节,把它转换为0~255之间的整数返回。

有参的两个read()方法从输入流批量读取若干个字节。在从文件或键盘读数据时,采用read(byte[] b)或read(byte[] b,int off,int len)方法可以减少进行物理读文件或键盘的次数,提高输入/输出操作效率。

 

  • 直接输入流FileInputStream类

在实际应用中,我们通常使用InputStream的子类FileInputStream类来实现文本文件内容的读取,常用的构造方法有以下两个。

1、FileInputStream(File file)。

其中,file指定文件数据源。使用此构造方法创建文件输入流对象如下。

File file=new File("C:\\test.txt");

InputStream fileObject=new FileInputStream(file);

此时的文件输入流对象fileObject就和源数据源(C:\\test.txt文件)联系起来了。

2、FileInputStream(String name)。

其中,name指定文件数据源,包含路径信息。使用此构造方法创建文件输入流对象如下。

(File)InputStream in=new FileInputStream("C:\\test.txt");

3、使用FileInputStream读取文本文件的具体使用步骤如下。

(1)引入相关的类。

import java.io.IOException;

import java.io.InputStream;

import java.io.FileInputStream;

(2)创建一个文件输入流对象。

InputStream fileObject=new FileInputStream("C:\\test.txt");

(3)利用文件输入流的方法读取文本文件的数据。

fileObejct.available();                           //可读取的字节数

fileObject.read();                                  //读取文件的数据

(4)关闭文件输入流对象。

fileObject.close()

 

使用FileInputStream类读文件数据时应注意以下几个方面。

(1)read()方法返回整数,若读取的是字符串,则需强制类型转换。例如,若想法正确输出“abc”,则需将输出语句修改为“System.out.print((char)data+"");”。

(2)流对象使用完毕后需要关闭。

 

 

10.3.2使用字节流写文本文件

1、字节输出流OutputStream类

字节输出流OutputStream的作用是把内存中的数据输出到文件中,它提供了一系列向文件中写数据有关的方法,常用的方法如下所示。

OutputStream类的常用方法

方法名称

说明

void write(int c)

写入一个字节数据

void write(byte[] buf)

写入数组buf的所有字节

void write(byte[] b,int off,int len)

将字节数组中从off位置开始,长度为len的字节数据输出到输出流中

void close()

关闭输出流

2、字节输出流FileOutputStream类

在实际应用中,我们通常使用OutputStream的子类FileOutputStream类来实现向文本文件写入数据,常用的构造方法有3个。

(1)FileOutputStream(File file)。

其中,file指定文件目标数据源。使用此构造方法创建文件输出流对象如下。

File file=new File("C:\\test.txt");

FileOutputStream fos=new FileOutputStream(file);

此时的文件输出流对象fos就和目标数据源(C:\\test.txt文件)联系起来了。

(2)FileOutputStream(String name)。

其中,name指定文件目标数据源,包含路径信息。使用此构造方法创建文件输出流对象如下。

FileOutputStream fos=new FileOutputStream("C:\\test.txt");

(3)FileOutputStream(String name,boolean append).

其中,name指定文件目标数据源,包含路径信息。append表示是否在文件末尾添加数据,若设置为true,则在文件末尾添加数据。使用此构造方法创建文件输出流对象如下。

FileOutputStream fos=new FileOutputStream("C:\\test.txt",true);

需要注意的是,第一种和第二种构造方法在向文件写数据时将覆盖文件中原有的内容。另外,在使用FileOutputStream的构造方法创建FileOutputStream实例时,如果相应的文件并不存在,就会自动创建一个空的文件。若参数file或name表示的文件路径尽管存在,但是代表一个文件目录,这次是会抛出FileNotFoundException异常。

3、使用FileOutputStream写文本文件

使用FileOutputStream向文本文件中写入数据的具体使用步骤如下。

(1)引入相关的类。

import java.io.IOException;

import java.io.OutputStream;

import java.io.FileOutputStream;

(2)构造一个文件输出流对象。

OutputStream fos=new FileOutputStream("C:\\test.txt");

(3)利用文件输出流的方法把数据写入文本文件中。

String str="好好学习Java";

byte[] words=str.getByte();

//利用write方法将数据写入到文件中去

fos.write(word,0,words.length);

(4)关闭文件输出流。

fos.close();

 

注意:首先将要写入文件的字符串通过getByte()方法转换成字节数组words,然后调用输出流对象的write()方法,将字节数组words中的内容添加到文件为C:\myDoc\hello.txt的末尾。

 

10.3.4使用字符流读取文本文件

1、字符输入流Reader类

Reader类是读取字符流的抽象类,它提供了常用的方法

Reader类常用方法

方法名称

说明

int read()

从输入流中读取单个字符

int read(byte[] c)

从输入流中读取c.length长度的字符,保存到字符数组c中,返回实际读取的字符数

read(char[] c,int off,int len)

从输入流中读取最多len的长度字符,保存到字符数组c中,保存的位置从off位置开始,返回实际读取的字符长度

void close()

关闭流

2、字符输入流FileReader类

FileReader类是Reader的子类,常用的构造方法格式如下。

FileReader(String fileName)

其中,fileName是指要从中读取数据的文件的名称。使用此构造方法创建字符输入流对象如下。

Reader fr=new FileReader("C:\\myTest.txt");

3、使用FileReader读取文件

使用字符流类FileReader读取文本文件的具体步骤如下。

(1)引入相关的类。

import java.io.Reader;

import java.io.FileReader;

import java.io.IOException;

(2)创建一个FileReader对象。

Reader fr=new FileReader("C:\\myTest.txt");

(3)利用FileReader类的方法读取文本文件的数据。

int read();                 //读取单个字符

(4)关闭相关的流对象。

fr.close();

4、字符输入流BufferReader类

BufferReader类是Reader类的子类,他与FileReader类的主要区别在于,BufferReader类带有缓冲区,它可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据,避免每次都从数据源读取数据进行字符编码转换,从而提高读取操作的效率。BufferReader类常用的构造方法格式如下。

BufferReader(Reader in)

使用此构造方法创建字符输入对象如下。

Reader fr=new FileReader("C:\\myTest.txt");

BufferReader br=new BufferReader(fr);

其中,br就是创建的一个使用默认大小输入缓冲区的缓冲字符输入流。

5、使用FileReader和BufferReader读取文本文件

使用字符流类BufferReader和FileReader读取文本文件的具体步骤如下。

(1)引入相关的类。

import java.io.FileReader;

import java.io.BufferReader;

import java.io.IOException;

(2)创建一个BufferReader对象。

Reader fr=new FileReader("C:\\myTest.txt");

BufferReader br=new BufferReader(fr);

(3)利用BufferReader类的方法读取文本文件的数据。

br.readLine();                                      //读取一行数据,返回字符串

(4)关闭相关的流对象。

br.close();

fr.close();

 

10.3.5使用字符流写文本文件

1、字符输出流Writer类

Writer类是向文件写入数据的字符流,它提供了常用的方法

Writer类常用方法

方法名称

说明

write(String str)

将str字符串里包含的字符输出到指定的输出流中

write(String str,int off,int len)

将str字符串里从off位置开始长度为len的字符输出到输出流中

void close()

关闭输出流

void fulsh()

刷新输出流

2、字符输出流FileWriter类

FileWriter类是writer的子类,常用的构造方法格式如下。

FileWriter(String fileName)

其中,fileName表示与系统有关的文件名,使用此构造方法创建字符输出流对象如下。

Writer fr=new FileWriter("C:\\myTestr.txt");

3、使用FileWriter写文本文件

使用字符流类FileWriter将数据写入文本文件的具体操作步骤如下。

(1)引入相关的类。

import java.io.FileWriter;

import java.io.IOException;

(2)创建一个FileWriter对象。

Writer fw=new FileWriter("C:\\myTest.txt");

(3)利用FileWriter类的方法写文本文件。

fw.write("hello");

(4)相关流对象的清空和关闭。

fw.flush();                    //刷新该流的缓冲

fw.close();                    //关闭此流

4、字符输入流BufferedWriter类

BufferedWriter是Writer的子类。BufferedWriter与BufferedReader的流方向正好相反,BufferedWriter是把一批数据写到缓冲区,当缓冲区满的时候,再把缓冲区的数据写到字符输出流中。这可以避免每次都执行物理写操作,从而提高输入/输出操作的效率。BufferedWriter类的常用构造方法如下。

BufferedWriter(Writer out)

使用此构造方法创建字符输出流对象如下。

Writer fw=new FileWriter("C:\\myTest.txt");

BufferedWriter bw=new BufferedWriter(fw);

其中,bw就是创建的使用默认大小输出缓冲字符输出流。

5、使用BufferedWriter和FileWriter写文本文件

使用字符流类BufferedWriter和FileWriter将数据写入文本文件的具体操作步骤如下。

(1)引入相关的类。

import java.io.FileWriter;

import java.io.BufferedWriter;

import java.io.IOException;

(2)构造一个BufferedWriter对象。

FileWriter fw=new FileWriter("C:\\myTest.txt");

BufferedWriter bw=new BufferedWriter(fw);

(3)利用BufferedWriter类的方法写文本文件。

Bw.write("hello");

(4)相关流对象的晴空和关闭。

bw.flush();                                      //刷新该流的缓冲

fw.close();                                      //关闭此流

 

注意:

示例中使用了“bw.newLine()”,newLine()方法是BufferedWriter类中的方法,作用是插入一个换行符。

在操作上字节流与字符流有一个区别,字符流在操作时使用了缓冲区(内部存储器),而字节流在操作时是直接操作文件的,不会使用到缓冲区。

 

10.4.1使用字节流类DataInputStream读二进制文件

DataInputStream类是FileInputStream的子类,他是FileInputStream类的扩展。利用DataInputStream类读取二进制文件的实现步骤其实与用FileInputStream类读取文本文件的步骤极其相似,而且还要使用到FileInputStream类。

具体操作步骤如下。

(1)引入相关的类。

import java.io.FileInputStream;

import java.io.DataInputStream;

(2)构造一个数据输入流对象。

FileInputStream fis=new FileInputStream("C:\\HelloWord.class");

DataInputStream dis=new DataInputStream(fis);

(3)利用数据输入流类的方法读取二进制文件的数据。

dis.read();                     //读取数据字节

(4)关闭数据输入流。

dis.close();                    //关闭数据输入流

 

10.4.2使用字节流类DataOutputStream写二进制文件

DataOutputStream类是FileOutputStream的子类,他是FileOutputStream类的扩展。利用DataOutputStream类写二进制文件的实现步骤其实与用FileOutputStream类写文本文件的步骤极其相似,而且还要用到FileOutputStream类。具体操作步骤如下。

(1)引入相关的类。

import java.io.FileOutputStream;

import java.io.DataOutputStream;

(2)构造一个数据输出流对象。

FileOutputStream outFile=new FileOutputStream("C:\\temp.class");

DataOutputStream out=new DataOutputStream(outFile);

(3)利用数据输出流类的方法写二进制的数据。

out.write(1);                         //将指定字节数据写入二进制文件

(4)关闭数据输出流。

out.close();

 

资料:

DataInputStream类与DataOutputStream类搭配使用,可以按照与平台无关的方式从流中读取基本数据类型的数据,如int、float、long、double和boolean等。此外,DataInputStream的readUTF()方法能读取采用utf-8字符编码的字符串。

关键代码如下所示。

FileOutputStream out1=new FileOutputStream("D:\\myDoc\\hello.txt");

BufferedOutputStream out2=new BufferedOutputStream(out1);

DataOutputStream out=new DataOutputStream(out2);

out.writeByte(1);

out.writeLong(2);

out.writeChar(‘c‘);

out.writeUTF("hello");

 

DataOutputStream类可以按照与平台无关的方式向流中写入基本数据类型的数据,如int、float、long、double和boolean等。此外,DataOutputStream的writeUTF()方法能写入采用UTF-8字符编码的字符串。

DataOutputStream类的说有些方法都是以write开头,如writeByte()、writeLong()等方法。

关键代码如下所示。

FileInputStream in1=new FileInputStream("D:\\myDoc\\hello.txt");

BufferedInputStream in2=new BufferedInputStream(in1);

DataInputStream in=new DataInputStream(in2);

System.out.println(in.readByte());

System.out.println(in.readLong());

System.out.println(in.readChar());

System.out.println(in.readUTF());

以上是关于S2/JAVA/10-File I/O的主要内容,如果未能解决你的问题,请参考以下文章

I/OFile常见用法总结