java IO流详解(一)

从本篇博文开始,详细讲解JAVA IO流的基本操作,力求每一个例子都给大家一个DEMO,在最终完成的时候,我会贴出最终的源码,方便大家交流学习。

上一篇博文中转载了大神的博文和图片,非常好!

文章链接如下:Java IO流

下面一个个的用实例进行讲解每个IO流的基本用法。

1 File文件

public static void main(String[] args) throws IOException {
        File file = new File(".");
        myPrint(file.getAbsoluteFile().getAbsolutePath());
        myPrint(file.getCanonicalPath());
        myPrint(file.getName());
        myPrint(file.getParent());
        myPrint(file.getPath());
        myPrint(file.getCanonicalFile().getPath());
        myPrint(file.getTotalSpace()+"");
        myPrint(file.getFreeSpace()+"");
        myPrint(file.getUsableSpace()+"");
        myPrint(File.pathSeparator);
        myPrint(file.canRead()+"");
        myPrint(file.canWrite()+"");
        myPrint(file.exists()+"");
        myPrint(file.isAbsolute()+"");
        myPrint(file.isDirectory()+"");
        myPrint(file.isFile()+"");
        myPrint(file.isHidden()+"");
        myPrint(file.lastModified()+"");
        myPrint(file.length()+"");
        String[] strings = file.list();
        for (String string : strings) {
            myPrint(string);
        }
        String[] strings2 = file.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.startsWith(".");
            }
        });
        for (String string : strings2) {
            myPrint(string);
        }
        myPrint(File.pathSeparatorChar+"");
        myPrint(File.separatorChar+"");
    }

    private static void myPrint(String str){
        System.out.println("结果:"+str);
    }

File类大家应该经常见到,也经常使用,所以请大家务必熟练。在这里只是列出了部分File的方法,不过都比较简单。大家用到的时候可以参考API即可。

2 FileWriter

public static void main(String[] args) {
        String filestr = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demo.txt";
        FileWriter fileWriter = null;
        try{
            fileWriter = new FileWriter(filestr);
            fileWriter.write("long Yin is a good good boy! Handsome!^_^");
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

结果:

3 FileRead

public class FileReaderTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demo.txt";
        Method1(path);
        Method2(path);
    }

    //读取单个字符  一个一个字符的读取
    private static void Method2(String path) {
        FileReader fileReader;
        try {
            fileReader = new FileReader(path);
            int temp1 = fileReader.read();
            PrintMeth((char)temp1+"");
            int temp2 = fileReader.read();
            PrintMeth((char)temp2+"");
            int temp3 = fileReader.read();
            PrintMeth((char)temp3+"");
        } catch (Exception e) {

        }finally{
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //利用缓冲进行读取   最常见的方式
    private static void Method1(String path) {
        FileReader fileReader;
        try {
            fileReader = new FileReader(path);
            int i = 0;
            char[] buf = new char[5];
            while ((i= fileReader.read(buf))>0) {
                PrintMeth(new String(buf));
            }
        } catch (Exception e) {

        }
    }finally{
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    private static void PrintMeth(String str){
        System.out.println(str);
    }
}

方法一结果:

方法二结果:

学习了FileReader 和FileWriter之后,我们可以实现文本文件的复制功能。大家可以考虑使用多种方法实现。

4 利用字符缓冲流进行文件的复制

public class BufferedReaderBufferedWriterTest {

    /**
     * 利用缓冲字符流实现文本文件的复制功能
     * 从demo.txt文件的内容复制到test.txt文件中
     * @param args
     */
    public static void main( String[] args){
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        String path1 = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demo.txt";
        String path2 = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\test.txt";
        try {
            fileReader = new FileReader(path1);
            fileWriter = new FileWriter(path2);
            bufferedReader = new BufferedReader(fileReader);
            bufferedWriter = new BufferedWriter(fileWriter);
            String temp;
            while ((temp = bufferedReader.readLine()) != null) {
            //下面两个写入的方法都是可以的
//              bufferedWriter.write(temp);
                bufferedWriter.append(temp);
                bufferedWriter.flush();//务必记得调用flush方法写入磁盘
            }
        } catch (Exception e) {

        }finally{
            //此处不再需要捕捉FileReader和FileWriter对象的异常
            //关闭缓冲区就是关闭缓冲区中的流对象
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

结果如图:

5 FileOutputStream字节流写入

public class FileOutputStreamTest {
    /**字节流写入操作
     * @param args
     */
    public static void main(String[] args) {
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demo.txt";
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(path);

//          fileOutputStream.write(int b)
//          fileOutputStream.write(byte[] b)
//          fileOutputStream.write(byte[] b, off, len)
            //上面三个方法是利用fileOutputStream进行写入的三个重载的方法

            //测试第一个方法
//          fileOutputStream.write(65);//结果是下面结果图中的第一幅图

            //测试第二个方法
//          fileOutputStream.write(("我的世界里没有一丝剩下的只是回忆," +
//                  "\r\n你存在我深深的脑海里!我的梦里,我的心里!").getBytes());//结果是下面结果图中的第二幅图

            //测试第三个方法
            byte[] by = ("我的世界里没有一丝剩下的只是回忆," +
                    "\r\n你存在我深深的脑海里!我的梦里,我的心里!").getBytes();
            fileOutputStream.write(by, 0, by.length);//结果和上一个方法相同

        } catch (Exception e) {

        }finally{
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (Exception e2) {

                }
            }
        }
    }
}

结果如图:

6 FileInputStream字节流的读取操作

public class FileInputStreamTest {
    /**FileInputStream字节流的读取操作
     * @param args
     */
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demo.txt";

        try {
            fileInputStream = new FileInputStream(path);
            PrintStr(String.valueOf(fileInputStream.read()));//一次读取一个字节,读到末尾返回-1表示结束
            //结果输出为:239  表示读取第一个字符的第一个字节  字节转化为整数表示
            byte[] b = new byte[5];
            while (fileInputStream.read(b)>0) {
                fileInputStream.read(b);//读取数据存储在b字节数组中
                PrintStr(new String(b));
            }

        } catch (Exception e) {

        }finally{
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                }
            }
        }
    }

    private static void PrintStr(String str){
        System.out.print(str);
    }
}

结果图:

demo.txt文件的内容如图:

代码运行结果:

你可能奇怪怎么出现了乱码的情况。原因在于demo.txt里面存储的是字符,而读取使用的是FileInputStream字节流,一个字节一个字节的读取再转化为字符串输出,必然引起乱码的情况。你会说不是有汉字输出吗?那只能说是碰巧的情况下,相邻的两个字节读取到了,拼在一起显示了出来。

所以推荐做法是:如果是文本文件,读取和写入操作使用字符流

其他文件,读取和写入操作使用字节流。

6 二进制文件的复制

/**
 * 二进制文件的复制
 * @author Administrator
 * 2015年3月15日 14:21:20
 */
public class BinaryFileToCopy {
    public static void main(String[] args) {
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\G.E.M.邓紫棋-泡沫.mp3";
        String pathCopy = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\邓紫棋-泡沫.mp3";
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(path);
            fileOutputStream = new FileOutputStream(pathCopy);
            byte[] by = new byte[1024];

            while (fileInputStream.read(by)>0) {
                fileOutputStream.write(by);
            }
        } catch (Exception e) {

        }finally{
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                }
            }
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                }
            }
        }
    }
}

