------- android培训、java培训、期待与您交流! ----------
首先在java中对数据的操作是通过流来操作的,根据操作的数据类型分为字节流,字符流。根据流向分为输入流和输出流。
字节流的两个基类:
inputStream outputStream
inputStream它的所有子类包括以下这些
outputStream它所包含的子类包括以下这些
字符流的两个基类:
Reader Writer
Reader所包含的子类
Writer所包含的子类
下面是关于我在学习IO中过程中的一些总结:
1,FileWriter类是Writer的子类,是专门用于写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
在构造函数中:可以传入一个文件名或者一个文件对象作为参数,以便在初始化对象时就跟一个已存在或者未存在的文件相关联,为了是写入的时候,有目的地。
值得注意的是:如果这个文件已经存在,那么在运行程序的时候,这个文件会被覆盖,如果没有这个文件,那么会创建一个新的文件以便写入,如果不想丢失原数据,那么选用
FileWriter(String fileName, boolean append)或
FileWriter(File file, boolean append)构造函数来进行初始化!它会在原数据的末尾续写数据。然后重新覆盖原来的文件。
对于write()方法只是将数据写入IO流的缓冲区,这时数据在内存中并没有进入目的地也就是文件,需要通过刷新缓冲区的方法包括flush()和close()方法来进行,
flush()只刷新,不会关闭该流资源,close()先刷新,后关闭该流资源
2,FileReader类是Reader的子类,它是用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
(这里的默认字符编码是本地机器系统自带的字符编码)
在构造函数中:可以传入一个文件名或者一个文件对象作为参数,以便在初始化对象时就跟一个已存的文件相关联,为的是有地方可以读,也就是有数据的源。
在这里注意的是:在初始化时必须要有一个已经存在的文件,否则会抛出异常
read()方法每次读取一个字符,返回的是int类型如果转变成char类型需要强转,当读取到末尾时返回-1。read(char[])方法每次读取一个字符并存如字符数组里,返回的是读取的个数
当读取到末尾时返回-1;
通过FileReader和FileWriter就可以实现文本之间的复制了,下面是个例子
//初始化FileWriter并制定一个文件从末尾处续写
FileWriter fw=null;
FileReader fr=null;
try{
fr=new FileReader("demo.txt");
fw=new FileWriter("demo1.txt");
char[] arr=new char[1024];
int sum=0;
while((sum=fr.read(arr))!=-1){
String str=new String(arr,0,sum);
fw.write(str);
fw.flush();
}
}
catch(IOException e){
System.out.println(e.toString());
}
finally{
if(fw!=null){
try{
fw.close();
}
catch(IOException e){
System.out.println(e.toString());
}
if(fr!=null){
try{
fr.close();
}
catch(IOException e){
System.out.println(e.toString());
}
}
}
3,fileInputStream 是inputStream的子类,用于读取诸如图像数据之类的原始字节流。
它的构造函数同样也可以传入一个文件类对象或者一个路径,也需要在初始化时就存在的。
它同样具有read()方法,返回的是int数据类型,在读到结尾时返回-1.那么为什么它要返回int类型,而不是byte类型呢?下面介绍下原理:
因为数据在计算机中的存在是已二进制形式存在的,我们知道byte占8个二进制位而int占32个二进制位,如果一段数据是
0000-0000 0000-0000 0000-0000 1111-1111而在读取是byte形式读那么当读到1111-1111它所代表的是-1并不是255,如果返回的是byte类型那么就会返回-1,如果后面还有数据那么不会继续往下读取,因为当读取到-1时程序判断已经结尾了。所以为了避免这种情况的发生,在读取后将byte将它前面的24的二进制位用0不齐,那么这个值所表示的十进制数就是255不会跟判断流结尾时-1产生冲突。
4,fileoutputStream是outputstream的子类。用于写入诸如图像数据之类的原始字节的流。
同样,它也可以进行续写,FileOutputStream(String name, boolean append)
这个构造函数就说明,你可以传入一个指定的文件,并为true时可以再这个文件的末尾进行续写
5,装饰类。
为了扩充已有类的功能那么我们要将这个类进行包装从而达到扩充功能的目的。
BufferedReader,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
这个类是为了扩充fileReader类而产生的,提供了readLine()方法一次读一行
BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
这个类是为了扩充filewriter类而产生的,它提供了一个newLine()方法,功能是换行,因为在window中换行是\r\n
而在linux中是\n那么为了避免出现错误,java提供了这个更便捷的方法。而在BufferedWriter的构造函数中还可以指定一个具体大小的缓冲区BufferedWriter(Writer out, int sz)
lineNumberReader类是为了扩充BufferedReader类而产生的,它可以带行号打印每一行数据。通过getLineNumber()方法或取。因为它集成了BufferedReader类因此具有BufferedReader的readLine()等功能。
6,将异常的信息储存到本地文件。方便查阅
那么它建立的文件内容是:
7,File类,它可以将一个文件或者路径封装成对象。通过将文件或者文件夹封装成对象,那么我们就可以操作这个文件。它具体有对文件或者文件夹的判断。创建。删除。获取等操作。
这里主要说名下递归。递归是方法本身调用自身。下面有个例子。
在这里需要注意的是,文件夹里的目录不能特别的大,因为每次判断是一个目录时都会启动一个本身方法,当方法太多了回出现内存溢出异常。在这里也可以讲打印到控制台的内容写到一本文件里保存起来,方便查阅。
8.Properties类。Properties
类表示了一个持久的属性集。它继承于Hashtable。里面存储的都是键值对。是一个IO与集合相结合的容器。可以用于键值对的形式配置文件。
它不是IO包里面的类,而是uil包里面的类。
它常用的方法有:Object setProperty(String key,String value)因为它调用的就是hashTable的put方法 ,属性列表中指定键的旧值,如果没有值,则为
null
String getProperty(String key)通过键获取值。
load(InputStream inStream)这个方法里面传入的是字节读取流,这个读取流可以关联一个配置文件,properties的这个方法可以直接从读取流中提取,键和值的信息。
load(Reader reader)此方法传入的是字符流。功能与字节流当做参数传入的一样。
Set<String> stringPropertyNames()此方法返回的是一个set集合里面的内容为properties的健元素。
store(OutputStream out,String comments) 次方法是将改变后的键值对信息,写入配置文件。因此它要求传入一个输出流。
具体应用下面这个例子:
9,inputStreamReader.这是字节流通向字符流的一个桥梁。它使用指定的 charset
读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。后面这句话才是最主要的,表明它可以按照给定的字符集解码字节转换成字符。为了提高效率可以加入缓冲技术,BufferedReader.
outputStreamWriter.这是字符流通向字节流的一个桥梁。可使用指定的 charset
将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 同理,它也以用给定的字符集将字符编码成字节。为了提高效率可以加入缓冲技术,BufferedWriter.
OutputStreamWriter(OutputStream out)
次构造函数,是按照默认的字符集来编码字符。OutputStreamWriter(OutputStream out, Charset cs)
此构造函数要求在传入字节数出流的同时给定字符集。那么在使用时我们可以考虑用其谁!