java中的输入流与输出流的存在是为了程序对计算机上的文件进行读写操作的,首先我们先来看一下相关的基础知识
读写文件
FileInputStream
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f=new FileInputStream(“D:/kaifa”);
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
File a=new File(“D:/kaifa”);
InputStream out=new FileInputStream(a);
FileOutputStream
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream a=new FileOutputStream(“D:/kaifa”);
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File a=new File(“D:/kaifa”);
OutputStream a=new FileOutputStream(a);
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。
这里还需要介绍BufferReader中的ready()和readLine()方法的使用和注意事项
readLine()方法
我们常用的去判断读取回来的数据是否为空的时候通常用的判断方法是:
while((str = br.readLine()) != null) {
Log.d(TAG,"网络请求读取数据"+str);
shellList.add(str);
}
这样我们就判断了这一行是否为null,如果不为空就添加到一个String类型的数据当中
在官方文档当中readLine() 解释如下:
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
返回值:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
方法解释:
这个方法一个阻塞的方法,也就是说只要连接没有断开,那么就会一直等待知道有结果返回,返回之后进行读取数据,当读取到数据流末尾的时候就会返回null
ready()方法
在代码当中我们这样用的
while (br.ready()) {
shellList.add(br.readLine());
}
判断是否准备好被读取,如果准备好则进行读取
参看官方文档,文档对这个方法的解释如下:
判断此流是否已准备好被读取。如果缓冲区不为空,或者底层字符流已准备就绪,则缓冲的字符流准备就绪。
返回值:
如果保证下一个 read() 不阻塞输入,则返回 True,否则返回 false。注意,返回 false 并不保证阻塞下一次读取。
方法解释:
这个方法是一个非阻塞的方法,如果数据未准备好呗读取则返回false,所以当数据没有准备好的时候,判断是false因此读取的都是空,另外根据官方文档解释,返回结果是false的时候也并不能阻塞下一次读取。
更多相关内容请见:https://blog.csdn.net/youzi749/article/details/80278197
我们用下面的程序来实践一下
package 开始1;
import java.io.*;
public class fileStreamTest2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File f=new File("D:/kaifa/a.txt");
FileOutputStream fop=new FileOutputStream(f);
//构建FileOutputStream对象,文件不存在会自动创建
OutputStreamWriter writer=new OutputStreamWriter(fop,"UTF-8");
//构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
writer.append("中文输入");
//写入到缓冲区
writer.append("\r\n");
//换行
writer.append("English");
//刷新缓存冲区,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.close();
//关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
fop.close();
//关闭输出流,并释放系统资源
FileInputStream fip=new FileInputStream(f);
//构建FileInputStream对象
InputStreamReader reader=new InputStreamReader(fip,"UTF-8");
//构建InputStreamReader对象,编码与写入相同
StringBuffer sb=new StringBuffer();
while(reader.ready()){
sb.append((char)reader.read());
//转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
reader.close();
//关闭读取流
fip.close();
//关闭输入流,释放系统资源
}
}