java.io包中:字符流
  字符流的两个抽象基类:
  Reader         Writer
 
文件的读取:Reader抽象类(java.io包中)
直接子类的构造方法:
FileReader(File file) 
            在给定从中读取数据的 File 的情况下创建一个新 FileReader。 
FileReader(FileDescriptor fd) 
            在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。 
FileReader(String fileName) 
            在给定从中读取数据的文件名的情况下创建一个新 FileReader。 
 
int read()读取单个字符  
   注意:作为整数读取的字符,范围在0到65535之间(0x00-0xffff),如果已到达流的末尾,则返回 -1 
int read(char[] cbuf)  将字符读入数组。
   注意:读取的字符数,如果已到达流的末尾,则返回 -1 
//例子1:使用read()读取单个字符并输出
import java.io.*;
class FileReaderDemo
{
public static void sop(Object obj)
{
System.out.print(obj);
}
public static void main(String[] args)throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联起来。
//要保证该文件是已经存在的。如果不存在,会发生异常,即FileNotFoundException
FileReader fr = new FileReader("F:\\myfile\\test.txt"); //调用读取流对象的read方法。
//read方法:一次读取一次字符,而且会自动往后面读取字符。
int ch = 0;
while((ch=fr.read())!=-1)
{
sop((char)ch);
} /*
while(true)
{
int ch = fr.read();
if(ch==-1)
break;
sop((char)ch); //读取文件中的一个字符
}
*/
fr.close();
}
}
//例子2:使用read(char[] cbuf)  将字符读入数组再输出
import java.io.*;
class FileReaderDemo2
{
public static void sop(Object obj)
{
System.out.print(obj);
}
public static void main(String[] args)throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联起来。
//要保证该文件是已经存在的。如果不存在,会发生异常,即FileNotFoundException
FileReader fr = new FileReader("F:\\myfile\\test.txt"); //定义一个字符数组,用于存储读取的字符
char[] buf = new char[1024];
int num = 0;
while((num = fr.read(buf))!=-1)//num = fr.read(buf)返回是读取的字符个数,如果已到达流的末尾,则返回 -1
{
//String(char[] value, int offset, int count) 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
String str = new String(buf,0,num);
sop(str);
} fr.close();
} }
 
那么再学习字符写入流的特点:Writer 抽象类(java.io包中)    
FileWriter(File file)   根据给定的 File 对象构造一个 FileWriter 对象。
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件
那么先以操作文件为主来显示。
 
需求:在硬盘上,创建一个文件夹并写入一些文字数据。后缀名是父类名,前缀名是该流对象的功能。
找到一个专门用于操作文件的Writer子类对象。
 
public abstract void close()
       throws IOException关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。
  关闭以前关闭的流无效。
abstract  void flush() 
          刷新该流的缓冲。
//例子3:
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//第一步:
//创建一个FileWriter对象,该对象一被初始化就必须有明确的被操作的文件,而且该文件会被创建到指定的目录下
//如果该目录下已有同名文件,将会被覆盖。其实该步就是要明确数据要存放的目的地。
FileWriter fw = new FileWriter("F:\\myfile\\demo.txt"); //第二步:
//调用父类共性方法write方法,将数据写入到了流当中。
fw.write("asjdsjdfkskidkf,fdhjsdkjfdsk,dfhjdskj"); //第三步:
//调用父类共性方法flush方法,刷新流对象中的缓冲中的数据,将数据刷新到目的地中。
fw.flush(); //可以接着往目的地中写入数据
fw.write("xiayuanquan");
fw.flush(); //父类中的共性方法close方法,关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷新到目的地中去。
//和flush的区别:flush刷新后,流可以继续使用;而close刷新后,流会关闭,无法继续使用。
fw.write(" aaaaaaaaaaaaaa");
fw.close(); //Stream closed
//fw.write("xxxx"); //流已关闭,此时不能再向目的地的文件中写入数据 }
}
 
使用字符流读取和写入数据时,可能会出现流异常的情况,例如文件不存在、路径错误等,此时,需要我们对异常进行捕获并处理。
//例子4:
import java.io.*;
class FileWriterExceptionDemo
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("F:\\myfile\\Exception.txt");//创建目标文件 fw.write("my name is xiayuanquan!"); //往流里写入数据内容
}
catch(IOException ie)
{
System.out.println(ie.toString());
}
finally
{
try
{
if(fw!=null)
fw.close(); //先刷新流,将流中的数据内容刷到目标文件中,然后关闭流资源
}
catch(IOException ie)
{
System.out.println(ie.toString());
}
}
}
}
 
拓展:当用户想把数据写入同一个文件,可是文件中已经存在内容时,那么新写入的数据会替换之前的数据。此时,这不是用户所希望的,针对这种情况,我们可以将新写入的内容在文件内容后面续写即可。api中就提供了一个方法如下:
对已有文件数据内容的续写:
FileWriter(File file, boolean append) 
          根据给定的 File 对象构造一个 FileWriter 对象。
