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

java io 一些总结

2016-04-23 10:36 465 查看
首先,java io分为两大阵营,字节流,字符流。结构图如下:



一些常用类的用法以及注意点:

IO流(FileInputStream)

FileInputStream fis = new FileInputStream("aaa.txt");   //创建一个文件输入流对象,并关联aaa.txt
int b;                                                  //定义变量,记录每次读到的字节
while((b = fis.read()) != -1) {                         //将每次读到的字节赋值给b并判断是否是-1
System.out.println(b);                              //打印每一个字节
}

fis.close();                                            //关闭流释放资源


IO流(read()方法返回值为什么是int)

答:因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111。那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上。24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型。

IO流(FileOutputStream)

FileOutputStream fos = new FileOutputStream("bbb.txt"); //如果没有bbb.txt,会创建出一个
//fos.write(97);                        //虽然写出的是一个int数,但是在写出的时候会将前面的24个0去掉,所以写出的一个byte
fos.write(98);
fos.write(99);
fos.close();


IO流(拷贝图片)

FileInputStream fis = new FileInputStream("01.mp3");    //创建输入流对象,关联01.mp3
FileOutputStream fos = new FileOutputStream("copy.mp3");//创建输出流对象,关联copy.mp3

int b;
while((b = fis.read()) != -1) {
fos.write(b);
}

fis.close();
fos.close();


IO流(定义小数组的标准格式)

FileInputStream fis = new FileInputStream("01.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
int len;
byte[] arr = new byte[1024 * 8];                    //自定义字节数组

while((len = fis.read(arr)) != -1) {
//fos.write(arr);
fos.write(arr, 0, len);                         //写出字节数组写出有效个字节个数
}

fis.close();
fos.close();


IO流(BufferedInputStream和BufferOutputStream拷贝)

FileInputStream fis = new FileInputStream("01.mp3");            //创建文件输入流对象,关联致01.mp3
BufferedInputStream bis = new BufferedInputStream(fis);         //创建缓冲区对fis装饰
FileOutputStream fos = new FileOutputStream("copy.mp3");        //创建输出流对象,关联copy.mp3
BufferedOutputStream bos = new BufferedOutputStream(fos);       //创建缓冲区对fos装饰

int b;
while((b = bis.read()) != -1) {
bos.write(b);
}

bis.close();                        //只关装饰后的对象即可
bos.close();


IO流(flush和close方法的区别)

答:

flush()方法:

用来刷新缓冲区的,刷新后可以再次写出 。

close()方法:

用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出 。

IO流(字节流读写中文)

字节流读取中文的问题

字节流在读中文的时候有可能会读到半个中文,造成乱码

字节流写出中文的问题

字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组

写出回车换行 write(“\r\n”.getBytes());

IO流(流的标准处理异常代码1.6版本及其以前)

FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("aaa.txt");
fos = new FileOutputStream("bbb.txt");
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
} finally {
try {
if(fis != null)
fis.close();
}finally {
if(fos != null)
fos.close();
}
}


IO流(流的标准处理异常代码1.7版本)

try(
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
MyClose mc = new MyClose();
){
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
}


原理:

在try()中创建的流对象必须实现了AutoCloseable这个接口,如果实现了,在try后面的{}(读写代码)执行后就会自动调用,流对象的close方法将流关掉

IO流(图片加密)

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.jpg"));

int b;
while((b = bis.read()) != -1) {
bos.write(b ^ 123);
}

bis.close();
bos.close();


IO流(字符流FileReader)

FileReader fr = new FileReader("aaa.txt");              //创建输入流对象,关联aaa.txt
int ch;
while((ch = fr.read()) != -1) {                         //将读到的字符赋值给ch
System.out.println((char)ch);                       //将读到的字符强转后打印
}

fr.close();


IO流(字符流FileWriter)

FileWriter fw = new FileWriter("aaa.txt");
fw.write("aaa");
fw.close();


IO流(字符流的拷贝)

FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");

int ch;
while((ch = fr.read()) != -1) {
fw.write(ch);
}

fr.close();
fw.close();


IO流(自定义字符数组的拷贝)

FileReader fr = new FileReader("aaa.txt");          //创建字符输入流,关联aaa.txt
FileWriter fw = new FileWriter("bbb.txt");          //创建字符输出流,关联bbb.txt

int len;
char[] arr = new char[1024*8];                      //创建字符数组
while((len = fr.read(arr)) != -1) {                 //将数据读到字符数组中
fw.write(arr, 0, len);                          //从字符数组将数据写到文件上
}

fr.close();                                         //关流释放资源
fw.close();


IO流(带缓冲的字符流)

BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));  //创建字符输入流对象,关联aaa.txt
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));  //创建字符输出流对象,关联bbb.txt

int ch;
while((ch = br.read()) != -1) {     //read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量ch
bw.write(ch);                   //write一次,是将数据装到字符数组,装满后再一起写出去
}

br.close();                         //关流
bw.close();


BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率。

BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率。

IO流(readLine()和newLine()方法)

BufferedReader的readLine()方法可以读取一行字符(不包含换行符号).

BufferedWriter的newLine()可以输出一个跨平台的换行符号”\r\n”.

BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
//bw.write("\r\n");                 //只支持windows系统
bw.newLine();                       //跨平台的
}

br.close();
bw.close();


IO流(使用指定的码表读写字符)

FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)。

FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)。

BufferedReader br =                                     //高效的用指定的编码表读
new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));
BufferedWriter bw =                                     //高效的用指定的编码表写
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
int ch;
while((ch = br.read()) != -1) {
bw.write(ch);
}

br.close();
bw.close();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java io流 字符流