字符流
总结1:如何创建流
Reader fr = new FileReader(new File("d:/a.txt"));
Writer fw = new FileWriter("d:/b.txt");
如何读字符
ch = fr.read();
char[] cbuf = new char[1024];
如何写字符
fw.write(ch);
fw.write(cbuf, 0, len);
总结2:字符流和字节流的联系和区别
联系:都是流,都可以读写文件
字符流的底层使用的是字节流(从该意义上只有字节流,没有字符流)
FileReader----------InputStreamReader(适配器模式)-----------InputStream
区别:字节流读取的基本单位是一个字节,字符流读取的基本单位是一个字符
字节流可以读写任意类型的文件(图片,视频,CHM),字符流只能读取 文本文件(txt java html) doc xls不是文本文件
总结3:一个字符占几个字节
2个字节 不正确
内存中 Unicode char 肯定是2个,可以显示主流的各种语言
硬盘中
GBK 简体汉字 1个汉字2个字节 只能显示汉字,不能显示韩语、日语、越 南语
BIG5 繁体汉字 1个汉字2个字节
UTF-8 一个汉字3个字节 可以显示主流的各种语言
读一个字符,可能是英文字符,也可能是中文字符
如何区别英文和汉字
首字母
英文 0110 1101
汉字 11110110 11001101
缓冲流:
总结1
FineInputStream FileOutputStream 节点流,直接和文件相连
BufferedInputStream BufferedOutputStream 包装流、过滤流,提高性能
总结2:
只要关闭高层流(过滤流)即可,会关闭底层流
总结3:flush
bos.close(); //先flush刷新缓冲,再关闭流
bos.flush();
总结4::
只有文本文件才有按行读取的功能,所以BufferedReader提供了readLine功能,
BufferedInputStream没有提供
不同的操作系统的换行符不同,BufferedWriter提供了newLine,会根据不同的操 作系统获取换行符并使用。
总结5:使用包装流的好处
1.提高性能
2.简化操作
总结3:readLine的原理
readLine本质上还是通过read方法来实现的。
借助read()和循环来实现,结束条件是遇到换行符
转换流:
总结1:标准输入输出设备
System.in 输入设备 键盘
System.out 输出设备 显示器
System.ree 错误信息输出设备 显示器
总结2:System.in是字节流,readLine只有字符流提供,怎么办?
三相的插头------(三相插座)转换头(两相插头)------二相的插座
字节流InputStream------转换流InputStreamReader------字符流Reader
进去的是字节流,范返回是字符流
总结3:转换流
InputStream is = System.in;
Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
总结4:转换流有几个
InputStreamReader InputStream------>Reader
OutputStreamWriter OutputStream------>Writer
ReaderInputStream 没有
WriterOutputStream 没有
字节流可以转换字符流,字符流没有必要转换成字节流
总结5:FileReader------InputStreamReader(将字节流转成字符流)
字符流的底层还是字节流
总结6:
缺点:使用流接受键盘的输入太复杂了,高版本中提供了Scanner
使用流输出内容到显示器太复杂了,还是使用System.out.println(str); 好
System.out------PrintStream
打印流
总结1:只有输出流,没有输入流
可以分为字节流PrintStream和字符流PrintWriter
总结2:
println() 可以重载 可以将各种基本类型和引用类型的数据直接写入文件
不需要住那换成字节或者字节数组,方便
System.out 是PrintStream类的一个对象
总结3:
PrintWriter 提供了更多的更方便的构造方法
传递字节流、File、String,底层不仅进行了字节流转换成字符流的操 作,还添加了Buffer,可以提高速度
总结4:自动刷新的功能
PrintWriter pw= new PrintWriter(new FileWriter("d:/a.txt"), true);
遇到换行符自动刷新
PrintWriter PrintStream 包装流
数据流
PrintWriter和PrintStream
1.优点
一个println()可以直接将各种类型的数据直接写入文件
并且是文本文件,可读可查看
2.缺点
1.只管写,不管读
2.不管何种类型,写进去全部变成字符串
解决方案
DataInputStream和DataOutputStream 可以读写各种基本数据类型和String
ObjectInputStream和ObjectOutputStream 可以读写各种基本数据类型、String、 各种引用类型
注意:
只有字节流,没有字符流
以非字符方式写入文件,不可以直接查看
可以使用对应的输入流来读取
字节数组流
总结1:Java流中节点流有哪些
文件流FileReader FileWriter FileInputStream FileOutputStream
另外还有数组流
ByteArrayInputStream和ByteArrayOutputStream 字节流 数据源是内存中的 字节数组
CharArrayReader和CharArrayWriter 字符流
StringReader和StringWriter 字符串流
总结2:如何实现字符串和字节数组之间的转换
字节数组--->String
new String(buf, 0, len);
String--->字节数组
byte[] buf2 = str.getBytes();
byte[] buf2 = str.getBytes("utf-8");
总结3:如何实现所有数据类型(基本数据类型、引用数据类型)和字节数组之间的转换
ByteArrayInputStream和ByteArrayOutputStream 字节流
字节数组在Java开发中,比如网络通信中会使用
注意:
1.ByteArrayOutputStream的数据源是一个长度可以动态增长的字节数组
2.作用:转换成字节数组后,可以保存到硬盘或者通过网络传输