java学习四(字节流与字符流)

什么是字节流和字符流,两者有什么区别,什么情况下使用哪种流?一直比较迷惑,今天查资料找到些答案,仅做记录。
stream结尾都是字节流,reader和writer结尾都是字符流。
两者的区别就是读写的时候一个是按字节读写,一个是按字符。字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

@Test
public void test1() throws IOException{
System.out.println("this is SuiteTest1.test1");
// 第1步:使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File 对象
// 第2步:通过子类实例化父类对象
OutputStream out = null;
String str = "Hello World!!!";
byte b[] = str.getBytes();
// 准备好一个输出的对象
try {
out = new FileOutputStream(f);
out.write(b);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 第4步:关闭输出流
// out.close();
// 此时没有关闭
}

此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。


@Test
public void test1() throws IOException{
System.out.println("this is SuiteTest1.test1");
// 第1步:使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File 对象
// 第2步:通过子类实例化父类对象
Writer out = null;
String str = "Hello World!!!";
// 准备好一个输出的对象
try {
out = new FileWriter(f);
out.write(str);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 第4步:关闭输出流
// out.close();
// 此时没有关闭
}

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

@Test
public void test1() throws IOException{
System.out.println("this is SuiteTest1.test1");
// 第1步:使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File 对象
// 第2步:通过子类实例化父类对象
//OutputStream out = null;
Writer out = null;
String str = "Hello World!!!";
//byte b[] = str.getBytes();
// 准备好一个输出的对象
try {
//out = new FileOutputStream(f);
//out.write(b);
out = new FileWriter(f);
out.write(str);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 第4步:关闭输出流或者flush强制清空缓冲区
out.flush();
//out.close();
}

查看test.txt文件已写入内容,证明close或者flush都会将字符流写入文件。

在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。

java.io.Reader 和 java.io.InputStream 组成了Java 输入类。
Reader 用于读入16位字符,也就是Unicode 编码的字符;而InputStream用于读入 ASCII 字符和二进制数据。
Reader支持16位的Unicode字符输出,InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构。
1byte = 8bits
InputStream、OutputStream是用来处理8位元的流,Reader、Writer是用来处理16位元的流。
而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。
值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配、由OutputStream到Writer的适配。转换例子:InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\demo.txt"));/
在Java中,有不同类型的 Reader 输入流对应于不同的数据源:
FileReader 用于从文件输入;CharArrayReader 用于从程序中的字符数组输入;StringReader用于从程序中的字符串输入;PipedReader 用于读取从另一个线程中的PipedWriter 写入管道的数据。
相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。
另外,还有两种没有对应 Reader 类型的 InputStream 输入流: Socket 用于套接字; URLConnection 用于 URL 连接。 这两个类使用 getInputStream() 来读取数据。
相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值