Java入门:读写文本文件
文本文件的读写是学习java必须掌握的一项基本技术,因为在项目中时常会涉及到文本文件的读写。
一.使用FileWriter写文件
1.FileWriter类
【功能】
FileWriter类专门用来写字符到文本文件中。
【构造方法】
1) public FileWriter(String fileName):此构造方法的参数是文件名。文件名可以是相对路径,也可以绝对路径。此构造方法构造的对象,往文件写数据时,会擦除文件内原始内容,从头开始写数据。
2) public FileWriter(String fileName, boolean append):此构造方法要求两个参数,第一个单数fileName表示文件名,第二个参数append为true表示所写的新字符追加到文件原始内容之后,为fasle表示擦除文件的原始内容,从新开始写数据。
另外三个构造方法分别是:
3)FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。
4)FileWriter(File file, boolean append):根据给定的 File 对象构造一个 FileWriter 对象。
5)FileWriter(FileDescriptor fd):构造与某个文件描述符相关联的 FileWriter 对象。
【注意】
1)FileWriter类只能用来写字符流到文件中,如果要写原始字节到文件,需要使用FileOutputStream类。
2)FileWriter类将字符串按照默认的字符编码格式进行编码写到文件,缓冲区也是默认大小。如果要指定编码方式和缓冲区大小,需要使用FileOutputStream类。
3)文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
2.使用FileWriter向文本文件中写数据
import java.io.FileWriter;
import java.io.IOException; public class AppMain {
public static void main(String[] args) {
writeTest1();
} public static void writeTest1(){
try {
FileWriter fw = new FileWriter("E:/test.txt");
fw.write("Mike Mike@163.com");
fw.write("John John@163.com");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第11句:创建一个FileWriter对象fw,此对象与文件“E:\test.txt"关联。此构造方法创建的fw对象,写文件时会覆盖原有内容。如果要在原有文件上追加内容而不删除原有内容,应调用FileWriter的构造方法FileWriter(String fileName,boolean append),
第12句:向文件中写入一个字符串“Mike Mike@163.com”
第13句:向文件中写入一个字符串“John John@163.com”
第14句:关闭fw对象。文件作为一种资源,打开后要关闭,否则会长期占据文件资源,会导致意料不到的问题。
writeTest1()方法执行完毕后,打开E:\test.txt文件,内容显示如下:
可见,所有内容写到了同一行内。如果需要换行的话,请继续往下看。
2.使用FileWriter向文件逐行写文本
每次写一行,其实就是在行尾添加一个换行符。不同操作系统,换行符不一样。每行结尾是 回车+换行(CR+LF),即“\r\n”;Unix系统里,每行结尾只有 换行CR,即“\n”;Mac系统里,每行结尾是 回车CR 即'\r'。为了统一解决此问题,可以使用System.getProperty("line.separator")方法得到当前系统的换行符号。
package com.ww.filedemo; import java.io.FileWriter;
import java.io.IOException; public class AppMain {
public static void main(String[] args) {
writeTest1();
writeTestByLine();
} /**
* 写文本到文件中
*/
public static void writeTest1() {
try {
FileWriter fw = new FileWriter("E:/test1.txt");
fw.write("Mike Mike@163.com");
fw.write("John John@163.com");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 逐行写文本到文件中
*/
public static void writeTestByLine() {
// 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
String str = System.getProperty("line.separator");
try {
FileWriter fw = new FileWriter("E:/test2.txt");
fw.write("Mike Mike@163.com");
fw.write(str);//增加换行符
fw.write("John John@163.com");
fw.write(str);//增加换行符
fw.write("Jane Jane@163.com");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、使用BufferedWriter类写文本文件
【功能】
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
【主要方法】
void write(char ch);//写入单个字符。
void write(char []cbuf,int off,int len)//写入字符数据的某一部分。
void write(String s,int off,int len)//写入字符串的某一部分。
void newLine()//写入一个行分隔符。
void flush();//刷新该流中的缓冲。将缓冲数据写到目的文件中去。
void close();//关闭此流,再关闭前会先刷新他。
【构造方法】
1) public BufferedWriter(Writer out):创建一个默认缓冲区大小的字符输出流对象。参数out是一个输出流对象,如FileWriter对象。
2)public BufferedWriter(Writer out, int sz) :创建一个指定缓冲区大小的字符输出流对象。参数out是一个输出流对象,如FileWriter对象。参数sz表示缓冲区大小,正整数。
【例子】
/**
* 使用BufferWriter泪写文本文件
*/
public static void bufferedWriterTest(){
try{
BufferedWriter bw = new BufferedWriter(new FileWriter("E:/test3.txt"));
bw.write("第一行");
bw.newLine();
bw.write("第二行");
bw.newLine();
bw.write("第三行");
bw.close();
}catch(IOException e){
e.printStackTrace();
}
}
【注意】
1)可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
2)该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。
3)通常FileWriter 将其输出立即发送到底层字符或字节流,对于频繁输出内容的情况,会导致开销较高。这种情况下用 BufferedWriter 包装靠小较高的 FileWriters会提高性能。例如, PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用out. print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。
三.单字节读取文本
java中很多关于文件读取的工作。
操作也很平凡。
所以java的文件读取是很重要的一部分。
首先是单字节的读取工作。
见源代码:
package ReadFile; import java.io.FileReader;
import java.io.IOException; public class readFile {
public static void readfile(String file){
try{
FileReader fr = new FileReader(file);
int ch = 0;
while((ch=fr.read())!=-1){//fr.read()读取一个字节,判断此字节的值为-1表示读到文件末尾了。
System.out.println((char)ch);
}
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
readfile("e:\\dd.txt");
}
}
四.逐行读文本
如果要进行按行读取的话,必须采用BufferedReader BufferedReader中的readline();
package ReadLime;
import java.io.BufferedWriter; import java.io.FileWriter;
import java.io.IOException; public class ReadLine {
public static void readline(String file, String writerfile) {
try {
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr); String str;
while ((str = br.readLine()) != null) { System.out.println(str);
} br.close();
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
readline("e:\\dd.txt", "e:/aa.txt");
}
}
五.文件读写异常处理
在上述代码中,文件读写语句之外,都有try...catch...结构,这个结构叫做异常处理。异常时指程序运行时出现的超出程序正常执行流程的某些特殊情况。例如:FileReader fr = new FileReader(“E:/aa.txt”);如果E:\aa.txt文件不存在,那么这句话就会导致出现一个文件不存在的异常。
Java中,使用FileReader等文件操作类时,如果不处理异常,编译不会通过。
这里我们先需要掌握try...catch的异常处理方法,其它更多异常处理的知识在以后再继续学习。
使用try...catch的方式是将有可能出现异常的代码块放在try语句块里面,catch语句捕捉异常。
以下写法都是错误的:
public static void writeTestByLine() {
// 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
String str = System.getProperty("line.separator");
try {
FileWriter fw = new FileWriter("E:/test.txt");
} catch (IOException e) {
e.printStackTrace();
}
// 错误,fw对象的作用访问是try{ fw的作用范围 }
fw.write("Mike Mike@163.com");
fw.write(str);//增加换行符
fw.write("John John@163.com");
fw.write(str);//增加换行符
fw.write("Jane Jane@163.com");
fw.close();
}
public static void writeTestByLine() {
// 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
String str = System.getProperty("line.separator");
//错误:new FileWriter("E:/test.txt")有可能会引发异常,但没有包含在try内
FileWriter fw = new FileWriter("E:/test.txt");
try { fw.write("Mike Mike@163.com");
fw.write(str);//增加换行符
fw.write("John John@163.com");
fw.write(str);//增加换行符
fw.write("Jane Jane@163.com");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void writeTestByLine() {
// 方法一:获取系统的分行符号,在每次写入文本后,再写入一次分行符号
String str = System.getProperty("line.separator"); try {
FileWriter fw = new FileWriter("E:/test.txt");
fw.write("Mike Mike@163.com");
fw.write(str);//增加换行符
fw.write("John John@163.com");
fw.write(str);//增加换行符
fw.write("Jane Jane@163.com"); }
fw.close();//错误:不符合try...catch结构的语法规则
catch (IOException e) {
e.printStackTrace();
}
}
Java入门:读写文本文件的更多相关文章
- 【Java】读写文本文件
package rw; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutput ...
- Java读写文本文件操作
package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...
- Java IO读写中文各种乱码问题 【转】
Java IO读写中文各种乱码问题 转自:http://blog.sina.com.cn/s/blog_484ab56f0101muzh.html java.io.*读写中文各种乱码,很费劲.不完全解 ...
- java文件读写操作
Java IO系统里读写文件使用Reader和Writer两个抽象类,Reader中read()和close()方法都是抽象方法.Writer中 write(),flush()和close()方法为抽 ...
- Java入门系列(十)Java IO
概述 总体而言,java的读写操作又分为两种:字符流和字节流. 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件. 什么是流? ...
- Java入门:注册模块的实现
1.主活动图 用户选择注册选项,进入注册界面,开始输入注册信息,到最后完成注册.具体的活动图如下: 以上活动图中,矩形框里的操作不是在一个类里面实现的,而是通过Form类和UserService类来实 ...
- java入门概念梳理总结
Java入门学习 简介 public class HelloWorld { public static void main(String []args) { System.out.println(&q ...
- Java入门(7)
Java入门经典(第7版) 作者:罗格斯·卡登海德 对象抛出异常,以指出发生了异常,这些异常可以被其他对象或虚拟机捕获. 其他异常使用5个新的关键字在程序运行时进行处理:try,catch,final ...
- Java入门第一章
后天就是十一长假了,亲们准备好了去哪儿玩了吗? 今天有点空,就来聊聊Java吧,当然是一些Java入门知识了,网上有很多,这里我只是列举一些我自己学到的,感谢大家关注喵的博客这么久,也为大家带来点新知 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
随机推荐
- 安卓端通过http对Mysql进行增删改查
各类it学习视频,大家都可以看看哦!我自己本人都是通过这些来学习it只知识的! 下面是视频链接转自:http://www.cnblogs.com/yzxk/p/4749440.html Android ...
- 计算器简单封装和ASP.net
封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
由于最近比较忙,一直到假期才有空,因此将自己学到的知识进行分享.如果有不对的地方,请指出,谢谢!目前深度学习越来越火,学习.使用tensorflow的相关工作者也越来越多.最近在研究tensorflo ...
- 性能测试问题_tomcat占用内存很高,响应速度很慢
Cronolog 1. 问题描述 Tomcat占用服务器内存过大导致访问变慢 2. 问题原因 查看catalina.out文件过大,写日志时占用内存过大 3. 解决 ...
- C++中的栈内存和堆内存的区别
数据结构中的堆与栈: 栈:是一种连续储存的数据结构,具有先进后出的性质.通常的操作有入栈(圧栈).出栈和栈顶元素.想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成.类比现实中的箱子一样. 堆 ...
- oracle表空间到32G后扩容
), ) total_space FROM dba_data_files ORDER BY tablespace_name; /*查看表空间的使用情况*/ select a.a1 表空间名称, tru ...
- contextmap相当于session之类的 用于设置属性 投放到页面上 contextmap的数据存储在map中
contextmap相当于session之类的 用于设置属性 投放到页面上
- 【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题
如果线程在等待时接到通知,但线程等待的条件还不满足,此时,线程接到的就是早期通知,如果条件满足的时间很短,但很快又改变了,而变得不再满足,这时也将发生早期通知.这种现象听起来很奇怪,下面通过一个示例程 ...
- Qt——容器类(译)
注:本文是我对Qt官方文档的翻译,错误之处还请指正. 原文链接:Container Classes 介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变 ...
- 为什么有时候访问某些加密https网站是不需要证书的? https? ssl?
根证书是CA颁发给自己的证书, 是信任链的起点 1.所有访问https的网站都是需要证书的. 2.对于某些网站,尤其是证书颁发机构的网站,操作系统自动添加了这些网站访问需要的证书到证书管理器中,所以就 ...