I / O之文件输入输出流

本文详细介绍了Java中文件输入输出流的基本概念与操作方法,包括FileInputStream、FileOutputStream、FileReader与FileWriter类的使用,演示了如何通过这些类进行文件的读写,特别强调了字符流在处理文本数据时的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        程序在运行期间,大部分都在内存中进行操作,当程序结束或关闭时,这些数据将要消失 。如果需要永久保存这些数据,可以使用文件输入输出流 与指定的文件建立连接,数据将永久保存到文件中。这种操作也成为数据持久化。

一、FileInputStream类与FileOutputStream类

1. FileInputStream 类常用的构造方法

(1)  FileInputStream(String name):使用给定的文件名 name 创建一个 FileInputStream 对象。

(2)  FileInputStream(File  file):使用 File 对象创建 FileInputStream对象,该方法允许再把文件连接输入流之前对文件做进一步分析。

2. FileOutputStream 类常用的构造方法

(1)   FileOutputStream(File  file):创建一个向指定File对象表示的文件中写入数据的文件输出流,数据会覆盖文件原来内容。

(2)   FileOutputStream(File  file,boolean append):如果第二个参数为 true,将字节写入文件末尾,不覆盖文件原来内容。

(3)   FileOutputStream(String name):创建一个向具有指定文件名称的文件中写入数据的 输出文件流。

(4)   FileOutputStream(String name,boolean append):创建一个向具有指定文件名称的 文件中写入数据的输出文件流。如果第二个参数为 true,将字节写入文件末尾,不覆盖文件原来内容。

3.代码演示如下:
 

package com.aiit.book.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileStreamTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file = new File("E:\\word.txt");//创建文件对象
		try {
			//创建FileOutputStream对象,用来向文件夹中写入数据
			FileOutputStream out = new FileOutputStream(file,true);
			String content = "我家大门常打开,开怀送抱等你来";
			//创建字节数组,把将要写入的内容转换为字节数组
			byte[] buy = content.getBytes();
			try {
				out.write(buy);//将数组中的信息写到文件中
				out.close();//将流关闭
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			FileInputStream in = new FileInputStream(file);
			//创建数组,来存储读取到的内容
			byte[] byt = new byte[1024];
			try {
				/*
				 * 如果读到最后没有数据。则返回-1
				 * int read() 读取一个字节,并返回读取的字节
				 * int read(byte[] b) 读取多个字节,并存储到数组b中,从数组b的索引为0的地方开始存储,返回读取了几个字节
				 * int read(byte[] b,int off,int len)读取len个字节,从数组b的索引为off的地方开始存储
				 */
				//从文件中读出信息并存在字节数组中
				int len = in.read(byt);
				//将文件中的信息输出
				System.out.println("文中的信息是:"+new String(byt, 0 ,len));
				in.close();//关闭流
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

控制台输出结果及word.txt内容:

4.总结

FileInputStream FileOutputStream可以操作磁盘上文件的输入流字节流,在构造的时候给出文件的完整路径名。

缺点:在读取文本的时候非常不方便,需要按照字节进行操作,这也是字符流出现的原因。

优点:字节流不仅可以操作文本,还可以操作读取其他媒体:如mp3,图片,还有视频,这些都可以使用字节流进行操作。

     FileInputStream字节流常用的API

fis.skip(len);//跳过一定字节
fis.read();//按照字节逐个读取
fis.read(byte[]);//从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
fis.read(byte[],off,len);//将输入流中最多len个数据字节读入byte数组的偏移位置off处
fis.close();//关闭输入流

    FileOutputStream字节流常用的API

write(byte[] b);//将 b.length 个字节写入此输出流
write(byte[] b, int off, int len);//将指定byte数组中从偏移量off开始的len个字节写入此输出流
write(int b);//将指定byte写入此输出流
void flush();//刷新此输出流,并强制将所有已缓冲的输出字节写入该流中
close()关闭流

二、FileReader类与FileWriter类

        使用 FileOutputStream 类 向文件中写入数据与使用  FileInputStream 类从文件中将内容读出来,都存在一点不足,这两个类都只存在了对字节和字节数组的读取方法。但是汉字在文件中占用两个字节,因此采用字节流可能会出现乱码现象,因此采用 Reader或 Writer 类 。FileReader流读取文件,只要流不关闭,每次调用read()方法按顺序读取文件中的内容。FileWriter用于写入字符流 。

代码演示如下:

package com.aiit.book.file;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class ReaderAndWriter {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		while(true) {//设置无限循环,实现控制台多次输入
			File file = new File("E:\\word.txt");
			if(!file.exists()) {//如果文件不存在
				try {
					file.createNewFile();//创建文件
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println("请输入要执行的操作步骤:(1.写入文件;2.读取文件)");
			Scanner sc = new Scanner(System.in);
			int choice = sc.nextInt();
			switch(choice) {
			case 1:
				System.out.println("请输入要写入的内容");
				String tempStr = sc.next();
				try {
					//FileWriter(file)写入文件中会替代文件中所有的信息
					//FileWriter(file,true);创建可扩展的文件输出流,向文件中写入新数据时不覆盖已经存在的信息
					FileWriter fw = new FileWriter(file,true);
					fw.write(tempStr+"\r\n");//写入内容 并换行
					fw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("上述内容已经写入文本中");
				break;
			case 2:
				FileReader fr = null;
				if(file.length()==0) {//如果文件没有内容
					System.out.println("文本中的字符数为0!");			
				}else {
					try {
						fr = new FileReader(file);
						char [] cbuf = new char[1024];//创建一个数组,用来存储读取的字符数的缓冲区
						int hasread = -1;
						try {
							while((hasread = fr.read(cbuf))!=-1) {
								System.out.println("文件内容:"+new String(cbuf,0,hasread));

							}
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						try {
							fr.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}


				}
				break;
				default:
					System.out.println("请输入符合要求的数字");
			}

		}
	}

}

运行结果及word.txt文件内容:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值