java基础46 IO流技术(输出字符流/缓冲输出字符流)

一、输出字符流

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()方法
}
}

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

java基础46 IO流技术(输出字符流/缓冲输出字符流)

二、缓冲输出字符流

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();
}
}

结果图:

java基础46 IO流技术(输出字符流/缓冲输出字符流)

附录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:\\"));
}
}

运行结果图:

java基础46 IO流技术(输出字符流/缓冲输出字符流)      java基础46 IO流技术(输出字符流/缓冲输出字符流)

附录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

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

上一篇:RSA IOS和Java


下一篇:adbd cannot run as root in production builds