目录
引言
字节流和字符流
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
引言
在完完全全的完成本学期的学习任务之后,终于可以有时间继续更新Java相关的文章了。那么今天我们要学习的是的Java中的IO流(I即为Input,O即为Output),也称为输入流,输出流,其主要的作用是为了能够对文件中的数据进行输入和输出(读和写),更加方便了今后我们在Java道路上的学习,好了,废话不多说,我们开始今天的学习吧!
文章图片
字节流和字符流
文章图片
在上图中,橙色部分是抽象类,而蓝色部分则是实现类
字节流
字节流,顾名思义就是将数据细分为字节对文件进行读和写的操作, 主要分为字节输入流和字节输出流。
字节输入流
下面是字节输入流中经常会用到的构造器和方法:
构造器 |
说明 |
publicFileInputStream(File file) |
创建字节输入流管道与源文件对象接通 |
publicFileInputStream(String pathname) |
创建字节输入流管道与源文件路径接通 |
方法名称 |
说明 |
public int read() |
每次读取一个字节返回,如果字节已经没有可读的返回-1 |
public int read(byte[ ] buffer) |
每次读取一个字节数组返回,如果字节已经没有可读的返回-1 |
接下来通过代码更好的加深对这一部分知识点的理解吧!
File file = new File("File//data.txt");
//第一种构造器,参数是File类
InputStream inputStream = new FileInputStream(file);
//第二种构造器,参数是文件的路径,可以是相对也可以是绝对的路径
InputStream inputStream1 = new FileInputStream("File//data.txt");
//通过字节读取文件中的数据
int len;
while ((len=inputStream.read()) != -1){
System.out.print((char) len);
}
System.out.println();
//通过字节数组读取文件中的数据
byte [] buffer = new byte[3];
while ((len=inputStream1.read(buffer))!=-1){
String s = new String(buffer,0,len);
System.out.print(s);
}
//输出结果:
//ab1abab
//ab1abab
现在我们看到的输出结果和文件中的内容是一一对应的,那么它就一定是没有问题的了吗?其实并不是,只是还没有遇到问题而已,首先我们应该了解到的是,在utf-8中,字母和数字都是一个字节,而中文是由三个字节组成的,那么当我们的文件中出现汉字的时候,第一种方法就无法实现正常的读取了,因为每次都读取一个字节的原因会将汉字拆解,在输出的时候形成乱码的情况;而第二种则方法可以在特殊的情况下实现对汉字的输出,必须满足的条件是刚好中文的三个字节都在同一个字节数组中。
字节输入流并不适合所有的文件数据,由此而引出了字符输入流。
文章图片
字节输出流
下面是字节输出流常用到的方法:
方法 |
说明 |
public void write (int a) |
写一个字节出去 |
public void write (byte [ ]buffer) |
写一个字节数组出去 |
public void write (byte [ ]buffer,int off, int len) |
将一个字节数组中的一部分写出去 |
file.close() |
流的关闭,不能再写数据 |
file.flush() |
流的更新,还可以继续写数据 |
接下来通过代码更好的加深对这一部分知识点的理解吧!
OutputStream outputStream = new FileOutputStream("File//data.txt",true);
//true表示可以对文件进行追加内容,若没有true则会在关闭文件之后,进行写文件的时候会对之前的内容进行覆盖。
outputStream.write('a');
outputStream.write(13);
outputStream.write('美');
outputStream.flush();
byte[] buffer = {'s','y','l','m',99};
outputStream.write(buffer);
outputStream.write(buffer,1,3);
outputStream.close();
经过上面一系列操作以后,会将这些数据写进data.txt文件之中,但是仍然会出现问题,有时无法将中文正常的写进去,那么它也不是一个适合所有文件的,由此而引出了字符输出流。
文章图片
字符流
字符流,顾名思义就是将数据细分为字符对文件进行读和写的操作, 主要分为字符输入流和字符输出流。
字符输入流
下面是字符输入流中经常会用到的构造器和方法:
构造器 |
说明 |
public FileReader (File file) |
创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) |
创建字符输入流管道与源文件路径接通 |
方法 |
说明 |
public int read() |
每次读取一个字符返回,如果字符已经没有可读的返回-1 |
public int read(char [ ]buffer) |
每次读取一个字符数组返回,返回读取的字符个数,如果字符没有可读的返回-1 |
字符输入流的构造器和方法大致上和字节输入流的相同,不同的地方在于字符输入流是以字符为单位的读取,无论你是字母还是数字,都作为一个字符进行读取,这样便可以避免在读取中文的时候出现乱码的问题。
接下来通过一部分代码来加深对它的理解吧!
File file = new File("File//data.txt");
//第一种构造器,参数是File类
FileReader fileReader = new FileReader(file);
//第二种构造器,参数是文件的绝对路径或者相对路径
FileReader fileReader1 = new FileReader("File//data.txt");
//第一种方法,一个一个字符读取
int len;
while ((len = fileReader.read())!=-1){
System.out.print((char) len);
}
//第二种方法,以字符数组进行读取
char []buffer = new char[3];
while ((len = fileReader1.read(buffer))!=-1){
String s = new String(buffer,0,len);
System.out.println(s);
}
//输出结果:
//110,119,120
//110
//,11
//9,1
//20
通过以字符为单位的读写,便可以避免在读取中文的时候出现乱码的问题了。
字符输出流
下面是字符输出流中经常会用到的构造器和方法:
构造器 |
说明 |
public FileWriter(File file) |
创建字符输出流管道与源文件对象接通 |
public FileWriter(File file,boolean append) |
创建字符输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath) |
创建字符输出流管道与源文件路径接通 |
public FileWriter(String filepath,boolean append) |
创建字符输出流管道与源文件路径接通,可追加 |
方法 |
说明 |
void writer(int c) |
写入一个字符 |
void writer (char [ ] buffer) |
写入一个字符数组 |
void writer (char[ ]buffer,int off,int len) |
写入字符数组的一部分 |
void writer(String str) |
写入一个字符串 |
void writer(String str,int off,int len) |
写入字符串的一部分 |
close和flush |
输出流的关闭和刷新 |
接下来就通过代码来加深对它的理解吧!
FileWriter fileWriter = new FileWriter("File//data.txt");
fileWriter.write('k');
fileWriter.write('d');
char []buffer = {'i','r','v','i','n','g'};
fileWriter.write(buffer);
fileWriter.flush();
String s = "James";
fileWriter.write(s);
fileWriter.write(s,0,4);
fileWriter.close();
字符输出流的使用便可以很好地解决了中文不能正常写入文件的问题了。
创作不易,给个三连
文章图片
【Java基础|Java中的字节流和字符流如何理解——精简】 ???????
推荐阅读