首先明确字符流和字节流的概念和区别;
字节:是主要的数据存储方式(文字对象数据视频等),任何东西在磁盘上存储都是以字节为单位的。
字符:通常是把相邻的两个字节按照一定形式编码得到的,它表示文字。
字符流:字符流是由Java虚拟机将字节流转化为2个字节的Unicode字符为单位的字符而成的;处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串;
字节流:在读取文件时,一个字节一个字节地读取以形成的字节序列。
在IO过程中,对于不同类型的的文件,需要不同的IO过程。
1.对于中文文字之类的字符型文档:
O过程:outputstream(最低层的,只能输出字节流)--------OutputStreamWriter(最上层的,让你填写目标字符编码类型,它把你的输入字符流转化为字节流)-----------BufferedWriter(中层的,它提供了一个缓冲区,防止你骚扰硬盘)。
I过程:inputstream(最底层的,字节流)---------InputStreamReader(中层,给一个编码参数,它把字节流转化为字符流)------------BufferedReader(上层,他方便地给你很多方法让你读取,提供缓冲区)
2.图片帧(带有图片信息头和数据体的结构),音频流(带有包含音频的信息头和数据的结构),视频流(带有包含视频信息的头和数据的结构)等文件;
I过程:fileinputstream(最低层,字节流)-------BufferedInputStream(缓冲字节流,稍微快一些但是还是字节流,一次read()只有一个字节)-------创建一个字节数组然后进行操作;
O过程:fileoutputstream(字节流,中层)-------BufferedOutputStream(缓存输出字节流-------下层)--------创建字节数组只要还有值,就用while循环写入。
下面谈谈这些乱七八糟的的对象。
1.FILE对象
构造:
File name=new File(“path”);
文件方法:
对象名.createNewFile()//创建新文件。
对象名.delete()//直接从磁盘上删除
对象名.exists()//查询磁盘中的文件是否存在
对象名.getAbsolutePath()//获取绝对路径
对象名.getPath()//获取相对路径
对象名.getName()//获取文件名 相当于调用了一个toString方法。
对象名.isFile()//判断是否是文件
对象名.length()//查看文件中的字节数
目录方法:
对象名.exists()//查询目录是否存在
对象名.isDirectory()//查询文件文件夹是否存在
对象名.isFile()//查询文件是否存在
对象名.mkdir()//创建单层目录
对象名.mkdir()//创建多层目录
对象名.delete()//删除目录
对象名.getParentFile()//获取cc目录的父级目录。
对象名.list()//返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
对象名.listFiles//返回一个字符串。命名由此抽象路径名表示的目录中的文件和目录。可以获取相对路径和绝对路径,可以对文件进行操作。
一个File对象而可以代表一个文件或目录, File可以实现获取文件和目录属性等功能, 可以实现对文件和目录的创建,删除等功能
File类操作目录与文件的常用方法有哪些
2.BufferedReader对象
- 极为科学和完备的缓冲区,支持各种类型,把水接满后才会倒(写入)。
-构造:放个字节流/字符流/读取器
- 方法:read()读一个字符;;在循环条件中每次调用应有接收量来防止内容丢失。while(( recv=br.read())!=null);这样便可。
- 方法:readline()读出一行字符。
在IO中使用。
3.BufferedWriter对象
- 极为科学和完备的缓冲区,支持各种类型,把水接满后才会倒(写入)。
- 方法:newline()方法:(具有跨平台性),众所周知不同平台换行有差别,linux(\n) ,windows(\n\r),mac(\r)。
- 方法:write(“你程序中获得的对象/字符串”);
- 方法:.flush();.close();
try{
FileWriter fw=new FileWriter("c:\\");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("你程序中获得的对象/字符串");
bw.flush();
bw.close();
}
catch (IOException e){
System.out.println(e);
}
4.OutputStreamWriter/InputStreamReader类。
OutputStreamWriter字节流:是从字符流到字节流的桥接:使用指定的字符集将写入其中的字符编码为字节。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
InputStreamReader字符流:是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集
5.FileReader/FileWriter对象 (用的少)
Filereader:
- 1.僵硬的缓冲区,read一次只读一个字符。
- 2.方法fr.read()每次被执行,都会返回文件数据,在没有数据时会返回值-1,其常用来放在while循环条件中。
- 3.fr没有flush方法哦,fw才有flush方法提供清空缓存并写入。
try
{
FileReader fr = new FileReader(filepath);
while((m_re = fr.read) != -1 )
{System.out.println(m_re);}
fr.close();
}
catch (IOException e){System.out.println(e); }
FileWriter
- FileWriter先使用fw.wirte("");将内容写入自带的芝麻大的缓冲区然后再使用fw.flush();将内容写入文件。
- FileWriter的默认缓冲区是非常小的,如果你写入一个略大于此缓冲区的数据,需要两次或者n次写入硬盘的过程,而如果用BufferedWriter只需一次。
- fr.flush()方法用以清空缓存并将缓存中的内容写入文件
- fr.close()清空缓存并将缓存中的内容写入文件然后关闭filewirter。
try{
FileWriter fw=new FileWriter("c:\\ddd.txt");
fw.write("你程序中获得的对象/字符串");
fw.flush();
fw.close();
}
catch (IOException e){System.out.println(e);
}//要注意频繁的硬盘写入和文件内容丢失