Java文件输入输出及其常用类
对于一个应用程序来说什么是最重要的?数据!数据一般存放在文件、数据库中,今天介绍java中关于文件操作的一些常用类,学好文件操作是很有必要的。
字节输入输出流
FileInputStream
查看源码,可以看到它是继承自InputStream类
public
class FileInputStream extends InputStream
它用于从文件中读取数据,以字节为单位
一、初始化创建输入流对象
1.传入文件路径字符串
public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}
查看源码我们可以看到,我们传入路径字符串后它会使用这个字符串生成文件对象
代码示例
FileInputStream is=new FileInputStream("D:\\test01.txt");
2.传入文件对象
public FileInputStream(File file)
我们也可以传入一个文件对象,他就会绑定到这个文件对象指定的文件
File file1=new File("D:\\test01.txt");
FileInputStream is=new FileInputStream(file1);
二、读取数据
1. public int read()
从文件中读取一个字节的数据,返回类型为int,如果文件此时为空则返回-1
File file1=new File("D:\\test01.txt");
FileInputStream is=new FileInputStream(file1);
int x=0;
while(x!=-1){
x=is.read();
System.out.println((char)x);
}
例如用上面这种操作可以循环读取,直到读取完毕整个数组
2.public int read(byte b[])
这个方法读取数组b长度大小的字节,并且返回成功读取字节的个数,如果已经到了文件末尾则返回-1
File file1=new File("D:\\test01.txt");
FileInputStream is=new FileInputStream(file1);
byte []chars=new byte[6];
int len=0;
while((len=is.read(chars))!=-1){
System.out.println("读到长度为"+len+"的字符串:"+new String(chars));
}
例如上面这个就是每次在文件中读取6个字节的数据,直到读到文件末尾
3.public int read(byte b[], int off, int len)
从文件中读取len个长度的字节数据赋值到数组b中以off为起点的敌方
三、关闭输入流
调用输入流的close方法,关闭对文件资源的占用
File file1=new File("D:\\test01.txt");
FileInputStream is=new FileInputStream(file1);
byte []chars=new byte[6];
int len=0;
while((len=is.read(chars))!=-1){
System.out.println("读到长度为"+len+"的字符串:"+new String(chars));
}
is.close();
FileOutputStream
一、初始化创建输出流对象
1.传入文件路径字符串
和输入流的初始化一样,这里也可以直接把要写入的文件的路径写成字符串直接赋值给构造器
public FileOutputStream(String name)
2.在1的基础上判断是否重写文件数据
和第一个方法类似,这个方法要求传入一个布尔类型的值,为true则表示新写入的数据自动加到末尾,如果为false则默认重写文件内容,即之前的数据会清空,只保留最新写入的
public FileOutputStream(String name, boolean append)
//为真则表示新写入的数据加到末尾
//为假则只保留新加入的数据
3.传入文件对象
这个也和输入流类似,传入一个文件对象即可绑定相应的文件
public FileOutputStream(File file)
二、写入数据
1.public void write(int b)
将int型的数据写入到文件中去,注意这里只能写入单个数字,因为一次只能写入一个字节
2. public void write(byte b[])
将数组b中的数据全部写入到文件中去,我们可以利用这个方法将字符串写进文件中去,因为String类有个getBytes()方法,可以获取字符串的字节字符串,用法如下所示
File fileout=new File("D:\\aaa.txt");
FileOutputStream outputStream=new FileOutputStream(fileout);
String s=new String("这段话是写进记事本中的");
outputStream.write(s.getBytes(),0,2);//可以控制写入字符串的大小
3.public void write(byte b[], int off, int len)
将数组b中下标off开始的len个字节长度的数据写入到文件中去
String filename=new String("D:\\ceshifile\\hm.png");
String filename1=new String("D:\\ceshifile\\hm01.png");
FileInputStream inputStream=new FileInputStream(filename);
FileOutputStream outputStream=new FileOutputStream(filename1);
byte[] ss=new byte[1024];
int len=0;
while((len=inputStream.read(ss))!=-1){//每次从文件中读取1024个长度的数据,返回读取个数
//如果读到了文件末尾返回-1
outputStream.write(ss,0,len);//利用len获取的有效字节长度
//将数组中的数据写入到新文件中
}
inputStream.close();
outputStream.close();//关闭输入输出流
上面是从一个文件读取数据同时向另外一个文件写数据的代码,注意最后输入输出流使用完毕要调用close方法释放占用的资源。
字符输入输出流
FileReader
从文件中读取数据,用法基本和FileInputStream类似
FileWriter
向文件中写入数据,用法基本和FileOutputStream类似,这里不再赘述
字符流与字节流的区别
一、处理的数据单元不同
-
字符输出流(Writer 及其子类):
- 处理的是字符数据,以字符(通常是 16 位的 Unicode 字符)为单位进行操作。例如,
FileWriter
可以用来写入文本文件,它将字符序列写入目标位置。 - 适合处理文本内容,特别是包含各种语言字符的文本文件。
- 处理的是字符数据,以字符(通常是 16 位的 Unicode 字符)为单位进行操作。例如,
-
字节输入输出流(InputStream 和 OutputStream 及其子类):
- 处理的是字节数据,以字节为单位进行操作。例如,
FileInputStream
用于从文件中读取字节数据,FileOutputStream
用于向文件写入字节数据。 - 可以处理任何类型的文件,包括二进制文件(如图像、音频、视频等)以及文本文件。但对于文本文件,可能需要进行字符编码和解码的处理。
- 处理的是字节数据,以字节为单位进行操作。例如,
二、编码方式的考虑
-
字符输出流:
- 通常会自动处理字符编码和解码。例如,在写入文件时,可以指定特定的字符编码(如 UTF-8、GBK 等),字符输出流会将字符转换为对应的字节序列,并按照指定的编码写入文件。
- 能够更好地处理不同字符集的文本,确保文本在不同平台和环境下的正确显示。
-
字节输入输出流:
- 不涉及自动的字符编码和解码。读取或写入的是原始的字节数据,对于文本文件,如果不知道其编码方式,可能会导致乱码问题。
- 需要开发者自己处理字符编码和解码的问题,以确保正确地读取和写入文本内容。
三、使用场景不同
-
字符输出流:
- 当主要处理文本文件,并且希望以方便的字符方式进行操作时,字符输出流是更好的选择。例如,在编写一个日志文件记录程序,主要记录文本信息时,可以使用字符输出流。
- 对于需要进行字符级别的操作,如字符串拼接、替换特定字符等,字符输出流也更加方便。
-
字节输入输出流:
- 处理二进制文件时,字节输入输出流是必不可少的。例如,读取和写入图像文件、音频文件等。
- 在网络编程中,通常使用字节输入输出流来传输数据,因为网络通信通常是以字节为单位进行的。
- 当需要处理底层的二进制数据,或者对数据的字节级别操作有特定要求时,字节输入输出流更加合适。