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. 【Flask】Sqlalchemy lazy

    ### 懒加载:在一对多,或者多对多的时候,如果想要获取多的这一部分的数据的时候,往往能通过一个属性就可以全部获取了.比如有一个作者,想要或者这个作者的所有文章,那么可以通过user.articles ...

  2. 三 ip dns等配置

    一IP.端口.协议基本概念 ip的简单概念 互联网上的计算机,都会有一个唯一的32位的地址,ip地址 我们访问服务器,就必须通过ip地址 局域网里也有预留的ip地址  192/10/172.居于王的i ...

  3. 用PyDev、eclipse搭建Python开发环境

    一 Eclipse for python环境搭建 ①下载原生Eclipse,可以直接百度Eclipse,在百度软件中心下载  ②下载完后,打开软件,选择第一个安装即可  ③安装完成后,打开eclips ...

  4. 字符串处理sdut 2411

    题目:http://www.sdutacm.org/sdutoj/problem.php?action=showproblem&problemid=2411 关于字符串处理的题,此题坑点很多w ...

  5. 【P2964】硬币的游戏(DP+前缀和)

    一道DP,思维难度真是不小. 首先对于这个题的数据,我们可以发现差不多可以支持n^2logn,但是貌似也不会有这种复杂度的线性DP(至少这个题看上去不是这样).所以我们考虑N^2做法.因为求得是价值和 ...

  6. LeetCode——Construct Binary Tree from Preorder and Inorder Traversal

    Question Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may as ...

  7. EF与手写Model的区别以及联系

    1.在数据库表名上,EF是随意的,但是如果是Model的话,就应该在建立数据库的时候考虑到讲数据库表名变为复数,如Movie.cs 数据库应该为Movies

  8. 关于nginx性能优化及基本概念

    参考文章: Nginx面试中最常见的18道题:http://blog.csdn.net/liyanlei5858/article/details/77924420 Nginx性能优化指南:http:/ ...

  9. 调整JVM堆内存解决OutOfMemoryError

    今天在用 processing(http://zh.wikipedia.org/wiki/Processing) 编写处理 midi 文件的程序的时候,遇到了一个问题.程序主要是读取分析 midi , ...

  10. DATEDIFF 的用法

    DECLARE @date DATETIME = '2017-12-26 00:00:00';DECLARE @date2 DATETIME = DATEADD(DAY, 1, @date);DECL ...