常常会用到Java中的文件操作,先看下面的表:
字节流 | 字符流 | |
输入 | InputStream | Reader |
输出 | OutputStream | Write |
字节流的底层是InputStream和OutputStream,文件操作继承于此,读/写分别为:FileInputStream和FileOutputStream,可以对任何类型的文件进行操作。以读文件为例:
FileInputStream fin=new FileInputstream(fileName); //打开文件进行操作
Java给出了几种read()方法:
1、int read(); 此输入流中读取一个数据字节,文件结束则返回-1;
int ch=fin.read();返回内容的数字形式,常常用Integer.toHexString(ch)来查看内容的十六进制形式
2、int read(byte []); 读入byte数组中,返回实际读到的字节数,可能小于数组的长度;
byte []temp=new byte[16];
int length=fin.read(temp);
结果length<=16;
3、int read(byte[] b, int off, int len);从此输入流中将最多 len 个字节的数据读入一个 byte 数组中
另外提供了一个long skip(long n)函数,丢弃字节流中的前n个字节,这个在随机文件读写中非常有用(多线程下载,文件分割等)。
常常用另一种形式来操作文件,BufferedInputStream,基于缓冲的字节操作,底层需要包含FileInputStream来实现,如:
BufferedInputStream br=new BufferedInputStream(new FileInputStream(fileName));具体操作参考前面。
对于文本操作,字符相对方便一点,也能直观显示文件内容
FileReader读取文件操作,read()方法也与前面一致
int ch=fr.read();返回字符的数字形式
强制转化后还原成原来的字符,char(ch)
FileWirter fw几种常用的形式:
write(int ch);
write(String str);
write(char []buff);
write(char []buff, int startIndex,int num);
write(String str, int startIndex,int num);
字节流到字符流转换的桥梁
public InputStreamReader(InputStream in);
Reader和Writer类允许用户在程序中无缝的支持国际字符集,如果要读取的文件是别国语言,要使用字符流。
字节流是一个字节一个字节的输入/输出数据(两个字节组成一个汉字)所以在用字节流读一串汉字时会出现乱码问题,可采用字符流进行读取。
同样字符流是一个字符一个字符的输入/输出数据(一个字符=两个字节)所以用字符流读一串汉字可以解决乱码问题,同时它也兼顾了英文,这是由unicode的编码规则决定的,因为中文的unicode字符有特殊标识。
读取:
BufferedReader br= new BufferedReader(new InputStreamReader(new FileInputStream(File file), "UTF-8"));
从键盘获得输入:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
写入:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(File file), "UTF-8"));