Java字符流和字节流对文件操作的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java字符流和字节流对文件操作的区别相关的知识,希望对你有一定的参考价值。

Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。

字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;

字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;
而字节流按字节读取,不作任何处理,常用于读取二进制数据。

Java中的字符在内部都是使用Unicode进行表示的,因此,要正确读取字符数据,需要知道字符的编码字符集,字符流提供编码字符集的指定,如果不指定使用系统默认的方式对字符数据进行编码转换,这个编码字符集不正确,会造成读进来的地字符出现乱码。

字节流虽然是读取二进制数据用的,但也可以读取字符文件,按字节进行处理,读进来之后可以根据编码字符集进行转换,也可以变成字符串。
参考技术A 一、java的IO流分两种流 :
1、字节流 InputStream OutputStream
2、字符流 Reader Writer
他们都是抽象类
二、他们的区别:

1、字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.
2、字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流转换成字符流可以用 InputSteamReader OutputStreamWriter
//字节流转换成InputStreamReader
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
//InputStreamReader 转换成带缓存的bufferedReader
BufferedReader bufferedReader = new BufferedReader(inputSteamReader);
参考技术B 1.Java字符流是处理字符(Char)对象用的,字节流是处理字节(Byte)对象用的。处理的目标对象不同,处理方法也就不一样了。

2.字符流处理的基本单位是字符(Java中的字符是16位的),输入流以Reader为基础,输出流以Writer为基础;
字节流的基本单位是字节(Java中的字节是8位的),输入流以 InputStream为基础,输出流以 OutputStream为基础;

3字符流在输入时可以按字符读取,也可以按行读取,会去掉回车换行,常用于读取字符数据;
而字节流按字节读取,不作任何处理,常用于读取二进制数据。

Java字符流和字节流对文件操作

记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询。Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中。而字符流操作的最小单位则是字符。可以先看一下IO流的概述:

 

下面首先是通过字符流对文件进行读取和写入:

 1 package lib;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileReader;
 7 import java.io.FileWriter;
 8 import java.io.IOException;
 9 import java.io.PrintWriter;
10 
11 public class Test {
12     // 定义文件路径
13     File f = new File("F:\\\\test.txt");
14     //字符流读取的方法
15     public String writeInFile() throws IOException{
16         String str = "";
17         String count = "";
18         try {
19             // 使用字符流对文件进行读取
20             BufferedReader bf = new BufferedReader(new FileReader(f));
21             while (true) {
22                 //读取每一行数据并将其赋值给str
23                 if ((count = bf.readLine()) != null) {
24                     str += count;
25                 } else {
26                     break;
27                 }
28             }
29             // 关闭流
30             bf.close();
31         } catch (FileNotFoundException e) {
32             e.printStackTrace();
33         }
34         return str;
35     }
36     //字符流写入方法
37     public  void getReader(){
38         try {
39             //其中true表示在原本文件内容的尾部添加,若不写则表示清空文件后再添加内容
40             PrintWriter pw=new PrintWriter(new FileWriter(f,true));
41             pw.write("测试输入字符串到文件中2");
42             pw.close();
43         } catch (IOException e) {
44             e.printStackTrace();
45         }
46     }
47     public static void main(String[] args) throws IOException {
48         Test test=new Test();
49         //将字符串输入到文件中
50         test.getReader();
51         //读取相对应的字符串
52         String str=test.writeInFile();
53         //将文件中内容在控制台输出
54         System.out.println("文件内容为:"+str);
55     }
56 }

上述代码的关键地方都有注释,就不再一一赘述了,主要就是在使用完流之后不要忘记关闭就好(行30,行42)

然后是通过字节流的方式对文件进行操作,将一个文件中的内容复制到另一个文件中:

 1 package com.file.test2;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 
 9 public class TestFile2 {
10     //使用字节流读取并写入文件,将一个文件复制到另一个文件中
11     public static void main(String[] args) throws IOException {
12         //要复制的源文件
13         File f=new File("D:\\\\test.txt");
14         //目标文件
15         File f2=new File("D:\\\\test2.txt");
16         //定义一个byte类型的数组,用于存储读取到的内容
17         byte [] b=new byte[1024];
18         int length;
19         try {
20             //定义读取的流
21             FileInputStream in=new FileInputStream(f);
22             //定义输出到文件的流
23             FileOutputStream out=new FileOutputStream(f2);
24             //将文件内容输出到另一个文件中
25             while((length=in.read(b))!=-1){
26                 out.write(b, 0, length);
27             }
28             out.close();
29             in.close();
30         } catch (FileNotFoundException e) {
31             e.printStackTrace();
32         }
33     }
34 }

在字节流的操作中,第13行的源文件必须存在,可以根据需要自行更改文件路径,只需要存在即可,否则会报文件找不到的错误,同时若想在控制台输出读取到的字节流的内容则可以在第27和28行之间加两句代码:in.read(b, 0, b.length);System.out.println(new String(b));

以上就是字符流和字节流的相关操作,其实代码不难,主要是自己的理解,相同的问题每个人都会有不同的理解方式,当然,对于我们编程人员来说,除了要多思考之外还要多动手。最后希望以上内容能对大家有所帮助

以上是关于Java字符流和字节流对文件操作的区别的主要内容,如果未能解决你的问题,请参考以下文章

字符流和字节流的区别

JAVA——IO流-字符流和字节流

字符流和字节流

字符流和字节流的区别

java里字符流 字节流和序列化的区别?

Java - IO