Java文件操作

1.以文件流的方式复制文件

将一个已存在文件复制到指定位置,如本例中将源文件"/home/hadoop/Scene1"拷贝一份重命名为“/home/hadoop/Scene1bak”

代码如下:

View Code
package erp.sjtu.xw;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class CopyFile {

    public static void main(String args[]) throws IOException

    {

        CopyFile cf=new CopyFile();

        String src="/home/hadoop/Scene1";

        String dest="/home/hadoop/Scene1bak";

        cf.copyFile(src, dest);

    }

    

    /**以文件流的方式复制文件

     * @param src 文件源目录

     * @param dest 文件目的目录

     * @throws IOException 

     * 该方法经过测试,支持中文处理,并且可以复制多种类型,比如txt,xml,jpg,doc等多种格式

     */

    

    public void copyFile(String src,String dest) throws IOException

    {

        FileInputStream in=new FileInputStream(src);//定义输入流

        File file=new File(dest);//定义文件,指定位置"dest"可能已经存在了该文件,如果不存在需要创建。

        if(!file.exists())//如果文件不存在,则调用创建文件的方法

            file.createNewFile();

        FileOutputStream out=new FileOutputStream(file);//定义输出流

        int c;

        byte buffer[]=new byte[1024];//定义缓冲大小。

        /**

         * 将输入文件中的文本内容读入缓冲buffer中去。

         * 如果文本大小小于buffer的容量,那么读一次就可以。

         * 如果大于buffer大小,则需要多次读取。 

         */

        while((c=in.read(buffer))!=-1)//从输入流中读取文本内容读入buffer,知道读完为止

        {                                                        

            System.out.println(c);//输出buffer中读取的文本长度

            for(int i=0;i<c;i++)

                out.write(buffer[i]);//将buffer中的内容吸入输出流。

        }

        in.close();

        out.close();

    }

}

输出结果为:

1024

89

而Scene1文件大小也刚好为(1113=1024+89)字节

2.获得控制台用户输入的信息

这个程序用户获得控制台输入的信息,代码如下:

View Code
package erp.sjtu.xw;

import java.io.IOException;

public class GetConsoleInputMessage {

    public static void main(String args[]) throws IOException

    {

        GetConsoleInputMessage instance=new GetConsoleInputMessage();

        String str=instance.getInputMessage();

        System.out.println(str);

        System.exit(0);    

    }

    /**获得控制台用户输入的信息

     * @return

     * @throws IOException

     * 可以返回用户输入的信息,不足之处在于不支持中文输入,有待进一步改进。

     */

    public  String getInputMessage() throws IOException{

        String str=null;

        System.out.println("请输入命令:");

        byte buffer[]=new byte[1024];//创建缓冲

        int count=System.in.read(buffer);//将console中的输入写入到缓冲buffer中,并返回缓冲字符串长度。

        System.out.println(count);

        //char ch[]=new char[count-2];//buffer中最后两位是结束符,没有意思,因此删除。

        char ch[]=new char[count-1];//定义一个字符数组,长度为count-1,因为buffer中最后一位是结束符,没有意思,因此删除。

        for(int i=0;i<count-1;i++)

        {

            ch[i]=(char)buffer[i];

//            str=new String(ch);

//            System.out.println(str);

        }

        str=new String(ch);//将字符数组转变成字符串。

        return str;

    }

}

输出结果:

请输入命令:

please input you commond

25

please input you commond

 注意:这里输入输出的buffer长度是25,但是实际上字符串中有用的只有24个字符,这是因为buffer中最后一位是结束符。

3.利用PrintStream写文件

使用PrintStream能够往空文件中写入文本,代码如下:

View Code
package erp.sjtu.xw;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintStream;

public class PrintStreamDemo {

    public static void main(String args[]) throws IOException

    {

        PrintStreamDemo psd=new PrintStreamDemo();

        psd.printStreamDemo();//test printStreamDemo()

        psd.printStreamDemo2();////test printStreamDemo2()

    }

    

    public void printStreamDemo() throws IOException

    {

        try{

            String src="/home/hadoop/printStreamDemo";//源文件路径

            File file=new File(src);//定义文件,如果不存在路径所指定的文件则创建

            if(!file.exists())

                file.createNewFile();

            FileOutputStream out=new FileOutputStream(file);//定义文件输出流

            PrintStream ps=new PrintStream(out);//往文件输出流中打印内容

            for(int i=0;i<10;i++)

                ps.println("This is "+i+" line.");

            

        } catch (FileNotFoundException e){

            e.printStackTrace();

        }

    }

