Java入门学习-理解I/O

来源:互联网 发布:英雄无敌2 for mac 编辑:程序博客网 时间:2024/06/16 20:04

首页贴上神一般的图片
这里写图片描述

文件处理

public class FileTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        createFile();    }     public static void createFile() {          // File f=new File("F:/java/HelloWorld/src/practice/create.txt");     //要使用反斜杠         File g=new File("G:/abc/efg/hij");            try{                 // f.createNewFile();  //不存在时创建新文件。保证了后面操作正常进行。    --一运行,就真的有这个文件了             //   System.out.println("该分区大小"+f.getTotalSpace()/(1024*1024*1024)+"G"); //空间大小,输出了我F盘的实际大小                //f.mkdirs();  //创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。                g.mkdirs();//生成所有目录                 // g.mkdir(); //必须efg目录存在才能生成hij目录  --使用g路径,没有任何反应,也不报错                g.delete(); //  删除此抽象路径名表示的文件或目录 --此时删掉了hij                g.mkdir();//hij添加成功               System.out.println("文件名  "+g.getName());  //  文件名                 System.out.println("文件父目录字符串 "+g.getParent());// 父路径,没有则返回 null。                 System.out.println(g.getPath());  //完整路径            }catch (Exception e) {                  e.printStackTrace();              }        }  }

字节流

public class FileCount {    public static void main(String[] args) throws IOException {        int count=0;        File file=new File("G:/abc/efg/hij/test.xlsx");        InputStream is=null; //必须放在try外面,放在try里面,就关不掉了        try {            is=new FileInputStream(file);            while(is.read()!=-1){   //读到最后                count++;            }            System.out.println("文件"+file.getName()+"长度是:"+(count/1024)+ "KB");        } catch (FileNotFoundException e) {            e.printStackTrace();        }finally{            is.close(); //FileInputStream是有缓冲区的,所以用完之后必须关闭,否则可能导致内存占满,数据丢失。         }    }}//输出:文件test.xlsx长度是:9KB

FileInputStream.read(byte b[])用来处理求文件长度太小题大做了,附上两个求文件长度方法

FileInputStream.available()file.length()

然后看到他们用FileInputStream.read(byte b[])作为缓冲流读取文件
http://wentao365.iteye.com/blog/1374731 循序渐进的写了如何读取文件
byte处代码核心

while ((i = inputStream.read(bytes))!=-1){                  String str = new String(bytes);                  System.out.print(str);             } 
//另一个借鉴byte[] buffer=new byte[512];   //一次取出的字节数大小,缓冲区大小       int numberRead=0;  while ((numberRead=input.read(buffer))!=-1) {  //numberRead的目的在于防止最后一次读取的字节小于buffer长度,             out.write(buffer, 0, numberRead);       //否则会自动被填充0          }  

2.FileOutputStream 循序渐进版, InputStream是所有字节输出流的父类,子类有ByteArrayOutputStream,FileOutputStream,ObjectOutputStreanm

3.读写对象:ObjectInputStream 和ObjectOutputStream ,该流允许读取或写入用户自定义的类,但是要实现这种功能,被读取和写入的类必须实现Serializable接口

4.有时没有必要存储整个对象的信息,而只是要存储一个对象的成员数据,成员数据的类型假设都是Java的基本数据类型,这样的需求不必使用到与Object输入、输出相关的流对象,可以使用DataInputStream、DataOutputStream来写入或读出数据。

5.PushbackInputStream类继承了FilterInputStream类是iputStream类的修饰者。提供可以将数据插入到输入流前端的能力(当然也可以做其他操作)。简而言之PushbackInputStream类的作用就是能够在读取缓冲区的时候提前知道下一个字节是什么,其实质是读取到下一个字符后回退的做法

6.SequenceInputStream:有些情况下,当我们需要从多个输入流中向程序读入数据。此时,可以使用合并流,将多个输入流合并成一个SequenceInputStream流对象。SequenceInputStream会将与之相连接的流集组合成一个输入流并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 合并流的作用是将多个源合并合一个源。其可接收枚举类所封闭的多个字节流对象。

7.PrintStream 说这个名字可能初学者不熟悉,如果说System.out.print()你肯定熟悉,System.out这个对象就是PrintStream,这个我们不做过多示例

三、字符流(顾名思义,就是操作字符文件的流)
1.java 使用Unicode存储字符串,在写入字符流时我们都可以指定写入的字符串的编码。前面介绍了不用抛异常的处理字节型数据的流ByteArrayOutputStream,与之对应的操作字符类的类就是CharArrayReader,CharArrayWriter类,这里也会用到缓冲区,不过是字符缓冲区,一般讲字符串放入到操作字符的io流一般方法是
CharArrayReaderreader=mew CharArrayReader(str.toCharArray()); 一旦会去到CharArrayReader实例就可以使用CharArrayReader访问字符串的各个元素以执行进一步读取操作。

3.相对我们前面的例子是直接用FileReader打开的文件,我们这次使用链接流,一般比较常用的都用链接流,所谓链接流就是就多次对流的封装,这样能更好的操作个管理数据,(比如我们利用DataInputStream(BufferedInputStream(FileInputStream))将字节流层层包装后,我们可以读取readByte(),readChar()这样更加具体的操作,注意,该流属于字节流对字符进行操作,)字符流用CharArrayReader就可以了。下面的示例我们将用到j2se 5中的一个可变参数进行一个小度扩展。使用BufferedWriter 和BufferedReader用文件级联的方式进行写入,即将多个文件写入到同一文件中(自带缓冲区的输出输出流BufferedReader和BufferedWriter,该流最常用的属readLine()方法了,读取一行数据,并返回String)。

4.Console类,该类提供了用于读取密码的方法,可以禁止控制台回显并返回char数组,对两个特性对保证安全有作用,平时用的不多,了解就行。

5.StreamTokenizer 类,这个类非常有用,它可以把输入流解析为标记(token), StreamTokenizer 并非派生自InputStream或者OutputStream,而是归类于io库中,因为StreamTokenizer只处理InputStream对象。

0 0
原创粉丝点击