java 读写文件的两种方式
Posted Marydon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 读写文件的两种方式相关的知识,希望对你有一定的参考价值。
1.情景展示
在实际开发过程中,对于文件的读写操作也是经常碰到的,如何用java完成对文件的准确无误的读写呢?
2.场景分析
在java中,我们可以通过数据流(二进制)来完成对文件的操作;
其中,数据流有2种,一种是字节流,一种是字符流,这两种流各有特点,都能实现对文件的操作。
举个例子:
已知日志文件sys.log,需要对将前7行的内容放到TXT文件中,如何实现?
3.字符流
使用字符流的方式,在网上比较常见,可以按字符(行)读取,也可以按字节读取;
需要注意的是按行读取的时候,如果需要保留换行的话,需要自己手动添加换行符:\\n,否则的话,内容输出只有一行;
public static void main(String[] args) { BufferedReader br = null; BufferedWriter bw = null; try { log.info("文件转字符输入流。。。"); // 用字节输入流读取文件 br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\\\\workspace-idea\\\\logs\\\\bill\\\\sys.log")))); // 用字节输出流输出文件 // 原文件如果存在,内容会被重写;原文件不存在,会被自动创建 bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream((new File("C:\\\\Users\\\\Marydon\\\\Desktop\\\\out2.txt"))))); log.info("开始读取文件。。。"); int lineNumber = 0; String lineText; // 按行读取 while ((lineText = br.readLine()) != null) { log.debug("边读边写。。。"); // 行号+1 lineNumber++; // 非最后一行需要加换行符 // 没有换行符的话,所有内容将会被输入到同一行 lineText = (lineNumber > 6) ? lineText : lineText + "\\n"; // 将行内容写入文件 bw.write(lineText); if (lineNumber > 6) { log.info("文件截取完毕。。。"); break;// 第7行写入完毕,终止读取 } } log.info("文件写入完毕"); } catch (Exception e) { e.printStackTrace(); log.error("文件读取或写入失败:" + e.getMessage()); } finally {// 关闭流 if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != bw) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
另外,如果遇到读写文件出现乱码的情况,通常是写入的文件含中文时出现乱码,使用字符流的好处就在于:
它可以决定以什么样的字符集读取文件内容,以及以什么样的字符集输出到文件当中。(注意:不能决定输出文件本身的字符集哦)
通过InputStreamReader和OutputStreamWriter进行指定
// 以指定字符集读取文件内容 br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:\\\\workspace-idea\\\\logs\\\\bill\\\\sys.log")),"UTF-8")); // 以指定字符集输出到文件中 bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream((new File("C:\\\\Users\\\\Marydon\\\\Desktop\\\\out2.txt"))),"GB2312"));
通过OutputStreamWriter输出文件时,需要说明的有两点:
第一,当要生成的文件不存在时,会被自动创建;
第二,当原文件已经存在是,原文件内容会被覆盖掉。
4.字节流
public static void main(String[] args) { InputStream bis = null; OutputStream bos = null; try { // 用字节输入流读取文件 bis = new BufferedInputStream(new FileInputStream(new File("D:\\\\workspace-idea\\\\logs\\\\bill\\\\sys.log"))); // 用字节输出流输出文件 // 原文件如果存在,内容会被重写;原文件不存在,会被自动创建 bos = new BufferedOutputStream(new FileOutputStream((new File("C:\\\\Users\\\\Marydon\\\\Desktop\\\\out.txt")))); int len; // 创建一个用于接收文件流的数组 byte[] tempFilebytesArray = new byte[1024]; while ((len = bis.read(tempFilebytesArray)) != -1) { // 1024个字节所转成字符串 String tempText = new String(tempFilebytesArray, "UTF-8"); // 包含指定字符串,终止读取 if (tempText.contains("接收到的请求参数:")) { bos.write(tempText.substring(0, tempText.indexOf("接收到的请求参数:") + 9).getBytes("utf-8")); break; } else { bos.write(tempFilebytesArray, 0, len); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != bis) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != bos) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
实现效果与上方一样。
通过BufferedOutputStream输出文件时,需要说明的有两点:
第一,当要生成的文件不存在时,会被自动创建;
第二,当原文件已经存在是,原文件内容会被覆盖掉。
当然了,上面两种只是演示,在实际开发过程中,一般没有这么简单,但是,万变不离其宗,玩转了这两种方式,基本就没有问题了。
以上是关于java 读写文件的两种方式的主要内容,如果未能解决你的问题,请参考以下文章