字符流的由来:
让计算机通过编码表,来识别各国语言。为了解决文字乱码问题,(存储数据和读取数据,所用的码表不同导致的问题)Java在流技术中基于字节流,出现了字符流,它可以在内部进行查指定的编码表。这样在处理文字时,就会很方便。
字符流和字节流:
字节流两个基类:InputStream OutputStream
字符流两个基类:Reader Writer
IO常见的异常处理import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("demo.txt");
fw.write("abcdefg");
}
catch (IOException e)
{
System.out.println("catch:"+e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}
注意:
在windows系统里、回车符是\r\n ,在linux系统里、回车符是\n
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null,表示读到文件末尾。read方法,当返回-1时,表示读到文件末尾
一个综合的例子,通过缓冲区复制一个java文件
import java.io.*;
class CopyTextByBuf
{
public static void main(String[] args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
String line = null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
字节流File读写操作
读: FileInputStream
写: FileOutputStream
因为字节流,在没有指定缓冲区的前提下,碰到一个字节就会操作一次。
所以不需使用flush方法。
特有方法:这个方法只在字节流中有
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。定义一个刚刚好的缓冲区。不用在循环了。
int available() \r\n算2个字符
注意:一般不用正好的,如果太大会内存溢出
字节流的读一个字节的read方法为什么返回值类型不是byte,而是int?
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会出现数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。
流操作规律的总结
流操作的基本规律:最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
1、明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer。
2、操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3、当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台。