结果如图

运行程序之后

7 利用字节流缓冲流进行二进制文件的复制

public class BufferedInputStreamOutputStreamToCopy {

    /**
     * 利用字节流缓冲流进行二进制文件的复制
     * @param args
     */
    public static void main(String[] args) {
        String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\G.E.M.邓紫棋-泡沫.mp3";
        String pathCopy = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\邓紫棋-泡沫.mp3";
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            fileInputStream = new FileInputStream(path);
            fileOutputStream = new FileOutputStream(pathCopy);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            byte[] by = new byte[1024];
            while (bufferedInputStream.read(by)>0) {
                bufferedOutputStream.write(by);
                bufferedOutputStream.flush();
            }
        } catch (Exception e) {

        }finally{
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (Exception e2) {

                }
            }
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (Exception e2) {

                }
            }
        }
    }
}

结果和上面直接使用字节流进行二进制文件的复制一样

利用缓冲可以提高效果,不再频繁的读取磁盘写入磁盘,而是一次性读取1K大小的数据,缓存起来在写入磁盘。

如果有什么问题或者错误,请大家留言!谢谢~~~

源码下载请稍候给出

时间: 2024-12-12 16:01:00

java IO流详解(一)的相关文章

《java基础知识》Java IO流详解

Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和字符流. 5. 将计算机语言:二进制数据转换成文件显示到电脑上. IO包:继承关系图: 字符流: Reader :读取字符流,方法见API. Writer :写入字符流,方法见API. 案例(Writer ): import java.io.*; public class var { public

Java IO流详解(二)——File类

在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建.查找和删除等操作.即Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件或者目录只要创建File这个类即可. 不过要注意的是File类只是对文件的操作类,只能对文件本身进行操作,不能对文件内容进行操作. 1.File

Java IO流详解(五)——缓冲流

缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低,效能差时.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时加上缓冲流提升性能. Java IO流中对应的缓冲流有以下四个: 字节缓冲流:BufferedInputStream.BufferedOutputStream 字

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

Java IO流详解(五)

使用的是InputStreamReader和OutputStreamWriter,它们本身属于的是reader和writer字符流,我们之所以会用到这些转化流是因为系统有时候只给我们提供了字节流,为了方便操作,要用到字符流.比如说System.in标准输入流就是字节流.你想从那里得到用户在键盘上的输入,只能是以转换流将它转换为Reader以方便自己的程序读取输入.再比如说Socket里的getInputStream()很明显只给你提供字节流,你要想读取字符,就得给他套个InputStreamRe

Java IO流详解(四)

Serializable序列化 1 对象的序列化 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "Name:" + this.name + ", Age:&

Java IO流详解(三)

Scanner类 1 从键盘读取 public class ScannerTest { public static void main(String[] args ) { Scanner input = new Scanner(System.in); System.out.println("请输出一个整数:"); int i = input.nextInt(); System.out.println("你输入的整数是:" + i); } } 结果: 2 从字符串读取

Java IO流详解(二)

1 文件对象 public class CreateFile { public static void main(String[] args) { //创建要操作的文件路径和名称 //其中,File.separator表示系统相关的分隔符,Linux下为:/ Windows下为:\\ //path在此程序里面代表父目录,不包含子文件 String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\parent"; //ch

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打