1.基本概念:
字节流InputStream/OutputStream家族,这些类用来读写以字节为单位的流,通常用来处理二进制流
字符流Reader/Writer家族,这些类用来读写以Unicode字符组成的文本流,用来处理文本流
介质流:这些流是在某一个介质上发生的,介质流是直接和保存数据的介质打交道的流
比如 FileInputStream /FileOutputStream,它的流是一个文件,是指打开一个 文件,以那个文件的内容作为流来读
过滤器流:把字节转换成二进制,过滤流是构造在介质流或者其他过滤流的基础上的流
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class DataSava {
public static void main(String[] args) {
int i=1234;
double d=1234.0;
try{
DataOutputStream out=new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("data.bin")));
out.writeInt(i);
out.writeDouble(d);
out.close();
DataInputStream in=new DataInputStream(
new BufferedInputStream(
new FileInputStream("data.bin")));
int ii=in.readInt();
double dd=in.readDouble();
in.close();
System.out.println(ii);
System.out.println(dd);
}catch(Exception e){
String str=e.toString();
System.out.println(str);
}
}
}
现在我们一般用Reader/Writer来读写标准输入输出 ,见下边的几个例子
2.从键盘输入多组数据,存入到文件中,并从文件中读数据
平时接触到的所有文件都是以字节为单位进行编码的文件
键盘读入:BufferedReader br=new BufferedReader(new InputStreamReader(System.in))
这对桥梁类,在读写过程中,会自动进行本地编码和Unicode之间的转换
读文件:BufferedReader fin=new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
写文件:
BufferedWriter out=new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file)));
(1) FileInputStream /FileOutputStream 都是介质流,以文件的内容作为流,以文件中的内容为流进行读取,因为文件都是以字节为单位进行编码的
(2) InputStreamReader 是字节流通向字符流的桥梁:它使用指定的
读取字节并将其解码为字符。charset
OutputStreamWriter 是字符流通向字节流的桥梁
(3) BufferReader: 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
BufferWriter: 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
package io;
import java.io.*;
public class ReaderWriter1 {
public static void main(String[] args) {
//从键盘输入多组数据,存入到文件中
File file=new File("out.txt");
try{
BufferedReader br=new BufferedReader(
new InputStreamReader(System.in));
BufferedWriter out=new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file)));
String line1=null;
int i=0;
while(i++<10){
line1=br.readLine();
out.write(line1);
out.flush();//将缓冲区的数据实际地写入流的介质
out.newLine();// 写入一个行分隔符
}
br.close();
out.close();
//从文件中读数据
BufferedReader fin=new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
String line2;
while((line2=fin.readLine())!=null){
System.out.println(line2);
}
fin.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
3.设计一个程序,用户输入一个文件名,打开该文本文件,并统计输出其中26个英文字母出现的次数
package io;
import java.io.*;
public class staticisc {
public static void main(String[] args) {
int a[]=new int[26];
try{
BufferedReader br=new BufferedReader(
new InputStreamReader(
new FileInputStream("read.txt")));
String s=null;
while((s=br.readLine())!=null){
char arr[]=s.toCharArray(); //字符串转换成 字符数组
for(int i=0;i<s.length();i++){
a[arr[i]-'A']++;
}
}
for(int i=0;i<26;i++){
System.out.println((char)('A'+i)+":"+a[i]);//强制类型转换
}
}catch(Exception e){
e.printStackTrace();
}
}
}