一、输出字符流

1.1、输出字符流体系

--------| Writer:输出字符流的基类(抽象类)
  ----------| FileWriter:向文件输出数据输出字符流(把程序中的数据写到硬盘中)
  ----------| BufferedWriter:缓冲输出字符流    缓冲输出字符流的作用:提高了FileWiter的写数据效率和拓展了FileWiter的功能。内部提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWiter。

注意:所有缓冲流都不具备读写文件的能力(比如BufferedWriter,他要借助FileWriter的写功能来写文件)

1.2 、FileWriter的步骤

1.找到目标文件
    2.建立数据输出通道
    3.写出数据(把程序中的数据写到硬盘中)
    4.关闭资源

1.3、 FileWriter要注意的事项

1.FileWrite内部是维护了一个1024个字符的数组,使用FileWriter写数据的时候,会先写入到它内部维护的字符数组中,如果需要把数据真正的写到硬盘上,需要调用flush或者close方法或者填满内部的字符数组。
    2.使用FileWrite的时候,如果目标文件不存在,那么会自动创建目标文件。

1.4、实例

 package com.dhb.file;

 import java.io.File;
import java.io.FileWriter;
import java.io.IOException; /**
* @author DSHORE / 2018-7-6
*
*/
public class Demo15 {
public static void main(String[] args) throws IOException {
writeTest();
}
//输出字符流
public static void writeTest() throws IOException{
//找到目标文件
File file=new File("F:\\a.txt");
//建立数据输出通道
FileWriter fw=new FileWriter(file,true);//加个true,表示在原文件的原数据后面追加当前数据;不加true,则原来的数据全部被替换成现在追加的数据
//准备数据,把数据写出(即:写数据;把程序中的数据写到硬盘中)
String data="\r\n今天天气非常好,如果明天也好,我们就一起去锻炼吧!!!";// “\r\n”表示换行
fw.write(data);//字符流具备解码功能.
//刷新字符流
//fw.flush();
//关闭资源
fw.close();//其实close()里面有个flush()方法
}
}

运行结果图(运行两次的结果)

二、缓冲输出字符流

2.1、BufferedWriter注意事项

1.缓冲输出字符流的作用:提高了FileWiter的写数据效率和拓展了FileWiter的功能。内部提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWiter。
    2.凡是缓冲流都不具备读写文件的能力

2.2、实例

 package com.dhb.file;

 import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException; /**
* @author DSHORE / 2018-7-11
*
*/
public class Demo17 { public static void main(String[] args) throws IOException {
//找到目标文件
File file=new File("F:\\a.txt");
//建立数据输出通道
FileWriter fw=new FileWriter(file);
BufferedWriter bw=new BufferedWriter(fw);
//bw.newLine();//换行
bw.write("\r\n");//换行
//写出数据
bw.write("你若安好,便是晴天!");
//关闭资源
bw.close();
}
}

结果图:

附录1

 package com.dhb.file;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; /**
* @author DSHORE / 2018-7-11
*
*/
/*
* 需求:将源目录拷贝到指定目录中
* */
//拷贝文件
public class DirCopy {
//源目录 , 目标文件
public void copy(File sourceDir,File targetFile){
//根据源目录名和目标目录构建一个新的目录对象
//这个是磁盘名(目标文件),源文件名
targetFile = new File(targetFile,sourceDir.getName());
//判断该目录是否存在,若不存在则创建
if(!targetFile.exists()){ //exists:存在
boolean b = targetFile.mkdirs(); //mkdirs:建立一个新的子目录
if(b)System.out.println("创建目录:"+targetFile.getAbsolutePath());//输出已创建目录(文件夹)的绝对路径
}
//获取源目录中的所有子文件(或子目录)
File[] files = sourceDir.listFiles();
if(files != null){
for (int i = ; i < files.length; i++) {
//判断当前File对象是文件还是目录
if(files[i].isDirectory()){//判断是文件
//如果是目录,则递归调用
copy(files[i],targetFile);//重新调用copy()方法,在遍历目录里面的文件
}else{
//如果是标准文件则进行文件拷贝
copyFile(files[i],targetFile);
}
}
}
}
//实现标准文件的拷贝 原文件 目标文件
private void copyFile(File source, File target) {
//根据要拷贝的文件名和目录构建新的文件
target = new File(target, source.getName()); BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//获取源文件的输入流
bis = new BufferedInputStream(new FileInputStream(source));//作用于:读
//获取目标文件的输出流
bos = new BufferedOutputStream(new FileOutputStream(target));//作用于:写
byte[] b = new byte[];
int length=;
System.out.println("开始拷贝:"+source.getAbsolutePath()+"---------->"+target.getAbsolutePath());
while((length = bis.read(b)) != -){//读
bos.write(b, , length);//写
bos.flush();
}
System.out.println("拷贝完成:"+source.getAbsolutePath()+"---------->"+target.getAbsolutePath());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bos.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
// 要拷贝的文件(原文件) ,要拷贝到那个盘符下(目标文件)
new DirCopy().copy(new File("F:\\MyJavaCode"),new File("E:\\"));
}
}

