字节输出流和字节输入流均位于java.io包下,且均为抽象类,两者都有诸多子类,FileOutputStream和FileInputStream是两者各自的子类之一,分别为文件字节输出流和文件字节输入流
一、字节输出流(OutputStream)
该类中的一些方法如下:

FileOutputStream类有多个构造方法:
1.FileOutputStream(String name); 创建一个向具有指定名称的文件中写入数据的输出文件流,String name:文件的路径
2.FileOutputStream(File file); 创建一个向指定File对象表示的文件中写入数据的输出文件流
3.FileOutputStream(String name,boolean append); append为true时,创建对象不会覆盖原文件,继续在文件的末尾追写
4.FileOutputStream(File file,boolean append); append为false时,创建一个新文件,覆盖原文件
使用构造方法后FileOutputStream对象就会指向这个指定的文件
字节输出流写入数据到文件:
FileOutputStream fos=new FileOutputStream("文件路径");
fos.write(97); //参数为0-127时,就写入该数字对应的ASCII码上的字符,只写入一个字节
fos.close(); //三行均会产生异常,主要只需抛出IOException即可
------------------------
FileOutputStream fos=new FileOutputStream("文件路径");
byte[] bytes={65,66,67,68,69}; //第一个数为正数(0-127),就查询ASCII表
fos.write(bytes); //写入ABCDE,一次性写入多个字节
byte[] bytes={-65,-66,-67,68,69}; //第一个数为负数,那么第一个数和第二个数为组成一个中文
fos.write(bytes); //写入烤紻E
fos.close(); //注意抛出IOException
-----------------------
FileOutputStream fos=new FileOutputStream("文件路径");
byte[] bytes="你好".getBytes(); //写入字符串,使用String类的getBytes()方法,将字符串转化为字节数组
fos.write(bytes); //写入你好
(在文件中追写时使用后两个构造方法,在文件中写入回车时,windows系统下为"\r\n")
二、字节输入流(InputStream)
该类中的一些方法如下:

FileInputStream也有多个构造方法:
1.FileInputStream(String name); 创建一个向具有指定名称的文件中读取数据的输入文件流,String name:文件的路径
2.FileInputStream(File file); 创建一个向指定File对象表示的文件中读取数据的输入文件流
使用构造方法后FileInputStream对象就会指向这个指定的文件
FileInputStream fis=new FileInputStream("文件路径");
int len=fis.read(97); //len为要读文件中某个字符的ASCII码值,一次只读取一个字符
System.out.println(len); //输出len,len为-1时,表示已读完
fis.close();
------------------------
int len=0;
while((len=fis.read())!=-1){
System.out.println(char(len));
} //使用while循环优化,一次性读取文件中的全部字符
------------------------
FileInputStream fis=new FileInputStream("文件路径");
byte[] bytes=new byte[1024]; //1kb大小的字节数组
int len=fis.read(bytes); //len为从文件中读取的有效字节个数,最大为bytes数组的大小1024
System.out.println(len); //输出len,len为-1时,表示已读完
System.out.println(new String(bytes)); //String构造函数参数为字节数组,将字节数组转化为字符串
fis.close();
----------------------
byte[] bytes=new byte[1024];
int len=0;
while((len=fis.read(bytes))!=-1){
System.out.println(new String(bytes,0,len)); //从0开始len长度的字符串,防止空间浪费
} //使用while循环优化
三、综合案列:文件复制
FileOutputStream fos=new FileOutputStream("要复制到的文件路径");
FileInputStream fis=new FileInputStream("被复制文件路径");
byte[] bytes=new byte[1024];
int len=0;
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
四、字符输入流(Reader)
当使用字节流读取文件时,若文件中有中文字符,则会产生错误,因为在utc-8编码下,一个中文字符占用3个字节,而一次读取只能读取一个字节,所以最后会产生乱码,因此使用字符流解决上述问题
Reader和Writer同样位于java.io包下,也是两个抽象类,同样也有两个子类用来文件的输入输出,分别为FileReader和FileWriter
Reader类下的一些方法:

FileReader类同样有多个构造方法:
1.FileReader(String filename);
2.FileReader((File file);
字符输入流读取字符数据:
FileReader fr=new FileReader("文件路径");
int len=0; //len为要读文件中某个字符的ASCII码值,一次只读取一个字符
while((len=fr.read())!=-1){
System.out.println(char(len));
} //使用while循环优化,一次性读取文件中的全部字符
fr.close();
----------------------
FileReader fr=new FileReader("文件路径");
char[] cs=new char[1024];
int len=0; //len为要读文件中某个字符的ASCII码值,一次只读取一个字符
while((len=fr.read(cs))!=-1){
System.out.println(new String(cs,0,len));
} //使用while循环优化,一次性读取文件中的全部字符
fr.close();
五、字符输出流(Writer)
Writer类的一些方法如下:

FileWriter类同样有多个构造方法:
1.FileWriter(String filename);
2.FileWriter((File file);
3.FileWriter(String filename,boolean append);
4.FileWriter(File file,boolean append);
FileWriter不同于之前字节输出流的使用方法,write()方法会将字符写入内存缓冲区而不是文件中,之后要多使用一个flush()方法用来把内存缓冲区的字符写入到文件中
close()方法也会把内存缓冲区的字符写入到文件中,但flush()方法使用完后流仍存在,可以继续输出,close()方法会直接将流关掉,之后无法再输出
字符输出流写字符数据:
FileWriter fw=new FileWriter("文件路径");
fw.writer(97); //len为要读文件中某个字符的ASCII码值,一次只读取一个字符
fw.flush();
fw.writer(98);
fw.close();
fw.writer(99); //错误,流已关闭,无法写
------------------------------
char[] cs={'a','b','c','d','e'};
fw.writer(cs);
fw.writer(cs,1,3); //写入从1索引开始长度为3的字符串
本文详细介绍了Java中的字节流(OutputStream、InputStream)和字符流(Reader、Writer),包括构造方法、常用方法以及如何进行文件读写操作。通过实例演示了字节流和字符流在文件复制、读取字符数据时的应用,强调了字节流在处理中文字符时可能遇到的问题,以及字符流作为解决方案的优势。
1433

被折叠的 条评论
为什么被折叠?