    /**

     * 利用PrintStream写文件

     */

    public void printStreamDemo2() throws IOException

    {

        try{

            /**

             * 注:FileOutputStream out=new FileOutputStream("/home/hadoop/printStreamDemo2");

             * 如果本地目录有文件printStreamDemo3,则文本写入该文件中。

             * 如果本地目录中没有printStreamDemo3这个文件,会自动创建该文件,并向其中写入文本。

             * 这是前面如下代码的操作集合

             * String src="/home/hadoop/printStreamDemo";//源文件路径

             * File file=new File(src);//定义文件,如果不存在路径所指定的文件则创建

             * if(!file.exists())

             *         file.createNewFile();

             * FileOutputStream out=new FileOutputStream(file);//定义文件输出流

             */

            FileOutputStream out=new FileOutputStream("/home/hadoop/printStreamDemo2");

            PrintStream ps=new PrintStream(out);

            for(int i=0;i<10;i++)

                ps.println("This is "+i+" line.");

        } catch (FileNotFoundException e){

            e.printStackTrace();

        }

    }

}

运行上述代码,将自动生成printStreamDemo和printStreamDemo2这两个文件,这了这两个文件的文本内容都是:

This is 0 line.

This is 1 line.

This is 2 line.

This is 3 line.

This is 4 line.

This is 5 line.

This is 6 line.

This is 7 line.

This is 8 line.

This is 9 line.

4. 利用StringBuffer写文件

代码如下:

View Code
package erp.sjtu.xw;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

public class StringBufferDemo {

    public static void main(String args[]) throws IOException

    {

        StringBufferDemo sbd=new StringBufferDemo();//创建对象实例

        sbd.stringBufferDemo();//调用方法,方法和类同名,有点别扭

    

    }

    /**

     * 利用StringBuffer写文件

     * 该方法可以设定使用何种编码,有效解决中文问题。

     * @throws IOException

     */

    

    public void stringBufferDemo() throws IOException

    {

        String src="/home/hadoop/StringBufferDemo";

        File file=new File(src);

        if(file.exists())

            file.createNewFile();

        FileOutputStream out=new FileOutputStream(file,true);

        for(int i=0;i<10;i++)

        {

            StringBuffer sb=new StringBuffer();

            sb.append("这是第"+i+"行。/n");//如果不加"/n"则不能实现换行。

            out.write(sb.toString().getBytes("utf-8"));

        }

        out.close();

    }

}

运行上述代码将自动生成文件StringBufferDemo,其文本内容为:

这是第0行。

这是第1行。

这是第2行。

这是第3行。

这是第4行。

这是第5行。

这是第6行。

这是第7行。

这是第8行。

这是第9行。

PS:java 流(Stream)的概念(2011-10-13)

流是 Java 中最重要的基本概念之一。文件读写、网络收发、进程通信,几乎所有需要输入输出的地方,都要用到流。流是做什么用的呢?就是做输入输出用的。为什么输入输出要用“流”这种方式呢?因为程序输入输出的基本单位是字节,输入就是获取一串字节,输出就是发送一串字节。但是很多情况下,程序不可能接收所有的字节之后再进行处理,而是接收一点处理一点。比方你下载魔兽世界,不可能全部下载到内存里再保存到硬盘上,而是下载一点就保存一点。这时,流这种方式就非常适合。在 Java 中,每个流都是一个对象。流分为两种:输入流(InputStream)和输出流(OutputStream)。对于输入流,你只要从流当中不停地把字节取出来就是了;而对于输出流,你只要把准备好的字节串传给它就行。
                               ________Java 程序                          
                               |                                                             |
           外部系统 --|--(输入流)--> 处理逻辑 --(输出流)---|--> 外部系统
                               |__________________________|
 总体而言,我们要站在内存的角度想象java的输入流与输出流。输入流就是“我们是内存,外部系统有内容要输入到内存中,所以叫输入流”。输出流就是“我们是内存,我们要将数据从内存输出,写入到外部系统,所以叫输出流。”

 

你可能感兴趣的:(java)