1.I/O流有什么用途?
Java程序使用I/O流对磁盘进行读和写操作。I:Input的缩写,表示从磁盘中读取文件数据到内存;O:Output的缩写,表示将数据从内存中写入磁盘进行永久保存;流:即数据,把数据的读写看成和水的流动一样。I/O涉及到磁盘读写,非常耗时间,而数据都是存放在磁盘中的,因此在涉及I/O操作时,要想办法减少I/O操作的次数。比如数据库索引数据结构的选择,考虑到磁盘I/O,最终选择了B+树作索引的数据结构。
2.如何使用I/O流?
Java提供了使用I/O流的接口,按数据格式分为了两大类:字节流和字符流。字节流:数据是一个个字节汇集而成的;字符流:数据是一个个字符汇集而成的。I/O流将文件看作是对象进行操作。接下来演示I/O的使用方法。
2.1字符流
2.1.1字符输入流
2.1.1.1普通字符输入流
依次读取一个字符
@Test
public void test1() throws Exception {
File file = new File("src/abcd.txt");//创建文件对象
Reader fr=new FileReader(file);//创建一个字符输入流与源文件接通
int code;
while((code=fr.read())!=-1)//read方法没有参数,表示读取一个字符,返回其ascii码
{
System.out.print((char) code);//ascii码强转为字符
}
}
每次读取一堆字符:用到字符数组转String类的方法:String new String(字符数组变量名,0,字符数组的长度);
@Test
public void test2() throws Exception {
//1.根据源文件创建文件对象
File file = new File("src/abcd.txt");
//2.创建一个字符输入流与源文件接通
Reader fr=new FileReader("src/abcd.txt");
//3.设置字符数组,接收文件中的数据,当作单数传入read方法,一次读取指定数量的字符(如有)
char[] buffer=new char[1024];//可存放1k个字符(大于源文件中的字符数)
int len;
while((len=fr.read(buffer))!=-1)
{
//字符数组转成字符串,有多少转多少,个数用len表示
String s = new String(buffer, 0, len);
System.out.println(len);//字符数组的长度
System.out.println(s);//源文件的内容
}
2.1.1.2缓冲字符输入流
缓冲:在内存中申请一段内存空间,用于存放磁盘中可能用到的数据,即将磁盘中的数据的一部分放到内存中,加快读写速度。缓冲字符流是普通字符流的包装,属于高级流。
一次读取一行字符
//每次读取一行字符
@Test
public void test1(){
try(
//1.创建一个字符输入流与源文件接通
Reader fr=new FileReader("src/abcd.txt");
//流包装
BufferedReader br=new BufferedReader(fr);
){
String line;
//读取行
while((line=br.readLine())!=null )
{
System.out.println(line);
}
}catch (Exception e){
e.printStackTrace();
}
}
一次读取多行
//每次读取多行字符
@Test
public void test2() throws Exception {
//1.创建一个字符输入流与源文件接通
try(
Reader fr=new FileReader("src/abcd.txt");
){
char[] buffer = new char[1024];2.设置字符数组,接收文件中的数据:1k个字符
int len;
while ((len = fr.read(buffer)) != -1)
{
String s = new String(buffer, 0, len);
System.out.println(s);
}
}catch(Exception e){
e.printStackTrace();
}
}