• 如何读写文件?
    通过流来读写文件:流是指一连串流动的字符,是以先进先出方式发送信息的通道
  • 读入(read Input);
  • 写出(write Output);
  • java中一个字符(Unicode2个字节),一个二进制字节(8位);

一、JAVA流的分类:

二、用FileInputStream和FileOutStream读写文本文件(字节流):

①用FileInputStream读入文件:

测试:把文件中的信息读取到计算机内存中,现在在f盘有一个txt文件,要将它在控制台输出

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class FileInputDemo {
	public static void main(String[] args) {
		// 1.创建字节输入流
		InputStream fis = null;
		try {
			fis = new FileInputStream("f:/这是一个文件.txt");
			// 2.实现读取操作
			int data;// 存储读到的字节
			while ((data = fis.read()) != -1) {
				System.out.print((char) data);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 3.关闭流
			try {
				if (fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

输出结果:



使用字节数组方式:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class FileInputDemo {
	public static void main(String[] args) {
		// 1.创建字节输入流
		InputStream fis = null;
		try {
			fis = new FileInputStream("f:/这是一个文件.txt");
			// 2.实现读取操作
			// int data;// 存储读到的字节
			// while ((data = fis.read()) != -1) {
			// System.out.print((char) data);
			// }
			int len;// 存储读入数组的长度
			byte[] words = new byte[1024];
			while ((len = fis.read(words)) != -1) {
				System.out.println(fis.available());
				System.out.print(new String(words, 0, len));
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 3.关闭流
			try {
				if (fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


InputStream类常用方法(抽象):

  • int read();//返回读到的字节(以十进制显示出来)
  • int read(byte[] b);//把读到的字节暂储到字节数组中(返回的是读入的字节数组的长度)
  • int read(byte[] b,int off,int len);//从off作为起始位置读入len长度的字节数组
  • void close(); // 关闭一个流
  • int avaailable();//当前还有多少字节没有读

子类FileInputStream常用的构造方法:

  • FileInputStream(File file); //还用File对象进行构造
  • FileInputStream(String name);//直接使用文件路径进行构造

②用FileInputStream写出文件:

测试:现在尝试写出数据,使用代码在f盘创建一个Hello.txt文件,并尝试向其中写入数据:

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

public class FileOutputStreamDemo {
	public static void main(String[] args) {
		// 1.创建字节输出流
		OutputStream fis = null;
		try {
			fis = new FileOutputStream(new File("f:/Hello.txt"));
			//fis = new FileOutputStream(new File("f:/Hello.txt"),true);//追加写
			// 2.执行写操作
			String str = "好好学习Java吧!";// 要写出的字符串
			byte[] words = str.getBytes();// 将字符串转换为字节数组
			fis.write(words);
			//fis.write(words, 0, words.length);//也可以用write的重载方法写
			System.out.println("Hello文件已更新!");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("创建文件时出错!");
		} finally {
			// 3.关闭流
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

测试结果:

OutputStream类常用方法:

  • void write(itn c);
  • void write(byte[] bug);
  • void write(byte[],int off,int len);
  • void close();

子类FileOutputStream常用的构造方法:

  • FileOutputStream(File file);
  • FileOutStream(String name);
  • FileOutputStream(String name,boolean append);

1.前两种构造方法在向文件写数据时将覆盖文件中原有的内容。
2.创建FileOutStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件

三、用FileInputStream和FileOutStream实现copy功能(字节流):

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

public class InputAndOutputFile {
	public static void main(String[] args) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			// 创建输入流对象,负责读取f:/晚上好.txt
			fis = new FileInputStream("f:/晚上好.txt");
			// 创建输出流对象,
			fos = new FileOutputStream("f:/Hello.txt", true);
			// 创建中转站数组,存放每次读取的内容
			byte[] words = new byte[1024];
			int len;// 记录读取的长度
			// 通过循环实现文件读取
			while ((len = fis.read(words)) != -1) {
				fis.read(words);
				fos.write(words, 0, len);
			}
			System.out.println("复制完成,请产看文件。");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

这样就将f:/晚上好.txt文件中的数据赋值到f:/Hello.txt文件中啦!代码中避免了先吃一个数据和输出多余空格两个问题。