对于io这方面也学了几遍,但总是学不到手,运用不起来!请问该如何学习这方面的知识才能较好掌握?

解决方案 »

  1.   

    关键是对流这个概念的理解,推荐文章:
    1.什么是数据流 ?
    数据流是指所有的数据通信通道
    有两类流,InputStream and OutputStream,Java中每一种流的基本功能依赖于它们
    InputStream 用于read,OutputStream 用于write, 读和写都是相对与内存说的,读就是从其他地方把数据拿进内存,写就是把数据从内存推出去
    这两个都是抽象类,不能直接使用
    2.InputStream 的方法有:
    read() 从流中读入数据 有3中方式:
    int read() 一次读一个字节
    int read(byte[]) 读多个字节到数组中
    int read(byte[],int off,int len) 指定从数组的哪里开始,读多长
    skip() 跳过流中若干字节
    available() 返回流中可用字节数,但基于网络时无效,返回0
    Supported() 判断是否支持标记与复位操作
    () 在流中标记一个位置,要与Supported()连用
    reset() 返回标记过的位置
    close() 关闭流
    3.OutputStream 的方法:
    write(int) 写一个字节到流中
    write(byte[]) 将数组中的内容写到流中
    write(byte[],int off,int len) 将数组中从off指定的位置开始len长度的数据写到流中
    close() 关闭流
    flush() 将缓冲区中的数据强制输出
    4.File 类
    File 可以表示文件也可以表示目录,File 类控制所有硬盘操作
    构造器:
    File(File parent,String child) 用父类和文件名构造
    File(String pathname) 用绝对路径构造
    File(String parent,String child) 用父目录和文件名构造
    File(URI uri) 用远程文件构造
    常用方法:
    boolean createNewFile();
    boolean exists();
    例子:
    //建立 test.txt 文件对象,判断是否存在,不存在就创建
    import java.io.*;
    public class CreateNewFile{
    public static void main(String args[]){
    File f=new File("test.txt");
    try{
    if(!f.exists())
    f.createNewFile();
    else
    System.out.println("exists");
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    boolean mkdir()/mkdirs()
    boolean renameTo(File destination)
    例子://看一下这 mkdir()/mkdirs() 的区别和 renameTo 的用法
    import java.io.*;
    public class CreateDir{
    public static void main(String args[]){
    File f=new File("test.txt");
    File f1=new File("Dir");
    File f2=new File("Top/Bottom");
    File f3=new File("newTest.txt");
    try{
    f.renameTo(f3);
    f1.mkdir();
    f2.mkdirs();
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    String getPath()/getAbsolutePath()
    String getParent()/getName()
    例子://硬盘上并没有parent 目录和 test.txt 文件,但我们仍然可以操作,因为我们创建了他们的对象,是对对象进行操作
    import java.io.*;
    public class Test{
    public static void main(String args[]){
    File f=new File("parent/test.txt");
    File f1=new File("newTest.txt");
    try{
    System.out.println(f.getParent());
    System.out.println(f.getName());
    System.out.println(f1.getPath());
    System.out.println(f1.getAbsolutePath());
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    String list[] //显示目录下所有文件
    long lastModified() //返回 1970.1.1 到最后修改时间的秒数
    boolean isDirectory()
    例子://列出目录下的所有文件和目录,最后修改时间,是目录的后面标出 
    ,是文件的后面标出文件长度
    import java.io.*;
    import java.util.*;
    public class Dir{
    public static void main(String args[]){
    File f=new File("Dir");
    String[] listAll=null;
    File temp=null;
    try{
    listAll=f.list();
    for(int i=0;itemp=new File(listAll);
    System.out.print(listAll+"\t");
    if(temp.isDirectory())
    System.out.print("\t 
    \t");
    else
    System.out.print(temp.length()+"\t");
    System.out.println(new Date(temp.lastModified()));
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
     
    5.文件流的建立
    File f=new File("temp.txt");
    FileInputStream in=new FileInputStream(f);
    FileOutputStream out=new FileOutputStream(f);
    例子:文件拷贝
    import java.io.*;
    public class Copy{
    public static void main(String args[]){
    FileInputStream fis=null;
    FileOutputStream fos=null;
    try{
    fis=new FileInputStream("c2.gif");
    fos=new FileOutputStream("c2_copy.gif");
    int c;
    while((c=fis.read()) != -1)
    fos.write(c);
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    if(fis != null) try{ fis.close(); }catch(Exception e){ e.printStackTrace(); }
    if(fos!= null) try{ fos.close(); }catch(Exception e){ e.printStackTrace(); }
    }
    }
    }6.缓冲区流
    BufferedInputStream
    BufferedOutputStream
    他们是在普通文件流上加了缓冲的功能,所以构造他们时要先构造普通流
    例子:文件拷贝的缓冲改进
    import java.io.*;
    public class Copy{
    public static void main(String args[]){
    BufferedInputStream bis=null;
    BufferedOutputStream bos=null;
    byte buf[]=new byte[100];
    try{
    bis=new BufferedInputStream(new FileInputStream("persia.mp3"));
    bos=new BufferedOutputStream(new FileOutputStream("persia_copy.mp3"));
    int len=0;
    while( true ){
    len=bis.read(buf);
    if(len<=0) break;
    bos.write(buf,0,len);
    }
    bos.flush();//缓冲区只有满时才会将数据输出到输出流,用flush()将未满的缓冲区中数据强制输出
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    if(bis != null) try{ bis.close(); }catch(Exception e){ e.printStackTrace(); }
    if(bos!= null) try{ bos.close(); }catch(Exception e){ e.printStackTrace(); }
    }
    }
    }7.原始型数据流
    DataInputStream
    DataOutputStream
    他们是在普通流上加了读写原始型数据的功能,所以构造他们时要先构造普通流
    方法:
    readBoolean()/writeBoolean()
    readByte()/writeByte()
    readChar()/writeByte()
    ......
    例子://这个流比较简单,要注意的就是读时的顺序要和写时的一样
    import java.io.*;
    public class DataOut{
    public static void main(String args[]){
    DataOutputStream dos=null;
    try{
    dos=new DataOutputStream(new FileOutputStream("dataout.txt"));
    dos.writeInt(1);
    dos.writeBoolean(true);
    dos.writeLong(100L);
    dos.writeChar('a');
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    if(dos!=null)
    try{
    dos.close();
    }catch(Exception e){
    }
    }
    }
    }
    import java.io.*;
    public class DataIn{
    public static void main(String args[]){
    DataInputStream dis=null;
    try{
    dis=new DataInputStream(new FileInputStream("dataout.txt"));
    System.out.println(dis.readInt());
    System.out.println(dis.readBoolean());
    System.out.println(dis.readLong());
    System.out.println(dis.readChar());
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    if(dis!=null)
    try{
    dis.close();
    }catch(Exception e){
    }
    }
    }
    }
      

  2.   

    楼上的楼上你写了这么多,但只写了字节流的处理,还有字符流(Reader和Writer)的处理没有写啊!再搬点过来.
      

  3.   

    谢谢一楼的“suyuanjie(师太,你就饶了老衲吧!) ”很详细的资料,也谢谢大家!不过我还是感觉有点迷糊,还得多多练习,才能掌握!
    如果把计算机组成原理弄懂的话,输入输出流是不是就很容易明白了?
    在实际工作中,输入输出流一般怎么应用呢?