java学习
一.io流
简介:io,i代表in,指的是输入,o代表输出。io流是用于处理输入和输出数据的机制。Java的io流主要分为字节流和字符流两种类型。这些流可以用于读取和写入不同类型的数据,如文本,图片,声音等。
1.字节输入流
1.1 字节输入流读取单个字节
我们首先需要实例化一个FileInputStream对象,并且指向一个文件,这里我们先用文本文件。
对对象调用read方法。
InputStream s1=new FileInputStream("src\\io\\12.txt");int b1;b1=s1.read();System.out.println(b1);s1.close();
文件内部
这里是读取了字符的ASCll码值,可以将其转成字符。
InputStream s1=new FileInputStream("src\\io\\12.txt");int b1;b1=s1.read();System.out.println((char)b1);s1.close();
我们还可以用循环将字符一次性读取完。
因为当文件数据读取完后,再读取会返回-1,所以可以利用这个特性去写循环代码。
InputStream s1=new FileInputStream("src\\io\\12.txt");int b1;while ((b1= s1.read())!=-1){System.out.print((char) b1);}s1.close();
注意:在utf-8编码格式中中文占3个字节,所以文本有中文会读取异常。
需要注意的是,我们在往后的使用中,文件的数据通常有几十万个字节,如果我们一个一个读取就会需要循环几十万次,这样效率太低了,所以我们可以一次读取多个字节。
1.2 字节输入流读取多个字节
我们可以使用数组,每次最多装的字节数就是数组的容量。
InputStream s1=new FileInputStream("src\\io\\12.txt");byte[] buffer=new byte[3];int length=s1.read(buffer);System.out.println(new String(buffer, 0, length));s1.close();
这里我们设置每次读取3个字节,然后用字符串转换输出。
我们也可以用循环输出全部字节。
InputStream s1=new FileInputStream("src\\io\\12.txt");byte[] buffer=new byte[3];int length;while ((length=s1.read(buffer))!=-1){System.out.print(new String(buffer, 0, length));}s1.close();
那这里为什么又能输出中文了呢?
因为在输出中文时,是一次性将中文所占的三个字节全部拿出了,如果再整合成了一个字符,如果你换一下文本前面字母数字的个数,输出还是会异常。
通过字节输入流读取多个字节可以自定义选择读取的字节数,并且也可以加快读取速度。
2.字节输出流
2.1 字节输出流读取单个字符
这里和输入的格式也是一样,只是实例化的对象变为FileOutputStream,调用write方法可以写入你想要写入的字符。
OutputStream r1=new FileOutputStream("src\\io\\12.txt");r1.write('1');r1.write('2');r1.write('3');r1.write('4');r1.close();
里面也可以放入ASCll码值,比如放入97,就会存入'a'。
2.2字节输出流读取多个字符
还是和上面一样使用到数组。
OutputStream r1=new FileOutputStream("src\\io\\12.txt");byte[] bytes={98,99,100,101,102,103,104};r1.write(bytes);r1.close();
如果想不覆盖原文件内容而是直接追加,那我们只需要在文件路径后面加true。
OutputStream r1=new FileOutputStream("src\\io\\12.txt",true);byte[] bytes={98,99,100,101,102,103,104};r1.write(bytes);r1.close();
字节流由于其特性,可以输入输出任何数据,但是对文本文件的输入输出的效果却比不上字符流方便,所有在处理文本文件尽量使用字符流,也可以很好对中文进行处理。
3.字符输入流
3.1 字符输入读取单个字符
这里使用FileReader示例化对象,也是调用read方法,可以输入中文。
循环输入全部字符
Reader r1=new FileReader("src\\io\\12.txt");int c;while ((c=r1.read())!=-1) {System.out.print((char)c);}r1.close();
3.2 字符输入读取多个字符
使用字符数组
Reader r1=new FileReader("src\\io\\12.txt");int c;char[] buffer=new char[4];r1.read(buffer);System.out.println(new String(buffer, 0, 4));r1.close();
循环读取
Reader r1=new FileReader("src\\io\\12.txt");int c;char[] buffer=new char[4];while ((c=r1.read(buffer))!=-1){System.out.println(new String(buffer, 0, c));}r1.close();
4.字符输出流
4.1 字符输出流读取单个字符
实例化FileWriter对象,然后调用write方法,直接往里面放字符。
Writer r1=new FileWriter("src\\io\\12.txt");r1.write('1');r1.write('王');r1.close();
4.2 字符输出流读取多个字符
可以直接在writer方法里面放字符串。
Writer r1=new FileWriter("src\\io\\12.txt");r1.write("你好世界");r1.close();
也可以输出部分,方法起始点和长度即可。