您的位置:首页 > 编程语言 > Java开发

Java 字节流与字符流的总结和理解

2016-07-06 14:42 495 查看

常用流的介绍

Java 输入输出流中主要有几个重要的类,掌握了这几种,其他的流可以类比学习。

下面就着重学习以下的类:

Inputstream

Outputstream

FileInputstream

FileOutputstream

Reader

Writer

FileReader

FileWriter

InputStreamReader

OutputStreamReader

BufferReaderStream

BufferWriterStream

一开始不要被上面的这么多类所迷糊,尤其是什么字节流,或者字符流之类的,其实只是它们写入或者读出来的文件中不同的源文件的形式所决定的。

输入输出流仅提供一条通道程序,可以使用这条通道读取源中的数据或者把数据送到目的地。

由于到目前为止结合一些书本和视频讲解我所理解的内容,故总结出来与大家一起分享

InputStream OutputStream Reader Writer 基本知识讲解

InputStream OutputStream Reader Writer是一些底层类,同时是抽象类,由它的子类来完成流的任务,那为什么会有两种呢?

因为输入输出流中的源不同,即读写的的对象单元编码不同,可以将每种编码规则理解为一种协议,如果双方编码不同,那读出来就有可能是乱码。Java的流操作分为字节流和字符流,每种流所接收的类型不同,读写操作时要读对应的对象。InputStream OutputStream是针对字节流的,字节流中输入输出的数据是以单个字节为读写单位的,字符流是由Java虚拟机将单个字节转化为两个字节的unicode字符。Reader Writer是字符流。

一般在什么情况下使用字节流或者字符流呢?

一段二进制数据,如音频,视频,图像等,使用字节流操作比较方便,但如果操作对象是一段文本,操作时使用字节流操作,读取时应以字节流读入,如果要显示为字符,需要自己与字符的转换。但是运用面向对象的思想,我们诞生了一个直接操作文本数据的字符流。可以从JDK中看到,字符流是在JDK1.1时才有的。

FileInputstream FileOutputstream FileReader FileWriter基本知识

FileInputstream FileOutputstream Reader Writer分别是InputStream OutputStream Reader Writer

的实现子类,这个应该比较容易理解。对应的一些方法我就不介绍了。

InputStreamReader OutputStreamReader基本知识

(1) 字节输入流变成字符输入流:InputStreamReader

(2) 字节输出流变成字符输出流:OutputStreamReader

为了达到较高效率,避免频繁的进行相互转换,而应尽量用BufferWriter和BufferReader 来包装它们。

还有一些其他的类,在这里就不一 一介绍了。

对文件字节流和字符流的基本读写操作

这些基本操作,再常见的编程中经常遇到,例如从服务器中读取数据。

接下来是简单的代码演示,基本的底层类不再使用,像inputStream,outputstream,Reader,Writer等抽象类。

首先使用FileReader FileWriter对字符流进行读写操作

为了方便,将读写写在一个程序里

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class fileop {
public static void main(String[] args){
String content="hello我是中国人";
File file=new    File("C:\\Users\\Administrator\\Desktop\\test\\c.txt");
char[] c=content.toCharArray();
try {
FileWriter fw=new FileWriter(file);
fw.write(c);
fw.close();
FileReader fr=new FileReader(file);
char[] c2=new char[100];
int count=0;
while((count=fr.read(c2))!=-1){
String string=new String(c2,0,count);
System.out.println(string);
}
fr.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


接下来使用字节流FileInputStream FileOutputStream 进行读写

1. 创建文件字节流输入流

FileInputStream(File file);

FileInputStream(String string);

2. read()方法以字节为单位读

int read(byte b[]);

int read(byte b[],int off,int len);

文件字节流的写的方法类似,这里不再重复

代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class input {
public static void main(String[] args) {
File file=new File("C:\\Users\\Administrator\\Desktop\\test\\a.txt");
File file2=new File("C:\\Users\\Administrator\\Desktop\\test\\c.txt");
byte[] b=new byte[100];
int count=0;
String txt="我是中国人";
byte[] b2=txt.getBytes();

try {
FileInputStream is=new FileInputStream(file);
try {
while((count=is.read(b))!=-1){
String string=new String(b,0,count);
System.out.println(string);

}
is.close();
FileOutputStream os=new FileOutputStream(file2);
os.write(b2);
os.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


利用BufferReaderStream BufferWriterStream代码进行读写,它们可以对代码以行为单位进行读写

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class demo {
public static void main(String[] args) {
String[] content={"我是中国人","我爱中国","我讨厌日本人","我讨厌韩国人"};

try {
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\test\\c.txt");
BufferedWriter bw=new BufferedWriter(fw);
for(String str:content){
bw.write(str);
bw.newLine();
}
bw.close();
fw.close();
FileReader fr=new FileReader("C:\\Users\\Administrator\\Desktop\\test\\c.txt");
BufferedReader br=new BufferedReader(fr) ;
String string=null;
while((string=br.readLine())!=null){
System.out.println(string);
}
br.close();
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}


以上这些内容就是Java输入输出流的文件操作,希望可以对大家有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: