最近写服务端Socket通信,遇到
BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()))
又想起来以前文件操作是遇到的 FileInputStream等类,read(), readLine(), write(String) ,write(buf)等方法。感觉需要做个总结归纳一下。
字节流和字符流
对文件直接进行操作都属于字节流(byte Stream)
程序可以处理单个字节,但更多时候用到更多的是字符和字符串
字节流--------字符流之间可以进行转换。
InputStream OutputStream
输入输出流的最基础父类,本身为Abstract 基类,不单独使用
使用时往往是集成二者之后的子类,全部带有InputStream OutputStream 的类都是如此,这些应是字节流,如
FileInputStream
FileOutputStream
使用:FileInputStream 内容是一个个字节,最后一位是 -1 根据此判断读完(伪代码)
(-1 的原因: 因为inputStream.read()源码本质是读取,byte[]数组里的一个byte,byte 8个二进制位,有符号【-128,127】,read()处理按照无符号处理,【0,255】,如果数组内还有字节读取,返回【0,255】值,如果数组为空返回-1约定为数组为空;注意:此处是返回处理为-1,而不是真实值为-1)
in = new FileInputStream(path);
while( int a = in.read()!=-1)
{System.out.println( a);//字节
}
File file=new File("d:\\d.text");
try {
//创建文件字节输出流对象,准备向d.txt文件中写出数据,true表示在原有的基础上增加内容
FileOutputStream fout=new FileOutputStream(file,true);
Scanner sc=new Scanner(System.in);
System.out.println("请写出一段字符串:");
String msg=sc.next()+"\r\n";;
/******************(方法一)按字节数组写入**********************/
//byte[] bytes = msg.getBytes();//msg.getBytes()将字符串转为字节数组
//fout.write(bytes);//使用字节数组输出到文件
/******************(方法一)逐字节写入**********************/
byte[] bytes = msg.getBytes();
for (int i = 0; i < bytes.length; i++) {
fout.write(bytes[i]);//逐字节写文件
}
fout.flush();//强制刷新输出流
fout.close();//关闭输出流
System.out.println("写入完成!");
}
InputStreamReader/OutputStreamWriter
处理字符流的抽象类,可以对InputStream OutputStream进行转换
InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.InputStream对象是一个个字节;
FileInputStream fis=new FileInputStream("d://desktop//test.txt");
InputStreamReader isr=new InputStreamReader(fis,"utf8");
int i;
while((i=isr.read()) != -1){
System.out.println((char)i); //操作对象为字符char
public void Test20() throws Exception {
OutputStream out = System.err;// 打印到控制台,也可以输出到文件
OutputStreamWriter osr = new OutputStreamWriter(out);//输出 往out里面准备写内容,内容在下面
String str = "Hello World!";
osr.write(str);//写字符串
//osr.flush();//如果用于网络传输,记得强制刷新缓冲区,否则输出的数据只停留在缓冲区中,而无法进行网络传输
osr.close();//关闭资源
OutputStreamWriter是字符流通向字节流的桥梁,它将字符流转换为字节流.
此处参照 https://blog.csdn.net/pkx1993/article/details/80991812
https://blog.csdn.net/Appleyk/article/details/79639444
BufferedReader/Printwriter
对 InputStreamReader进一步封装,传入InputStream构造,可以一次读取一行,更加灵活,readLine(),判断文件结尾是根据readLine()是否==null
原始问题
BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()))
//字符流进一步封装 //单个字符流 //字节流