首先从字符流开始
1.字符流的由来:因为文件编码的不同,而有了对字符进行高效操作的字符流对象。
原理:其实就是基于字节流读取字节时,去查了指定的码表。
字节流和字符流的区别:
1.字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,UTF-8码表是三个)时。先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如图片、MP3、AVI。而字符流只能处理字符数据。
结论:只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。
2.基本的读写操作方式:因为数据通常都是以文件形式存在。所以就要找到IO体系中科院用于操作文件的流对象。IO体系中的子类名后缀绝大部分是父类名称。而前缀都是体现子类功能的名字。
Reader中的常见的方法:
1.int read():读取一个字符。返回的是读到的那个字符。如果读到流的末尾,返回-1.
2.int read(char[]):将读到的字符存入指定的数组中,返回的是读到的字符个数,也就是往数组里装的元素的个数。如果读到流的末尾,返回-1.
3.close():读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。
Writer中的常见的方法:
1.write(ch):将一个字符写入到流中。
2.write(char[]):将一个字符数组写入到流中。
3.write(String):将一个字符串写入到流中。
4.flush():刷新流,将流中的数据刷新到目的地中,流还存在。
5.close():关闭资源 , 在关闭前会先调用 flush(),刷新流中的数据去目的地,然后流关闭。
FileWriter:该类没有特有的方法只有自己的构造函数。该类特点在于
1.用于处理文本文件。
2.该类中有默认的编码表。
3.该类中有临时缓冲。
当指定绝对路径时,定义目录分隔符有两种方式:
1.反斜线但是一定 要写两个。\\new FileWriter("c:\\demp.txt");
2.斜线/写一个即可。new FileWrite("c:/demo.txt");
一个读取文件的例子(先在D盘下面创建一个test.txt文件)
eclipse代码:
import java.io.*;
public class test
{
public static void main(String[] args)
{
readFileByChars("d:/test.txt");
}
public static void readFileByChars(String fileName)
{
File file = new File(fileName);
Reader reader = null;
try
{
if(file != null)
{
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
while((charread = reader.read(tempchars))!=-1)
{
if((charread == tempchars.length)
&& (tempchars[tempchars.length - 1]!= '\r'))
{
System.out.print(tempchars);
}
else
{
for(int i = 0;i < charread;i++)
{
if(tempchars[i] == '\r')
{
continue;
}
else
{
System.out.print(tempchars[i]);
}
}
}
}
}
}
catch(Exception e1)
{
e1.printStackTrace();
}
finally
{
if(reader != null)
{
try
{
reader.close();
}
catch(IOException e1)
{
System.out.println("文件不存在");
}
}
}
}
}
字符流的缓冲区:缓冲区的出现提高了对流的操作效率。原理就是将数组进行封装。
对应的对象:
BufferedWriter:特有方法;newLine():跨平台的换行符。
BufferedReader:特有方法;readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。
代码上的体现:
写入缓冲区对象。
//建立缓冲区对象必须把流对象作为参数传递个缓冲器的构造函数。
BufferedWriter bufw = new BufferedWriter(new FileWriter("buf.txt"));
bufw.write("ab");//将数据写入到缓冲区.
bufw.flush();//对缓冲区的数据进行刷新,将数据刷到目的地中。
bufw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象。
读取缓冲区对象。
BufferedReader bufr = new BufferedReader(new FileReader("buf.txt"));
String line = null;
//按照行的形式取出数据。取出的每一个行数据不包含回车符。
while(line = bufr.readline())!=null)
{
System.out.println(line);
}
bufr.close();
readLine();方法的原理:该方法用的 还是与缓冲区关联的流对象的read方法。只不过,每一次读到一个字符,先不进行具体操作,先进行临时存储。当读取到回车标记时,将临时容器中存储的数据一次性返回。
File文件类:
该类的出现是对文件系统中的文件以及文件夹进行对象的封装。
1.构造函数:File(String filename):将一个字符串路径(相对或绝对)封装成File对象,该路径可以存在或者不存在。
2.特别的字段:separator:跨平台的目录分隔符。如File file = new File("C:"+File.separator+"abc"+File.separator+"a.txt");
3.常见方法:
1.创建:
boolean createNewFile()throws IOException:创建文件,如果被创建的文件已经存在,则不创建。
boolean mkdir(): 创建文件夹。
boolean mkdirs(): 创建多级文件夹。
2,删除:
boolean delete():可用于删除文件或者文件夹。
注意:对于文件夹只能删除不带内容的空文件夹,对于带有内容的文件夹,不可以直接删除,必须要从里往外删除。
void deleteOnExit(): 删除动作交给系统完成。无论是否反生异常,系统在退出时执行删除动作。
3,判断:
boolean canExecute():
boolean canWrite():
boolean canRead();
boolean exists():判断文件或者文件夹是否存在。
boolean isFile(): 判断File 对象中封装的是否是文件。
boolean isDirectory():判断File 对象中封装的是否是文件夹。
boolean isHidden():判断文件或者文件夹是否隐藏。在获取硬盘文件或者文件夹时,对于系统目录中的文件,java 是无法访问的,所以在遍历,可以避免遍历隐
藏文件。
4,获取:
getName():获取文件或者文件夹的名称。
getPath():File 对象中封装的路径是什么,获取的就是什么。
getAbsolutePath():无论File 对象中封装的路径是什么,获取的都是绝对路径。
getParent(): 获取File 对象封装文件或者文件夹的父目录。
注意:如果封装的是相对路径,那么返回的是null.
long length():获取文件大小。
longlastModified():获取文件或者文件最后一次修改的时间。
static File[] listRoots():获取的是该系统中有效的盘符。
String[] list():获取指定目录下当前的文件以及文件夹名称。
String[] list(Filenamefilter): 可以根据指定的过滤器,过滤后的文件及文件夹名称。
File[] listFiles():获取指定目录下的文件以及文件夹对象。
5,重命名:
renameTo(File):
File f1 = new File("c:\\a.txt");
File f2 = new File("c:\\b.txt");
f1.renameTo(f2);//将c 盘下的a.txt 文件改名为b.txt 文件。