**
I/O流
**
所谓的I/O流就是在 java中,字节或者字符以流的方式输入和输出。I对应了input,O对应了output。Java中把字节与字符的输入和输出分成四个大类(一个字符=两个字节=16个二进制位)。
字节的顶级父类:
InputStream(所有输入字节流的父类),共性的方法包括read,close。 FileInputStream就是InputStream的一个子类。
OutputStream (所有输出字节流的父类),共性的方法包括write,close,flush。FileOutputStream就是OutputStream的一个子类。
下面我们做一些简单的对于文件字节的读写。
先看写数据到文件的操作
public static void main(String[] args) throws IOException
{
File file=new File("/Users/ahlahmlahlah/Desktop/test.txt");
//创建FileOutputStream对象:
FileOutputStream fos=new FileOutputStream(file);
//FileOutputStream fos=new FileOutputStream("/Users/ahlahmlahlah/Desktop/test.txt");//第二种构造方法,传递String参数,路径名
//第一种write方法(参数传递一个byte数组)
byte[] bytes= {65,66,67,68,69};
fos.write(bytes);
byte[] bytes2="hello".getBytes();
fos.write(bytes2);//写字符串
//第二种write,1代表索引开始的位置,2代表索引的长度
fos.write(bytes,1,2);//69和70
//追加方法
File file2=new File("/Users/ahlahmlahlah/Desktop/test2.txt");
FileOutputStream fos2=new FileOutputStream(file2,true);//这里的构造方法是true代表一直追加字节,若不写就无法追加,即每次运行程序之前写的数据都会消失。
fos2.write(bytes2);
fos2.write("/r".getBytes());// /r代表换行
//close方法,关闭流
fos.close();
fos2.close();
我们来看一下生成的txt文件
我们可以看到,ABCDE对应了下面这一段代码写入的数据
byte[] bytes= {65,66,67,68,69};
fos.write(bytes);
hello对应了下面一段代码写入的数据
byte[] bytes2="hello".getBytes();
fos.write(bytes2);
BC对应了下面一段代码写入的数据
fos.write(bytes,1,2);
至于生成的test2文件,我们把程序运行三次(一次写一个‘哈’),来看一下结果
写完数据到文件后我们里看从文件中读数据的操作(三种read方法)
FileInputStream fis=new FileInputStream(file);
//第一种read方法(一个字节一个字节的读入)
char a=(char) fis.read();
System.out.println(a);
int i=fis.read();
System.out.println(i);//66(B)读完了读67
i=fis.read();
System.out.println(i);//67(C)读完了读68
int len=0;
while((len=fis.read())!=-1) //当没有内容了还在read就返回-1
{
System.out.print((char)len+" ");
}//循环输入
打印结果:
A
66
67
D E h e l l o B C
第二种read方法
//第二种read,读取多个字节
FileInputStream fis=new FileInputStream(file);
byte[] bytes3=new byte[5];
int len=fis.read(bytes3);//读取5个字节,存到bytes3里面。返回一次读取的长度,和上面的read空参数返回的不同,上面直接返回读取的内容
System.out.println(len);
System.out.println(new String(bytes3));//利用String的构造方法把byte数组里面的数据转换成字符串输出
len=fis.read(bytes3);//又读了五个字节
System.out.println(len);
System.out.println(new String(bytes3));
len=fis.read(bytes3);
System.out.println(len);
System.out.println(new String(bytes3));//一直向下读取数据,直到读不到数据返回-1
结果
5
ABCDE
5
hello
2
BC
第三种read方法
FileInputStream fis=new FileInputStream(file);
byte[] bytes3=new byte[5];
int len2=fis.read(bytes3,0,3);//从索引0开始读,读3个,返回3
System.out.println(len2);
System.out.println(new String(bytes3));
结果
3
ABC
下面是关于字符的读写操作
字符的顶级父类:
Reader(所有输入字符流的父类)(共性的方法包括read,close),FileReader是Reader的一个子类。
Writer(所有输出字符流的父类)(共性的方法包括write,close,flush),FileWriter是Writer的一个子类。
了解了上面字节流的操作,字符流的大同小异。
我们先来看字符的输出操作(三种write方法我都写在下面了,与上面的字节的输出相似,只是传递的参数可以是一个char数组)。
File file3=new File("/Users/ahlahmlahlah/Desktop/test3.txt");
//FileWriter
FileWriter fw=new FileWriter(file3);//后面加上true代表可以续写,与文件字节输出流的构造方法一样,这里将不演示了
//三种write方法
fw.write(97);//写了a到text3中
fw.flush();//flush可以把数据刷新到文件中去。
char[] charArray1= {'a','b','c','d','e'};
fw.write(charArray1);写了abcde到text3中
fw.flush();
fw.write(charArray1,0,1);写了a到text3中
fw.flush();
fw.close();
我们来看一下生成的text3文件
文件中的数据与我们预想的一样
下面是文件的读取操作
//FileReader
FileReader fr=new FileReader(file3);
int len3=0;
char[] charArray3=new char[1024];
while((len3=fr.read(charArray3))!=-1)
{
System.out.println(new String(charArray3,0,len3));//与FileInputStream一样,传参后返回值变成了读取的数目,这里用String类的一个构造方法把char数组转换成字符串输出
}
fr.close();
结果
aabcdea
博主最近生病了,更新的比较慢。。。
下次吧I/O流的有关知识补全