- FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名。
- 创建FileInputStream实例对象时,指定的文件应当是存在和可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中的原来内容将被覆盖清除。
- 对同一个磁盘文件创建FileInputStream对象的两种方式: (1)FileInputStream inOne = new FileInputStream("hello.test"); (2)File f = new File("hello.test"); FileInputStream inTwo = new FileInputStream(f);
- 创建FileOutputStream实例对象时,可以指定还不存在的文件名,但不能指定一个已被其他程序打开了的文件。
思考:要将A文件的内容写入B文件,在程序代码中,是用输出类对象,还是用输入类对象来连接A文件并完成对A文件的操作呢?
(要记住:这里说的输入和输出的概念都是相对这个应用程序而言的,而不相对这个文件而言的。如下图)
所以我们应该创建一个输入类来读取A文件的内容,然后创建一个输出类将这些内容输出到B文件中。(如下图)
编程实例:用FileOutputStream类向文件中写入一个串字符,然后用FileInputStream读出写入的内容。
//FileStream.java
import java.io.*;
public class FileStream{
public static void main(String[] args) throws Exception {
FileOutputStream out = new FileOutputStream("hello.txt");
out.write("www.sina.com.cn".getBytes()); //把字符串转化为字节数组并写入到流中
out.close();
byte[] buf = new byte[1024];
File f = new File("hello.txt");
FileInputStream in = new FileInputStream(f);
int len = in.read(buf); //读取内容到字节数组中
System.out.println(new String(buf,0,len)); //String构造函数把字节数组转化为字符串
in.close();
}
}
Reader类和Writer类
- Reader和Writer是所有字符流类的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据。
- 二进制文件和文本文件的区别。严格的说文件系统中的每个文件都是二进制文件。各种文本字符是由一个或几个字节组成的,其中每个字节的数 据不能是任意的。如果一个文件中的每个字节或每相邻的几个字节中的数据都可以表示成某种字符,我们就可以称这个文件为文本文件。可见文本文件只是二进制文 件的一种特例。为了与文本文件相区别,人们又把文本文件以外的文件称之为二进制文件。在概念上我们可以简单的认为:如果一个文件专用于存储文本字符而没有 包含字符之外的其他数据,就称之为文本文件,除此之外的文件就是二进制文件。
文本文件是指完全由可见字符组成的文件。所谓可见字符是指ASCII码为32到126的字符、回车符(ASCII码13)、换行符(ASCII码10)、制表符(ASCII码9)、以及所有汉字字符(当然也包括其他字符集如韩文、日文、阿拉伯文等等)。如果是Unicode文本,则还包括ASCII码0。
而二进制文件则有多种定义方式,广义的二进制文件是指电脑中的所有文件(包括文本文件),因为电脑中的所有文件其实都是以二进制方式存储的,也就是说每个字符(包括可见字符、控制字符)最终都是以0和1的形式存储在硬盘等介质中的(这也就是为什么说电脑只认识0和1这两个数字的原因);
而狭义的二进制文件则是相对于文本文件而言的,即只要文件中含有除可见字符之外的其他字符(主要是控制字符),就是二进制文件;
而比狭义的二进制文件更有特指性的定义方式则是指可执行文件(EXE)、库函数文件(DLL)、图片视频、数据库文件等等一切由程序代码、机器码、特定的二进制代码和数据等组成的有实际意义的文件。
Reader与Writer类及其子类(FileReader和FileWriter类等)主要用于读取文本格式的内容,而InputStream和OutputStream类及它们的子类主要读取二进制格式的内容。
编程实例:用FileWriter类向文件中写入一个串字符,然后用FileReader读出写入的内容。
//FileStream2.java
import java.io.*;
public class FileStream2{
public static void main(String[] args) throws Excetpion {
FileWriter out = new FileWriter("hello2.txt");
out.write("www.sina.com.cn"); //在此可以直接写入字符串,不用转化为字节数组
out.close();
char[] buf = new char[1024]; //字符数组
FileReader in = new FileReader("hello2.txt");
int len = in.read(buf); //此时的read方法可以读取一个字符或几个字符,len代表实际读取到的字符的个数。
System.out.println(new String(buf,0,1024)); //String构造函数把字符数组转化为字符串。
in.close();
}
}
FileInputStream 用于读取本地文件中的字节数据,继承自InputStream类
构造方法摘要 | |
---|---|
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象 file 指定。 |
|
FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。 |
|
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。 |
方法摘要 | |
---|---|
int |
available() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 |
void |
close() 关闭此文件输入流并释放与此流有关的所有系统资源。 |
protected void |
finalize() 确保在不再引用文件输入流时调用其 close 方法。 |
FileChannel |
getChannel() 返回与此文件输入流有关的唯一 FileChannel 对象。 |
FileDescriptor |
getFD() 返回表示到文件系统中实际文件的连接的 FileDescriptor 对象,该文件系统正被此FileInputStream 使用。 |
int |
read() 从此输入流中读取一个数据字节。 |
int |
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 |
int |
read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 |
long |
skip(long n) 从输入流中跳过并丢弃 n 个字节的数据。 |
其中read()
返回的是读入的一个字节所对应的int值(0-255),而read(byte[] b)
和read(byte[] b, int off, int len)
返回的是读入的字节数
FileOutputStream用于将字节数据写出到文件。继承自OutputStream类
构造方法摘要 | |
---|---|
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
|
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
|
FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。 |
|
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
|
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。 |
方法摘要 | |
---|---|
void |
close() 关闭此文件输出流并释放与此流有关的所有系统资源。 |
protected void |
finalize() 清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close 方法。 |
FileChannel |
getChannel() 返回与此文件输出流有关的唯一 FileChannel 对象。 |
FileDescriptor |
getFD() 返回与此流有关的文件描述符。 |
void |
write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 |
void |
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 |
void |
write(int b) 将指定字节写入此文件输出流。 |
实例代码:使用这两个类进行文件复制:
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- class IODemo
- {
- public static void main(String[] args)
- {
- try
- {
- //使用FileInputStream和FileOutputStream进行文件复制
- FileInputStream fis=new FileInputStream("a.txt");
- FileOutputStream fos=new FileOutputStream("b.txt");
- int read;
- //read=fis.read();
- byte b[]=new byte[1024];
- //读取文件,存入字节数组b,返回读取到的字符数,存入read,默认每次将b数组装满
- read=fis.read(b);
- while(read!=-1)
- {
- fos.write(b,0,read);
- read=fis.read(b);
- //read=fis.read();
- }
- fis.close();
- fos.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }