------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、IO流的小知识
1、Java中有几种类型的流
字节流和字符流。字节流继承于InputStream和OutputStream,字符流继承于InputStreamReader 和OutputStreamWriter。
2、字节流如何转为字符流
字节输入流转字符输入流通过InputStreamReader实现,该类的构造函数可以传入InputStream对象。
字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传入OutputStream对象。
3、如何将一个java对象序列化到文件里?
在java中能够被序列化的类必须先实现Serializable接口,该接口没有任何抽象方法只是起到一个标记作用。
二、KPI中File类的描述的理解
学习JAVA的过程中,查阅KPI是必不可少的。对于File类,KPI是这么描述的:
1、 首先看IO包:通过数据流、序列化和文件系统提供系统输入和输出。
一句话概括了IO流的作用即是对数据的输入和输出等操作。而且IO流是对系统的输入和输出操作,表明会调用操作系统的资源。
2、 File类:文件和目录路径名的抽象表示形式。 用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。
通过此解释我知道,File类就是专门操作文件或文件夹(增、删、读、改)的类,而且是与系统无关的,所以可以很好的跨平台使用。
三、File对象创建
方式一:
File f =new File("a.txt");
将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。
方式二:
File f2=newFile("c:\\abc","b.txt");
将文件所在目录路径和文件一起传入,指定文件路径。
方式三:
File d=new File("c:\\abc");
File f3=new File(d,"c.txt");
将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。
注意:
File.separator表示目录分隔符,可以跨平台使用。相当于路径中的“\”(双斜杠\\在windows中表示表示转义后的分隔符,但是在linux系统中就不是)。
四、File类的实际运用
1、 在程序所在的目录下有子目录b,目录b下有文本文件testb.txt。编写应用程序,创建文件对象:
File file=new File("b/testb.txt");
通过文件对象file得到它的文件名、相对路径、绝对路径、父目录名。
importjava.io.*;
publicclass Class1
{
public static void main( String args[ ] )
{
File file=newFile("b/testb.txt");
System.out.println("文件名:" + file.getName( ) );
System.out.println("相对路径:" + file.getPath( ) );
System.out.println("绝对路径:" + file.getAbsolutePath( ) );
System.out.println("父目录名:" + file.getParent( ) );
}
}
说明:这个题主要是为了让自己刚好的理解File类的getName()、getPath( )、getAbsolutePath( )、getParent( )方法,以及明确它们的区别。
2、 编写应用程序,程序中创建一个文件输出流对象out向当前目录下已有的文件abc.txt(内容为:"ABCDEFG")写入字符串"abcdefg"中的所有字符和大写字母'A'。
importjava.io.*;
//只需要使用输出流,FileOutputStream
publicclass Class1
{
public static void main (String[] x) throwsIOException
{
String s="abcdefg";
byte[] b;
FileOutputStream out=newFileOutputStream("./abc.txt",true);//添加字节数据
b=s.getBytes();//将字符串存入字符数组中
out.write(b,0,b.length);
out.write(65);//写入字节数据65---‘A’
out.close();
}
}
3、 编写应用程序,程序中创建一个文件输入流对象fis,读取当前目录下文本文件test1.txt,该文件内容有如下两行文本:
Java program is easy.
I like it.
思路:从文件输入流fis中读取5个字节数据存放到数组b中,字节数据存放的位置从数组下标3开始。将读取的数据在屏幕输出。
importjava.io.*;
publicclass Class1
{
public static void main( String[ ] args )throws IOException
{
File file = newFile("./test1.txt");//关联文件
FileInputStream fis = newFileInputStream( file);//创建输入流对象
int n=0;
byte b[]=new byte[8];
n=fis.read(b,3,5);
fis.close();
for(int i=3;i<b.length;i++)//字节数组中从下标3开始的数据转化为字符后输出。
System.out.print((char)b[i]+"\t");
}
}
4、 编写一个名为Class1.java的Application,其功能为:测验文件Class1.java是否存在并输出其长度。
思路:用exists( )方法测验文件是否存在,length( )获取长度
importjava.io.*;
publicclass Class1
{
public static void main (String[] args)
{
File f1=new File("./Class1.java");
System.out.println("isexist:"+f1.exists( ));
System.out.println("filelength:"+f1.length( ));
}
}
5、 使用带缓冲功能的字节流复制文件。
思路:
1/源是一个硬盘中字节文件,用FileInputStream获取
2/目的是一个硬盘中字节文件,用FileOutputStream写入
3/缓冲功能即为将硬盘中读取到的文件暂存进内存中,而不是直接写入硬盘文件中,可以定义一个
byte型数组存入读取的数据,再将数据的数据写入硬盘文件中完成复制功能
4/数组的长度即为缓冲区的大小,不可设置过长以防内存溢出,可以设置为1024
代码:
public static voidmain(String[] args)throws Exception
{
File a1=new File("aaa.bmp");
File a2=new File("bbb.bmp");
copyFile(a1,a2);
}
//将复制功能封装成copyFile方法
public static void copyFile(File a,File b)throws Exception
{
FileInputStream fi = new FileInputStream(a);//定义输入流获取文件
FileOutputStream fo = newFileOutputStream (b);//定义输出流复制为指定文件
byte [] buf = new byte [1024];//定义一个数组,将读出的内容暂存进数组,即为缓冲功能
int leng =0;
while ((leng=fi.read(buf))!=-1)
{
fo.write(buf, 0,leng);//讲数组中的内容写入进指定文件中
}
//关闭流
fi.close();
fo.close();
}
}