Java file文件的写入和读取及下载
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(); }