在java程序的交互运行中,需要从外界读取数据或向外部设备发送数据,就是所谓的输入输出(I/O),java的I/O通过java.io包下的类和接口支持,其重要的是5个类,分别是File,outputStream、InputStream、Writer、reader以及一个接口Serializable。首先,让我们来理解一下什么是输入流和输出流,先让我们看下面一张图:
一般,按照我们的理解,输入流是写入数据,输出流是读;但是这种感觉是错误的,所有的输入和输出都如上图所示,输入和输出是对于计算机程序来说的,计算机程序需要向计算机内存进行交互;如果是读数据,那么对于计算机程序而言就是输入流,如果是写数据,对于计算机程序而言就是输出流;上述是对计算机中输入和输出的理解,下面让我们通过一段程序来看一下计算机的输入输出:
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()方法,把数组传入到该方法中即可;后续关于输入流或者输出流的使用,无非是一些交叉的综合使用。