java的IO系统中读写文件使用的是Reader和Writer两个抽象类,Reader中的read()和close()方法是抽象方法,Writer中的write()、flush()和close()方法也是抽象方法,子类应该分别实现他们。

JavaIO已经为我们提供了三个方便的Reader的实现类,FileReader、InputStreamReader和BufferReader。其中最重要的是InputStreamReader类,它是字节转换为字符的桥梁。可以再构造器重指定编码方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。

首先给出一个FileReader读txt的例子,很简单。

FileReader fr = new FileReader("C:/Test.txt");
int ch = ;
while((ch=fr.read())!=-){
System.out.println((char)ch);
}

其中read方法返回的是读取的下一个字符。

再给出一个InputStramReader读txt的例子,也很简单。

 InputStream is = new FileInputStream(new File(filepath));
InputStreamReader fr = new InputStreamReader(is);
int ch = ;
while((ch=fr.read())!=-){
System.out.println((char)ch);
}

这里可以看出这和FileReader没什么区别,只是需要用到的其他类对象比较多,可以简单理解,我要用的是InputStreamReader这个东西,所以就要有InputStreamReader来让我Reader,所以要建立一个InputStream,而这个InputStream是要读文件的,所以要用文件读取流来读文件,内部参数为文件对象。

事实上,在FileReader中的方法都是从InputStreamReader中继承过来的。

read()方法比较耗费时间,为了提高效率,我们可以使用BufferedReader对Reader进行包装,这样可以提高读取速度,进而一行一行的读取文本。

如:

 BufferedReader br = new BufferedReader(new FileReader(filepath));
String data = br.readLine();//一次读一行,直到null为结束
while(data!=null){
System.out.println(data);
data = br.readLine();
}

这里注意最后读到的是null的时候结束,中间可以有多个单纯的换行而不结束。

有读就有写。写文本可以使用PrintWriterFileWriterBufferWriter三种方法。

代码如下

      FileWriter fw = new FileWriter("D:/Test.txt");
String s = "hello world";
fw.write(s,,s.length());
fw.flush(); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:/Test1.txt"));
osw.write(s,,s.length());
osw.flush(); PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("D:/Test2.txt")),true);
pw.println(s); fw.close();
osw.close();
pw.close();

以上代码都是从头开始写文件,先把文件原内容删掉,然后再写入新的数据,如果想接着源文件内容写,在声明FileWriter fw时,里面参数加个true就行了,即

FileWriter fw = new FileWriter("test.txt",true);

上面是FileWriter和PrintWriter的例子,再写个BufferWriter的例子,

 File file = new File("D:/Test.txt");
File dest = new File("D:/new.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
BufferedWriter writer = new BufferedWriter(new FileWriter(dest));
String line = reader.readLine();
while(line!=null){
writer.write(line);
line = reader.readLine();
}
writer.flush();
reader.close();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

代码写完,下面说下他们的不同

PrintWriter  提供print系方法,以字符为单位,支持汉字。
BufferedWriter   提供缓冲,用以加速
  
FileWriter   用于写文件

OutputStreamWriter以字节为单位,不支持汉字。

PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。不过PrintWriter提供println()方法可以写不同平台的换行符,而BufferedWriter可以任意设定缓冲大小。

OutputStream可以直接传给PrintWriter(BufferedWriter不能接收),如:

 PrintWriter out = new PrintWriter(new BufferedOutputStream(new FileOutputStream("foo.out")));   

PrintStream类是过滤器类中一个不可忽视的成员,最基本的标准输出就要借助于它——我们常用的System.out变量就是PrintStream实例。与之对应的字符流类是PrintWriter类。

以上就是基本的文件读写操作内容,需要多加练习与使用才能对其有更好的理解。

本文代码均为自己手敲试验过的。

参考的原文网址:http://lapulande.iteye.com/blog/706051

java文本文件读写的更多相关文章

  1. Java 文本文件 读写

    Use File/FileInputStream/FileOutputStream. public void testWithFIS() throws IOException{ File file=n ...

  2. JAVA核心技术I---JAVA基础知识(文本文件读写)

    一:java IO包概述 (一)Java读写文件,只能以(数据)流的形式进行读写 (二)java IO 包 –节点类:直接对文件进行读写 –包装类 • 转化类:字节/字符/数据类型的转化类 • 装饰类 ...

  3. Java IO读写中文各种乱码问题 【转】

    Java IO读写中文各种乱码问题 转自:http://blog.sina.com.cn/s/blog_484ab56f0101muzh.html java.io.*读写中文各种乱码,很费劲.不完全解 ...

  4. java 顺序 读写 Properties 配置文件

    java 顺序 读写 Properties 配置文件 支持中文 不乱码 java 顺序 读写 Properties 配置文件 ,java默认提供的Properties API 继承hashmap ,不 ...

  5. java StringBuffer读写文件

    java StringBuffer读写文件 StringBuffer的优势 较String:String每更新一次就会new一个新的对象出来,更新次数上去之后,内存开销太大.而StringBuffer ...

  6. java io读写文件

    java io读写文件相关阅读:http://www.cnblogs.com/wing011203/archive/2013/05/03/3056535.html public class DemoI ...

  7. JAVA多线程读写文件范例

    在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入 ...

  8. Qt 学习之路 2(37):文本文件读写

    Qt 学习之路 2(37):文本文件读写 豆子 2013年1月7日 Qt 学习之路 2 23条评论 上一章我们介绍了有关二进制文件的读写.二进制文件比较小巧,却不是人可读的格式.而文本文件是一种人可读 ...

  9. java(IO)读写文件乱码转换UTF-8问题

    java(IO)读写文件乱码转换UTF-8问题 读取文件 String Content = ""; // 文件很长的话建议使用StringBuffer try { FileInpu ...

随机推荐

  1. perspective 能玩点什么

    今天看又在看张鑫旭的博客,本来是在玩 transform:Matrix() 的,有讲到单个变化的矩阵设置,但多个变化的就不是那么回事了. 不过这都不是事啦,人生嘛,显然总会有些难关不是轻易能过去的,反 ...

  2. linux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号

    应用程序 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include < ...

  3. 断点续传JAVA实现

    支持H5 Video标签播放,迅雷下载 /** * 断点续传工具 * @author lxycx_xc * 时间:2017年11月30日 */ public class BreakpointResum ...

  4. CSS3 3D旋转下拉菜单

    在线演示 本地下载

  5. INSPIRED启示录 读书笔记 - 第41章 产品经理的反省清单

    十大问题 1.产品能吸引目标消费者的关注吗? 2.产品的设计是否人性化,是否易于操作? 3.产品能在竞争中取胜吗?即使是面对未来风云变化的市场,依旧有取胜的把握吗? 4.我了解目标用户吗?产品(不是理 ...

  6. 我到 vim 配置文件---------修改从---http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html

    """"""""""""""""&quo ...

  7. centOS安装apache服务器

    # yum install httpd 启动 systemctl start httpd 重启 systemctl restart httpd 停止 systemctl stop httpd

  8. freemarker入门实例与源码研究准备工作

    首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...

  9. mybatis 一对多和多对一

      在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的“多”中也只有一条数据.id和result的唯一不同是id表示的结果将 ...

  10. HIVE 2.1.0 安装教程。(数据源mysql)

    前期工作 安装JDK 安装Hadoop 安装MySQL 安装Hive 下载Hive安装包 可以从 Apache 其中一个镜像站点中下载最新稳定版的 Hive, apache-hive-2.1.0-bi ...