File文件的写入

  一、FileWriter 和BufferedWriter 结合写入文件

  FileWriter是字符流写入字符到文件。默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定一个true值作为FileWriter构造函数的第二个参数,它会保留现有的内容,并追加新内容在文件的末尾。

  BufferedWriter:缓冲字符,是一个字符流类来处理字符数据。不同于字节流(数据转换成字节FileOutPutStream),可以直接写字符串、数组或字符数据保存到文件。

默认情况,替换原有内容:   new FileWriter(file);

保留原来的文件内容:      new FileWriter(file,true)

  具体例子如下:

public static void writeInFileByfb() {
        File f=new File("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fb.txt");
        String content="要写入文件的新内容";
        FileWriter fw=null;
        BufferedWriter bw=null;
        try{
            if(!f.exists()){
                f.createNewFile();
            }
             fw=new FileWriter(f.getAbsoluteFile(),true);  //true表示可以追加新内容  
                         //fw=new FileWriter(f.getAbsoluteFile()); //表示不追加
             bw=new BufferedWriter(fw);
             bw.write(content);
             bw.close();
        }catch(Exception e){
           e.printStackTrace();
        }
        
    }

 

  二、FileOutPutStream 字节流写入文件

  文件输出流是一种用于处理原始二进制数据的字节流泪。 为了将数据写入到文件中,必须将数据转换为字节,并保存到文件。具体例子如下:

package com.joyplus.test;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutPutTest {
    public static void main(String[] args) {
        FileOutPutTest.writeInFileByfi();
    }
    
    
    public static void writeInFileByfi(){
        File f=new File("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fi.txt");
        FileOutputStream fos=null;
        try {
            if(!f.exists()){
                f.createNewFile();
            }
             fos=new FileOutputStream(f);
            String content="要写入的新内容!";
            fos.write(content.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
}

  三、RandomAccessFile 写入文件

   RandomAccessFile的唯一父类是Object,与其他流父类不同。是用来访问那些保存数据记录的文件的,这样你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的.

   如下例子是RandomAccessFile如何进行写入文件的例子:

public static void writeInFileByRdA(){
        String content="randowAccessFile";
        try{
              // 打开一个随机访问文件流,按读写方式
            RandomAccessFile randomFile = new RandomAccessFile("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fb.txt", "rw");
            // 文件长度,字节数
            long fileLength = randomFile.length();
            //将写文件指针移到文件尾。
            randomFile.seek(fileLength);
            randomFile.writeBytes(content);
            randomFile.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

文件的读取

  一、FileInputStream 字节流读取文件 【注意:读取中文的时候会乱码】

具体代码如下:

//按照字节读取文件内容
    public static String readFileByByte(){
        String s="";
        File f=new File("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fb.txt");
        InputStream in=null;
        try{
            in=new FileInputStream(f);
            int tempByte;
            while((tempByte=in.read())!=-1){
                System.out.println(tempByte);
                s+=tempByte;
            }
            in.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("content:"+s);
        return s;
    }

  二、InputStreamReader 字符流读取文件内容

//按照字符读取文件内容
    public static String readFileByChar(){
        String s="";
        File f=new File("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fb.txt");
        Reader rdr=null;
        try{
            rdr=new InputStreamReader(new FileInputStream(f));
            int temp;
            while((temp=rdr.read())!=-1){
                //对于window下,\r\n这两个字符在一起时,表示一个换行。   
                //但是如果这两个字符分开显示时,会换两行。
                //因此,屏蔽掉\r,或者屏蔽掉\n。否则,将会出现很多空行
                if(((char)temp)!='\r'){
                    s+=(char)temp;
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                rdr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(s);
        return s;
    }

  三、BufferedReader 以行为单位读取文件内容

//按照行读取文件
    public static String readFileByLine(){
        String s="";
        File f=new File("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fb.txt");
        BufferedReader br=null;
        try{
            System.out.println("按照行读取文件内容");
            br=new BufferedReader(new FileReader(f));
            String temp;
            while((temp=br.readLine())!=null){
                s+=temp;
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("file content:"+s);
        return s;
    }

  四、随机读取文件中的部分内容: RandomAccessFile

//随机行读取文件
    public static String readFileByRand(){
        String s="";
        File f=new File("E:\\Java\\jmoa\\TestDiff\\src\\test\\resource\\test_fb.txt");
        RandomAccessFile raf=null;
        try{
            //打开一个文件流, 按只读方式
            raf=new RandomAccessFile(f.getName(), "r");
            //文件长度,字节数
            long fileLength=raf.length();
            //读文件的起始位置
            int beginIndex=(fileLength>4)?4:0;
            //将读文件的开始位置移到beginIndex位置
            raf.seek(beginIndex);
            byte[] bytes=new byte[10];
            int byteread=0;
            //一次读10个字节,如果文件内容不足10个字节,则读剩下的文字。
            //将一次读取的字节数赋给byteread
            while((byteread=raf.read(bytes))!=-1){
                System.out.write(bytes,0,byteread);
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(raf!=null){
                try {
                    raf.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //System.out.println("文件内容:"+s);
        return s;
    }

补充的文件知识:

/**
     * 显示输入流中还剩的字节数
     */
    private static void showAvailableBytes(InputStream in) {
        try {
            System.out.println("当前字节输入流中的字节数为:" + in.available());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

文件的下载

// 在线打开方式 下载
    public void downLoad(String filePath, HttpServletResponse response,String fileNewName) throws Exception {
        File f = new File(filePath);
        OutputStream out = response.getOutputStream();
        if (!f.exists()) {
            response.setCharacterEncoding("UTF-8");
            String notFileHtml=getNotFileHtml(filePath,"文件找不到");
            out.write(notFileHtml.getBytes("UTF-8"));
            out.flush();
            return;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[1024];
        int len = 0;

        response.reset(); // 非常重要
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileNewName);

        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
    }