//例子5:
import java.io.*;
class FileWriterDemoappend
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
//传递一个ture参数,代表不覆盖已有的文件。并在已有文件的末尾处进行文件的续写。
fw = new FileWriter("F:\\myfile\\demo.txt",true);
fw.write(",,,wei-zhong-hua-jue-qi-er-du-shu");
fw.write("\r\nabc=abc");//'\r\n'代表换行,然后接着续写数据
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
 
综合练习:将相同目录下一个文本文件赋值到另一个文本文件中。
(例如:将F:\\myfile\\practice.txt--------->F:\\myfile\\test.txt)
思路:第一步,创建读取流与F:\\myfile\\practice.txt相关联。
         第二步,将F:\\myfile\\practice.txt中数据内容全部读入流中,并放在定义的数组内,然后关闭资源。
         第三部,创建写入流与F:\\myfile\\test.txt相关联,并设置续写功能的布尔值为true;
         第四部,将第二部定义的数组的数据内容全部写入F:\\myfile\\test.txt文件中,然后关闭资源。
//例子6:
import java.io.*;
class CopyText
{
public static void main(String[] args)throws IOException
{
FileReader fr = new FileReader("F:\\myfile\\practice.txt");
FileWriter fw = new FileWriter("F:\\myfile\\test.txt",true); //第一种方式:(先全部读完数据后存入缓冲区,再一次性续写入目标文件中)
int num=0;
char[] buf = new char[1024];
while((num = fr.read(buf))!=-1)
{
String str = new String(buf,0,num);
fw.write("\r\n"+str);
// fw.write(buf,0,num);
fw.close();
}
fr.close(); /*
//第二种方式:(每次读一个数据,就往目标文件中写入一个数据)
int num = 0;
while((num = fr.read())!=-1)
{
fw.write(num);
}
fw.write("\r\n");
fw.close();
fr.close();
*/
}
}
 
 

Java:IO流之字符流Reader、Writer详解的更多相关文章

  1. 系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类

    目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取 ...

  2. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  3. Java IO 字节流与字符流 (五)

    Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...

  4. java IO(三):字符流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  5. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  6. Java IO 字节流与字符流 (二)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  7. Java——IO类,字符流写数据

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  8. java io系列16之 PrintStream(打印输出流)详解

    本章介绍PrintStream以及 它与DataOutputStream的区别.我们先对PrintStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:htt ...

  9. Java——IO类,字符流读数据

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  10. 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter

    package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...

随机推荐

  1. Net Core 的公共组件之 Http 请求客户端

    Net Core 的公共组件之 Http 请求客户端 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 ...

  2. 基于.net mvc的校友录(三、实体模型实现)

    实体模型设计 由于是实际开发,而且是时间比较紧的,所以,在开发实现过程中,总有一些对原计划的改动: AlumniBookModel数据库实体模型 这是主数据实体类,EF会根据此实体生成数据库,它的每一 ...

  3. 寻找“水王”--c++

    一.题目与设计思路 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一 ...

  4. 详解使用CSS3绘制矩形、圆角矩形、圆形、椭圆形、三角形、弧

    1.矩形 绘制矩形应该是最简单的了,直接设置div的宽和高,填充颜色,效果就出来了. 2.圆角矩形 绘制圆角矩形也很简单,在1的基础上,在使用css3的border-radius,即可. 3.圆 根据 ...

  5. javascript 对象数组排序

    参考地址:http://blog.csdn.net/kavensu/article/details/17851329

  6. 安装Netsharp演示插件

    阅读本文请先阅读Netsharp下载及环境搭建 Netsharp提供了DEMO程序,DEMO完成的功能是Netsharp文章系列中的Netsharp快速入门系列中介绍的功能,DEMO是以Netshar ...

  7. Dedication(转)

    To all developers who strive for continuous self-improvement... Who are not satisfied with good enou ...

  8. Upgrading to Java 8——第一章 Lambda表达式

    第一章 Lambda表达式 Lamada 表达式是Java SE 8中最重要的新特性,长期以来被认为是在Java中缺失的特性,它的出现使整个java 语言变得完整.至少到目前,在这节中你将学习到什么是 ...

  9. 【BZOJ】【1047】【HAOI2007】理想的正方形

    DP/单调队列优化 一眼看上去就是DP 我想的naive的二维DP是酱紫滴: mx[i][j][k]表示以(i,j)为右下角的k*k的正方形区域内的最大值,mn[i][j][k]同理 mx[i][j] ...

  10. SQL Server优化

    虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决. 查询速度慢的原因很多,常见如下几种: 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/ ...