您的位置:首页 > 编程语言 > Java开发

(JAVA自学笔记)I/O流操作

2013-01-08 15:43 337 查看
首先从字符流开始

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 文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: