InputStream,InputStreamReader和BufferedReader
- InputStream:抽象类,基类,为面向字节的I/O,用于读写文本,它能输出字节流;
- InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符;
- BufferedReader : 提供通用的缓冲方式文本读取,readLine读取一个文本行, 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
使用场景:
有时我们需要把来自于"字节"层次结构的类和"字符"层次结构的类结合起来使用,为了实现这个目的,必须要使用到适配器类(adapter),InputStreamReader可以将InputStream(字节流)转化为Reader(unicode字符流),OutputStream也是如此。
例如可以把读入的字节流转换成字符流输出:
protected void doPost(HttpServletRequest request, HttpServletResponse response) IOException {
InputStream inputStream = request.getInputStream();//通过输入流获取客户端传来的数据流
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
//通过输出流将数据流输出到本地硬盘
String path = request.getServletContext().getRealPath("file/copy.txt");//获取文件的绝对路径
FileOutputStream outputStream = new FileOutputStream(path);//用来打开一个输入文件
Writer writer = new OutputStreamWriter(outputStream);//创建字符写入流
BufferedWriter bufferedWriter = new BufferedWriter(writer);//使用缓冲流包装
String str = "";
while((str = bufferedReader.readLine())!=null){
bufferedWriter.write(str);
}
bufferedReader.close();
reader.close();
inputStream.close();
//对于这里Writer和bufferwriter来说,由于Writer是被修饰者,所以应该先关闭bufferWriter()修饰者,否则会抛出异常
bufferedWriter.close();
writer.close();
outputStream.close();
}
DataOutputStream与outputStream以及BufferedReader共同使用
当文件流和缓冲区流的处理是字节或者字节数组时,利用DataOutputStream可以实现对文件不同数据类型的读写。
try {
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001); //需要服务端先开启
//同一个通道,服务端的输出流就是客户端的输入流;服务端的输入流就是客户端的输出流
OutputStream ops = s.getOutputStream(); //开启通道的输出流
DataOutputStream dos = new DataOutputStream(ops);//使用DataOutputStream实现字节到String类型的转变
while (true)
{
String strWord = brKey.readLine();
if (strWord.equalsIgnoreCase("quit"))
{
break;
}
else
{
System.out.println("I want to send: " + strWord);
dos.writeBytes(strWord + System.getProperty("line.separator"));//将字符串按字节顺序写出到基础输出流中
}
}
dos.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}