运行结果图:

      

附录2

 package com.dhb.file;

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner; /**
* @author DSHORE / 2018-7-11
*
*/
/*
* 需求:请使用缓冲输入输出字符流实现用户的登录注册功能.....
* 张三 123
* 李四 456
*
* */
public class Demo18 {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) throws IOException {
while(true){
System.out.println("请选择功能: A(注册) B(登录)");
String option=sc.next();
if("a".equalsIgnoreCase(option)){
//注册
reg();
}else if("b".equalsIgnoreCase(option)){
//登录
login(); }else{
System.out.println("输入有误,请从新输入.....");
}
}
}
//登录
private static void login() throws IOException {
System.out.println("请输入用户名");
String userName = sc.next();
System.out.println("请输入密码");
String passWord = sc.next();
String info = userName+" "+passWord;
//读取文件信息是否存在该用户,如果有则登录成功
//建立数据的输入通道
//缓冲输入字符流
BufferedReader br = new BufferedReader(new FileReader(new File("F:\\a.txt")));
boolean isLogin = false;
String line = null;
while((line = br.readLine())!=null){ //readLine:一行一行的读取
if(info.equals(line)){
isLogin=true;
break;
}
}
if(isLogin){
System.out.println("登录成功!欢迎"+userName);
}else {
System.out.println("用户或密码错误!如未注册,请先注册再登录");
}
}
//注册
private static void reg() throws IOException {
System.out.println("请输入用户名");
String userName = sc.next();
System.out.println("请输入密码");
String passWord = sc.next();
String info = userName+" "+passWord;
//把用户信息写到文件上
File file = new File("F:\\a.txt");
//建立通道
FileWriter fw = new FileWriter(file,true);
//建立缓冲输出字符流
BufferedWriter bw = new BufferedWriter(fw);
//把用户信息写出
bw.write(info);
bw.newLine();//换行
//关闭资源
bw.close();
}
}

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/9274643.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

java基础46 IO流技术(输出字符流/缓冲输出字符流)的更多相关文章

  1. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  2. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  3. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  4. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  5. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  6. java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理

    一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...

  7. java基础45 IO流技术(输入字符流/缓冲输入字符流)

    一.输入字符流 1.1.输入字符流体系 ------| Reader:输入字符流的基类(抽象类)  ----------| FileReader:向指定文件读取数据的输入字符流(把硬盘上的数据读取到程 ...

  8. Java基础:IO流之字节流和字符流

    1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...

  9. java基础53 IO流技术(转换流)

    1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流    2.输出字节流的转换流:OutputStreamWriter是字符 ...

随机推荐

  1. [CQOI2016] 手机号码 (数位dp)

    link $solution:$ $10^{10} \leq L \leq R < 10^{11}$这个数据范围很容易想到数位$dp$. 依照题意模拟即可. #include<iostre ...

  2. sql数据库设计学习---数据库设计规范化的五个要求

    http://blog.csdn.net/taijianyu/article/details/5945490 一:表中应该避免可为空的列: 二:表不应该有重复的值或者列: 三: 表中记录应该有一个唯一 ...

  3. C++ STL之LIST详解A

    List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用list容 ...

  4. matlab --- plot画图

    plot画的图形在上一个plot的figure中:hold on 添加图例:legend({'X','Y'}) 限制X轴Y轴的坐标范围:xlim([380 780]);ylim([0 2]) 或 ax ...

  5. Rancher Server HA的高可用部署实验-学习笔记

    转载于https://blog.csdn.net/csdn_duomaomao/article/details/78771731 Rancher Server HA的高可用部署实验-学习笔记 一.机器 ...

  6. linux命令总结之lsof命令

    简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  7. 数学建模 TSP(旅行商问题) Lingo求解

    model: sets: cities../:level; link(cities, cities): distance, x; !距离矩阵; endsets data: distance ; end ...

  8. 苏宁OLAP架构设计

    一. 功能综述 OLAP引擎为存储和计算二合一的引擎,自身内部涵盖了对数据的管理以及提供查询能力.底层数据完全规划在引擎内部,外部系统不允许直接操作底层数据,而是需要通过暴露出来的接口来读写引擎内部数 ...

  9. python学习笔记3--set

    #int string list tuple dict bool float set #集合:天生去重 s=set() #空的集合 s2={'} ls=[1,2,3,4,5,6,7,1,2,3,4] ...

  10. 动态改变swiper的属性

    <script> var mySwiper = new Swiper('.swiper-container',{ autoplay : 1000, autoplayDisableOnInt ...