首页 > 代码库 > java---2
java---2
今天打算过一遍java的io,主要是关注文件方面,当然还有什么zip之类的。
io顾名思义就是输入和输出,根据操作的类型分为输入流和输出流,感觉流是一种通道,它给各种数据呀,文件呀提供通道。本身还是可以理解的。在java中,所有的io的操作基本放在java.io中,所有的输入流都是抽象类InputStream和Reader的子类,前者是字节输入流,后者则是字符输入流。与此对应的还有OutputStream和Writer抽象类。字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。字节流可以处理所有类型数据,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
File类是唯一代表磁盘文件本身的对象。通过调用File类中的方法,实现创建(createNewFile()),删除(delete()),重命名文件等操作。同时此类提供了许多方法用来获取一些文件本身的信息,如判断文件是否存在(exits()),获取文件长度(length()),最后修改时间(lastModified())。
当需要将数据永久保存时,就需要使用文件输入输出流与指定文件建立连接。FileInputStream和FileOutputStream都用来操作磁盘文件,前面说了这两个类都是对字节的操作,都只提供了对字节和字节数组的读取方法,由于汉字在文件中是占两个字节的,那么如果用这两个类读取汉字文本时,极大可能性会出现乱码现象。所以对于这种现象,我们应当采用FileReader和FileWriter类。FileReader流顺序地读取文件,只要不关闭流,每次调用read就顺序地读取源中其余的内容,直到被close。
虽然在程序结束时自动关闭所有打开的流,但是在使用完流后,主动close仍然是一个好习惯,一个被打开的流可能会占尽系统资源,如果没有将打开的流关闭,当另一个程序试图打开另一个流时,可能会得不到需要的资源。
public class FileTest{ public static void main(String[] args){ File file=new File("word.txt"); try{ FileOutputStream a=new FileOutputStream(file); byte buy[]="你好java".getBytes(); a.write(buy); a.close(); }catch(Excetion e){ e.printStackTrace(); } try{ FileInputStream b=new FileInputStream(file); byte by[]=new byte[1024]; int h=b.read(by); System.out.println(new String(by,0,h)); b.close(); }catch(Excetion e){ e.printStackTrace(); } } }
File f=new File("d:\\hah.txt"); if(!f.exists()){ try { f.createNewFile(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }else{ System.out.println("哈皮"); }
我在这里写这个的原因是因为我当初非常愚蠢的一段经历,我写了这两个测试程序,然后在思考一个问题。。为什么第一个程序没用createNewFile就创建了真实文件,难道File f=new File(...)就会创建真实文件么。。可是我清楚的记得,File只是创建一个映射对象,并不是创建一个真实的文件,如果有这个功能,那还要createNewFile()干什么。。。原来是因为我第一个程序还用了FileOutputStream..在使用文件输出类时,如果文件不存在,就会自动创建文件,使用文件输入类时,如果文件不存在,就会抛出异常IOException。很蠢。。但是当时想了好长时间。。。
java---2