Java的字节输入输出与字符的其实大同小异,区别主要在于一个是字节是字符,但是类比较多,本文主要就是整理一下我在学习过程中遇到的类。
字节流
字节输入流
各种字节输入流的含义如下
它们的常用方法有:
在这些输入流类中,比较常见的要属文件输入流FIleInputStream了
常用read(byte[])来以一个字节数组为单位的读取数据。下面用代码举例说明:
第一种写法(比较常用的):
static void input() throws IOException {
//创建文件对象
File f=new File("D:\\pra\\1.txt");
//创建字节输入流对象
FileInputStream in=new FileInputStream(f);
String str1="";
byte [] b=new byte[1024];//字节数组用于接收读入到的数据
int temp;
while((temp=buf.read(b))!=-1) {
String str =new String(b,0,temp);//将读进字节数组的数据从0开始temp个字节转换为字符串str
str1+=str;//每读一次就追加到str1上
}
System.out.println(str1);
in.close();//关闭流
}
第二种写法:
static void input() throws IOException {
//创建文件对象
File f=new File("D:\\pra\\1.txt");
//创建字节输入流对象
FileInputStream in=new FileInputStream(f);
int temp;
while((temp=in.read())!=-1) {
System.out.print(char(temp));//逐字节的转换
}
System.out.println(str1);
}
字节缓冲输入流
static void input() throws IOException {
//创建文件对象
File f=new File("D:\\pra\\1.txt");
//创建字节输入流对象
FileInputStream in=new FileInputStream(f);
//创建字节输入缓冲流对象
BufferedInputStream buf=new BufferedInputStream(in);
String str1="";
byte [] b=new byte[1024];//字节数组用于接收读入到的数据
int temp;
while((temp=buf.read(b))!=-1) {
String str =new String(b,0,temp);//将读进字节数组的数据从0开始temp个字节转换为字符串str
str1+=str;//每读一次就追加到str1上
}
System.out.println(str1);
buf.close();//关闭流时从内向外
in.close();
}
字节输出流
各种输出流类:
字节输出流的常用方法
其中常用的FileOutputStream
代码示例:
第一种:
static void out() throws IOException{
File f=new File("D:\\pra\\1.txt");
FileOutputStream out=new FileOutputStream(f,true);//设置true表示追加
out.write("\n字节缓冲输出流".getBytes());
out.flush();
out.close();
}
第二种:
static void out() throws IOException{
File f=new File("D:\\pra\\1.txt");
FileOutputStream out=new FileOutputStream(f,true);
Byte[] b={1,2,3}
for(Byte i:b)
out.write(i);//逐字节写入
out.flush();
out.close();
}
字节缓冲输出流
代码示例:
static void out() throws IOException{
File f=new File("D:\\pra\\1.txt");
FileOutputStream out=new FileOutputStream(f,true);
BufferedOutputStream buf=new BufferedOutputStream(out);
buf.write("\n字节缓冲输出流".getBytes());
out.flush();
buf.flush();
buf.close();
out.close();
}
字符流
- 字符流是针对字符型数据的特点而设计,提供一些面向字符的有用特性。主要的操作类是Writer和Reader。
- Reader和Writer类:是所有字符流的超类,是直接继承Object类的抽象类,可读写16位的字符流。
- 在错误的情况下抛出IOException异常。
有了字节输入输出流的基础,字符流也就不难了,写法上与字节流大同小异
字符输入流
代码示例:
static void cRead() throws IOException {
File f=new File("D:\\pra\\1.txt");
FileReader rea=new FileReader(f);
char[] ch=new char[1024];
int temp;
String str1="";
while((temp=rea.read(ch))!=-1) {
String str=new String(ch,0,temp);
str1+=str;
}
System.out.println(str1);
}
字符缓冲输入流
static void cbRead() throws IOException {
File f=new File("D:\\pra\\1.txt");
FileReader rea=new FileReader(f);
BufferedReader buf=new BufferedReader(rea);
char c[]=new char[1024];
int sum;
String str1="";
while((sum=buf.read(c))!=-1) {
String str=new String(c,0,sum);
str1+=str;
}
System.out.println(str1);
buf.close();
}
字符输出流
代码示例:
static void cWrite() throws IOException {
File f=new File("D:\\pra\\1.txt");
FileWriter wri=new FileWriter(f,true);
wri.write("\n字符输出流");
wri.flush();
wri.close();
}
字符缓冲输出流
static void cbWrite() throws IOException {
File f=new File("D:\\pra\\1.txt");
FileWriter wri=new FileWriter(f,true);
BufferedWriter buf=new BufferedWriter(wri);
buf.write("\n字符缓冲输出流");
buf.flush();
buf.close();
}
补充
缓冲流:
所谓的缓冲流,就是为某个固定的流配备一个缓冲区(就是一块内存区域),提高读写操作的效率。缓冲区要结合流才能使用,在流的基础上对流的功能进行了增强。
缓冲区:
缓冲区就是一段特殊的内存区域。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
针对文件的操作提供的有字节缓冲流和字符缓冲流:
字节缓冲流
- BufferedOutputStream
- BufferedInputStream
字符缓冲流
- BufferedWriter
- BufferedReader
字节流与字符流区别
字节流与字符流的使用非常相似,两者除了操作代码上的不同之外,还存在一些差别:
- 字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的。
字符流主要用在处理文本文件数据,它是按照字符来处理的。 - 字节流在操作时本身不会用到缓冲(内存),是对文件本身直接操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件的。