1…io
1.1…io概述
l IO流用来处理设备之间的数据传输
l Java对数据的操作是通过流的方式
l Java用于操作流的对象都在IO包中
l 流按操作数据分为两种:字节流与字符流。
l 流按流向分为:输入流,输出流
io流主要用于做什么:我们可以通过java语言来处理设备上的数据,设备上的数据就是内存中的数据或者硬盘里的文件,想要处理这些设备上的数据就得用io流也叫数据流
1.2..IO流常用基类
l 字节流的抽象基类:
• InputStream ,OutputStream。
l 字符流的抽象基类:
• Reader , Writer。
l 注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
• 如:InputStream的子类FileInputStream。
• 如:Reader的子类FileReader
1.3…字符流的特点。
既然IO流是用于操作数据的,
那么数据的最常见体现形式是:文件。
2…Filewrite类
FileWriter(String fileName) 参数是指定的文件名
根据给定的文件名构造一个FileWriter 对象。
发现FileWriter 没有无参构造函数因为你想要操作文件想给文件写点数据,应该先有文件,所以这个流对象一被初始化必须有被操作的文件存在
代码:
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。想要操作数据的话得先有一个数据的存放位置,,
//而且该文件会被创建到指定目录下,,,如果该目录下已有同名文件,将被覆盖,
FileWriterfw = new FileWriter("demo.txt"); //new时在内存中产生一个对象同时在指定的目录下产生一个指定名称的文件,他在创建文件
//调用write方法,将字符串写入到流(内存)中。没有把字符串写入到文件中,此时文件里面没有数据,,流在内存当中,因为创建了流对象
fw.write("abcde");
//刷新流对象中的缓冲区中的数据。把流里面的数据放到文件里去用flush(刷新)()方法,,流对象进内存以后,,他内部有缓冲区,临时存放数据,你想把这些数据放到文件中去只要flush,他就会清空,, //将数据刷
fw.flush();
//close关闭流资源,但是关闭之前会刷新一次流内部中的缓冲区中的数据。
//和flush区别:flush刷新后,流可以继续使用(代码6),close刷新后,会将流关闭。代码9,,调用close的话之前会调用一次flush,然后把这资源到底层给关掉,
fw.close();
3…IO异常的处理方式
try{
//这里调用了window底层创建文件的方法产生"demo.文件,都在调用底层资源,所以都会发生io异常,凡是能和设备上数据发生数据关系,无论读或者写还有创建文件,这些处理方式都会发生io异常
FileWriterfw=new FileWriter("demo.text");
fw.write("abcdefg");
fw.close();
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally
{
try
{
if(fw!=null) 避免发生空指针异常,,如果这里要关闭多个流对象时就得写多个if去关闭,不能写在一个if里面
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
4…文件的续写
FileWriter(String fileName, booleanappend) 是在原有文件数据基础上添加数据,,,对已有文件的数据续写。
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
代码:
//传递一个true参数,代表不覆盖已有的文件。如果文件不存在就创建一个新的文件,文件存在就不创建了并在已有文件的末尾处进行数据的续写。
fw= new FileWriter("demo.txt",true); true代表在原有文件数据基础上续写数据
5…文本文件读取方式
第一种读取方式:
父类Reader里的方法
intread()
读取单个字符。 就是调用一次 read()就读取一个字符,, 一次读一个字符。而且会自动往下读。
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
用于支持高效的单字符输入的子类应重写此方法。
代码;
FileReader fr = newFileReader("c:\\demo.txt");
intch = 0;
while((ch=fr.read())!=-1)
{
System.out.println("ch="+(char)ch);
}
fr.close();
第二种读取方式:
文本文件读取方式二:通过字符数组进行读取。这种方式好,,,第一种读取方式是我读一个就打印一个,现在是我读一个就保存一个,我存满一次以后就全打印出去
intread(char[] cbuf)
读取数据的方式除了一次读一个字符(调用read()方法)以外呢还有一种方式read(char[] cbuf) 将字符读入数组。把字符读到数组里面去
把流关联的数据读一个就存到数组里面去,,调用一次这个方法时他会不停的读取数据放到数组里直到数组装不下或者读到末尾了就不读了
代码:
FileReaderfr = new FileReader("demo.txt");
//定义一个字符数组。用于存储读到字符。
//该read(char[])返回的是读到字符个数。
char[]buf = new char[3];
intnum = 0; 定义一个变量保存每次返回的读取个数,每一次返回的读取个数不一样所以用变量保存
while((num=fr.read(buf))!=-1)装满一次就打印输出一次或者没有装满(就是文件数据小于数组长度)时就输出来
{
System.out.println(newString(buf,0,num)); 读read(buf))一次就把这数组打印一次,,最后只读取了一个字符,那么就得让他打印的时候就只打印一个所以就是截取字符串的一部分打印,,buf,0,num)读到几个就打印几个,,,
}
fr.close();