字节流
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
字节输出流:OutputStream
OutputStream是整个IO包中字节输出流的最大父类,此类的定义如下:
public abstract class OutputStream extends Object implements Closeable,Flushable
从以上的定义可以发现,此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化
Closeable表示可以关闭的操作,因为程序运行到最后肯定要关闭
Flushable:表示刷新,清空内存中的数据
FileOutputStream类的构造方法如下:
public FileOutputStream(File file)throws FileNotFoundException
写数据:
1importjava.io.File;
2importjava.io.FileOutputStream;
3importjava.io.IOException;
4importjava.io.OutputStream;
5
6publicclassTest11 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9OutputStream out=newFileOutputStream(f);//如果文件不存在会自动创建
10String str="Hello World";
11byte[] b=str.getBytes();
12out.write(b);//因为是字节流,所以要转化成字节数组进行输出
13out.close();
14}
15}
也可以一个字节一个字节进行输出,如下:
1importjava.io.File;
2importjava.io.FileOutputStream;
3importjava.io.IOException;
4importjava.io.OutputStream;
5
6publicclassTest11 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9OutputStream out=newFileOutputStream(f);//如果文件不存在会自动创建
10String str="Hello World";
11byte[] b=str.getBytes();
12for(inti=0;i
13out.write(b[i]);
14}
15out.close();
16}
17}
以上输出只会进行覆盖,如果要追加的话,请看FileOutputStream类的另一个构造方法:
public FileOutputStream(File file,boolean append)throws FileNotFoundException
在构造方法中,如果将append的值设置为true,则表示在文件的末尾追加内容。
1importjava.io.File;
2importjava.io.FileOutputStream;
3importjava.io.IOException;
4importjava.io.OutputStream;
5
6publicclassTest11 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9OutputStream out=newFileOutputStream(f,true);//追加内容
10String str="\r\nHello World";
11byte[] b=str.getBytes();
12for(inti=0;i
13out.write(b[i]);
14}
15out.close();
16}
17}
文件中换行为:\r\n
字节输入流:InputStream
既然程序可以向文件中写入内容,则就可以通过InputStream从文件中把内容读取进来,首先来看InputStream类的定义:
public abstract class InputStream extends Object implements Closeable
与OutputStream类一样,InputStream本身也是一个抽象类,必须依靠其子类,如果现在是从文件中读取,就用FileInputStream来实现。
观察FileInputStream类的构造方法:
public FileInputStream(File file)throws FileNotFoundException
读文件:
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest12 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9InputStream in=newFileInputStream(f);
10byte[] b=newbyte[1024];
11intlen=in.read(b);
12in.close();
13System.out.println(newString(b,0,len));
14}
15}
但以上方法是有问题的,用不用开辟这么大的一个字节数组,明显是浪费嘛,我们可以根据文件的大小来定义字节数组的大小,File类中的方法:public long length()
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest13 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9InputStream in=newFileInputStream(f);
10byte[] b=newbyte[(int) f.length()];
11in.read(b);
12in.close();
13System.out.println(newString(b));
14}
15}
我们换种方式,一个字节一个字节读入~
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest14 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9InputStream in=newFileInputStream(f);
10byte[] b=newbyte[(int) f.length()];
11for(inti=0;i
12b[i]=(byte) in.read();
13}
14in.close();
15System.out.println(newString(b));
16}
17}
但以上情况只适合知道输入文件的大小,不知道的话用如下方法:
1importjava.io.File;
2importjava.io.FileInputStream;
3importjava.io.IOException;
4importjava.io.InputStream;
5
6publicclassTest15 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9InputStream in=newFileInputStream(f);
10byte[] b=newbyte[1024];
11inttemp=0;
12intlen=0;
13while((temp=in.read())!=-1){//-1为文件读完的标志
14b[len]=(byte) temp;
15len++;
16}
17in.close();
18System.out.println(newString(b,0,len));
19}
20}
字符流
在程序中一个字符等于两个字节,那么java提供了Reader、Writer两个专门操作字符流的类。
字符输出流:Writer
Writer本身是一个字符流的输出类,此类的定义如下:
public abstract class Writer extends Object implements Appendable,Closeable,Flushable
此类本身也是一个抽象类,如果要使用此类,则肯定要使用其子类,此时如果是向文件中写入内容,所以应该使用FileWriter的子类。
FileWriter类的构造方法定义如下:
public FileWriter(File file)throws IOException
字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了。
写文件:
1importjava.io.File;
2importjava.io.FileWriter;
3importjava.io.IOException;
4importjava.io.Writer;
5
6publicclassTest16 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9Writer out=newFileWriter(f);
10String str="Hello World";
11out.write(str);
12out.close();
13}
14}
在默认情况下再次输出会覆盖,追加的方法也是在构造函数上加上追加标记
1importjava.io.File;
2importjava.io.FileWriter;
3importjava.io.IOException;
4importjava.io.Writer;
5
6publicclassTest17 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9Writer out=newFileWriter(f,true);//追加
10String str="\r\nHello World";
11out.write(str);
12out.close();
13}
14}
字符输入流:Reader
Reader是使用字符的方式从文件中取出数据,Reader类的定义如下:
public abstract class Reader extends Objects implements Readable,Closeable
Reader本身也是抽象类,如果现在要从文件中读取内容,则可以直接使用FileReader子类。
FileReader的构造方法定义如下:
public FileReader(File file)throws FileNotFoundException
以字符数组的形式读取出数据:
1importjava.io.File;
2importjava.io.FileReader;
3importjava.io.IOException;
4importjava.io.Reader;
5
6publicclassTest18 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9Reader input=newFileReader(f);
10char[] c=newchar[1024];
11intlen=input.read(c);
12input.close();
13System.out.println(newString(c,0,len));
14}
15}
也可以用循环方式,判断是否读到底:
1importjava.io.File;
2importjava.io.FileReader;
3importjava.io.IOException;
4importjava.io.Reader;
5
6publicclassTest19 {
7publicstaticvoidmain(String[] args)throwsIOException {
8File f =newFile("d:" + File.separator+"test.txt");
9Reader input=newFileReader(f);
10char[] c=newchar[1024];
11inttemp=0;
12intlen=0;
13while((temp=input.read())!=-1){
14c[len]=(char) temp;
15len++;
16}
17input.close();
18System.out.println(newString(c,0,len));
19}
20}
字节流与字符流的区别
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容