在java程序的交互运行中,需要从外界读取数据或向外部设备发送数据,就是所谓的输入输出(I/O),java的I/O通过java.io包下的类和接口支持,其重要的是5个类,分别是File,outputStream、InputStream、Writer、reader以及一个接口Serializable。首先,让我们来理解一下什么是输入流和输出流,先让我们看下面一张图:

JAVA的输入流 java中的输入输出流_java

 一般,按照我们的理解,输入流是写入数据,输出流是读;但是这种感觉是错误的,所有的输入和输出都如上图所示,输入和输出是对于计算机程序来说的,计算机程序需要向计算机内存进行交互;如果是读数据,那么对于计算机程序而言就是输入流,如果是写数据,对于计算机程序而言就是输出流;上述是对计算机中输入和输出的理解,下面让我们通过一段程序来看一下计算机的输入输出:

package com.test;
/*写数据:三步
 * 创建一个输出流对象
 * 利用该对象调用写方法,并且刷新缓冲区
 * 释放资源
 * */

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest01 {
	public static void main(String[] args) throws IOException {
		//创建了一个输出流对象
		FileWriter fw = new FileWriter("D:\\other\\a.txt");
		//调用该对象的写方法
		fw.write("你好,IO流!!");
		//刷新缓冲区
		fw.flush();
		//释放资源
		fw.close();
	}
}

在上面程序中还有一点需要注意的就是关于flush()方法和close()方法;这两个方法中,前面是用来对缓冲区进行刷新的,后者是在释放资源之前先对缓冲区进行刷新,再进行资源的释放,对于数据量比较小的时候,不写flush()方法也是可以的;

下面让我们来一下FileWriter的几种写数据方式:

import java.io.FileWriter;
import java.io.IOException;
/*FileWriter的几种写数据方式:
 * write(String str);写入字符串
 * write(String str,int index,int len);写入部分字符串
 * write(int char);写入字符,或者通过数字写入字符
 * write(char[] char);写入字符数组
 * write(char[] char,int index,int len)写入字符数组中的部分数组
 * 
 * */
public class FileWriterTest01 {
	public static void main(String[] args) throws IOException {
		//创建了一个输出流对象
		FileWriter fw = new FileWriter("b.txt");
//		fw.write("你好!");
//		fw.write("qwwert", 0, 6);
//		fw.write('a');
//		fw.write(98);
		char[] ch= {'a','b','c'};
//		fw.write(ch);
		fw.write(ch, 1, 2);
		fw.flush();
		fw.close();
	}
}

 关于写入数据的换行以及数据的追加:

public class FileWriterTest01 {
	public static void main(String[] args) throws IOException {
		//创建了一个输出流对象
		/*FileWriter fw = new FileWriter("b.txt");
		fw.write("nihao,IO流"+"\r\n");
		fw.write("java");*/
		FileWriter fw = new FileWriter("b.txt",true);//用来实现数据的追加,默认情况下是false,不追加
		fw.write("hahahah");
		fw.flush();
		fw.close();
	}
}

如果想要读取一个文本文件中的数据需要用到FileReader()方法;一般,在关于文件的操作中,我们通常会用到复制这一功能,复制是如何实现的呢?首先,复制需要先读取源文件,这就要用到输入流,在读完之后再利用写操作,就需要运用到输出流;具体的代码实现如下:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

//实现关于文件的读写操作--一次读写一个字符的数据
public class CopyTest {
	public static void main(String[] args) throws IOException {
		//分别用到输入流读数据读数据和输出流写数据;
		FileReader fr = new FileReader("JDBCDataSource.java");
		FileWriter fw = new FileWriter("Result.java");
		int ch;
		while((ch=fr.read())!=-1) {
			fw.write(ch);
		}
		fw.close();
		fr.close();
	}
}


//一次读写一个字符数组的数据
public class ReadArray {
	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("b.txt");
		FileWriter fw = new FileWriter("a.txt");
		char[] ch = new char[1024];
		int len;
		while ((len=fr.read(ch))!=-1) {
			fw.write(ch,0,len);
		}
		fw.close();
		fr.close();
	}
}

除此之外,我们还可以通过一个字节数据方式来读取数据,具体实现如下:

import java.io.FileReader;
import java.io.IOException;

//关于读取字符数组
public class ReadArray {
	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("b.txt");
		char[] ch = new char[1024];
		int len;
		while ((len=fr.read(ch))!=-1) {
			System.out.print(new String(ch,0,len));
		}
		fr.close();
	}
}

关于输入缓冲流和输出缓冲流的使用如下:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

//BufferedWriter将文本写入字符输出流
//BufferedReader将字符输入流中读取文本
public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
		//写数据
		/*BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		bw.write("javacsdgfsadf");
		bw.flush();
		bw.close();*/
		//读数据
		BufferedReader br = new BufferedReader(new FileReader("b.txt"));
		/*int ch=0;
		while((ch=br.read())!=-1) {
			System.out.print((char)ch);
		}
		br.close();*/
		char[] ch = new char[1024];
		int len;
		while((len=br.read(ch))!=-1) {
			System.out.print(new String(ch,0,len));
		}
		br.close();
	}
}

下面让我们来看一个缓冲流的特殊功能:实现文件的复制功能;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

//BufferedWriter将文本写入字符输出流
//BufferedReader将字符输入流中读取文本
public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("b.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("c.txt"));
		
		String line;
		while((line=br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();;
		}
		br.close();
		bw.close();
	}
}

实现一个功能,从一个集合中读取数据存放到文件中:代码如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
//实现把文件读入集合以及从集合中读取数据放到文件中
public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
		//从集合中读取数据:(创建一个集合,读取集合中的数据,存放到文件中)
		ArrayList<String> array = new ArrayList<String>();
		array.add("你好");
		array.add("java");
		array.add("python");
		BufferedWriter br = new BufferedWriter(new FileWriter("array.txt"));
		for(int i=0;i<array.size();i++) {
			String s = array.get(i);
			br.write(s);
			br.newLine();
			br.flush();
		}
			br.close();
	}
}

实现一个功能,从文件中读取数据,存放到集合中:代码如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
//实现把文件读入集合以及从集合中读取数据放到文件中
public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));
		ArrayList<String> array = new ArrayList<String>();
		String len;
		while((len=br.readLine())!=null) {
			array.add(len);
		}
		br.close();
		for(int n=0;n<array.size();n++) {
			String s = array.get(n);
			System.out.println(s);
		}
	}
}

总结:关于文件的读写操作,一般使用缓冲流比较好,在写数据的时候,一般需要使用调用write()方法即可,另外就是读取的时候,一般可以是读取一个字符,利用read()方法;另外一种方法就是利用事先声明的一个字符数组,然后同样调用read()方法,把数组传入到该方法中即可;后续关于输入流或者输出流的使用,无非是一些交叉的综合使用。