Java精选笔记_IO流(字符输入输出流、字符文件输入输出流、字符流的缓冲区)
字符流
Reader是字符输入流的基类,用于从某个源设备读取字符
Writer是字符输出流,用于向某个目标设备写入字符
字符流操作文件
字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。
在程序开发中,经常需要向文件中写入字符,可以使用Writer的一个子类FileReader。
需求:在硬盘上,创建一个文件,并写入一些文字数据。
用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。
操作步骤:
1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖
FileWriter fw=new FileWriter("demo.txt");
2.调用write方法,将字符串写入到流中。
fw.write();
3.刷新流对象中的缓冲中的数据,将数据刷到目的地
fw.flush();
4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后将会将流关闭。
fw.close();
字符文件输入流FileReader
针对字符进行操作,而不是字节。它的间接父类是字符流Reader。FileWriter是用于写入字符文件的便捷类。
在FileReader类中未自定义方法,而是继承了其父类及间接父类中的方法。
构造方法
public FileReader(File file) 在给定从中读取数据的File的情况下创建一个新类
public FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新类
字符文件输出流FileWriter
构造方法
FileWriter(File file) 通过file对象创建FileWriter
FileWriter(File file, boolean append) 通过file对象创建类,append为true或false表示是否在文件追加
FileWriter(FileDescriptor fd) 参数fd为文件描述符,通过文件描述符创建FileWriter
FileWriter(String fileName) 参数fileName为文件路径名,通过文件路径创建FileWriter
FileWriter(String fileName, boolean append)
字符输入流Reader
该类是抽象类,不能被实例化
方法
abstract void close() 关闭输入流
void mark () 在输入流中标记当前位置
boolean markSupported () 测试输入流是否支持mark()和reset()方法
int read () 从输入流读取下一字符
int read (char[] cbuf) 从输入流读取若干字符数据,并存储到字符数组
abstract int read (char[] cbuf, int off, int len) 从输入流读取至多len个字符数据,并存储到字符数组
boolean void ready () 判断是否准备读取输入流
void reset () 将输入流重新定位到mark()方法标记的位置
long skip (long n) 跳过输入流中n个字符数据
字符输出流Writer
该类是抽象类,不能被实例化
方法
abstract void close() 关闭输出流
abstract void flush() 刷新输出流,强制将缓冲区内容写入输出流
void write(char[] cbuf) 将指定字符数组的内容写入输出流
abstract void write(char[] cbuf,int off,int len) 将指定字符数组从off位置开始的len个字符写入输出流
write(int c) 将指定的字符写入输出流
write(String str) 将指定的字符串写入输出流
write(String str,int off,int len) 将指定字符串从off位置开始的len个字符写入输出流
字符流的缓冲区
字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行包装,BufferedWriter用于对字符输出流进行包装。
缓冲区的出现提高了对数据的读写效率
对应类:BUfferWriter 、BufferedReader
特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。
BufferedWriter步骤
1.创建一个字符写入流对象
FileWriter fw=new FileWriter("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
bufferedWriter bufw=new BufferedWriter(fw);
buff.write("asdasdas");
bufw.newLine();//换行符,跨平台的
3.将缓冲区刷新
bufw.flush;
4.关闭缓冲区,就是在关闭缓冲区中的流对象
BufferedReader步骤
1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
BufferedReader bufr=new BufferedReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=bufr.readLine())!=null) {
String s=line;}
4.关闭
bufr.close();
readLine()方法的原理:无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。
通过缓冲区复制一个文件
BufferWriter bufw=null;
BufferReader bufr=null;
try {
bufw=new BufferWriter(new FileWriter("b.txt"));
bufr=new BufferReader(new FileReader("a.txt"));
String line=null;
while ((line=buffr.read(buf))!=null){
bufw.write(line);
bufw.newLine();
bufw.flsuh;
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
字符缓冲区输入流BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
构造方法
public BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的输入流
public BufferedReader(Reader in, int size) 创建一个使用size指定大小输入缓冲区的输入流
方法
void close()
关闭该流
void mark(int readAheadLimit) 标记流中的当前位置
boolean markSupported() 判断此流是否支持mark()操作
int read() 读取单个字符
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分
String readLine() 读取一个文本行
boolean ready() 判断此流是否已准备好被读取
void reset() 将流重置为最新的标记
long skip(long n)
跳过字符
字符缓冲区输出流BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。
构造方法
public BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的输出流
public BufferedWriter(Writer out, int size) 创建一个使用size指定大小输出缓冲区的输出流
方法
void close() 关闭该输出流
void flush() 刷新该流的缓冲
void newLine() 写入一个行分隔符
void write(char[] cbuf, int off,int len) 写入字符数组的某一部分
void write(int c) 写入单个字符
void write(String s,int off,int len) 写入字符串的某一部分
文件的读取
文件的读取方式一:FileReader();
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.调用读取流的对象的read方法
(1)int ch=fr.read();一次读一个字符,会自动往下读。
(2)读出所有字符
while((ch=fr.read())!=-1){
System.out.println((char)ch);
}
3.关闭流资源,
fr.close();
文件的读取方式二:通过字符数组进行读取
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。
char[] buf=new char[1024];一般定义1024-2个字节。
int num=0;
while((num=fr.read(buf))!=-1){
System.out.println((new String(buf,0,num));
}
文件的续写
传递一个true参数,代表不覆盖已有文件,并在已知文件的末尾处进行数据续写。
FileWriter fw=new FileWriter("demo.txt",true);
换行转义字符:\r\n
IO异常的处理方式
FileWriter fw=null;
try {
fw=new FileWriter("demo.txt");
fw.write("sdfasd");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ListNumberReader带有行号的缓冲区
是BufferedReader的直接子类
LineNumberReader lnr=new LineNumberReader();
获取行号:lnr.getLineNumber();
设置行号从几开始:lnr.setLineNumber(100);
1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
LineNumberReader lnfr=new LineNumberReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=lnfr.readLine())!=null) {
String s=line;
String linenum=lnfr.getLineNumber();
}
4.关闭
lnfr.close();
自定义带行号的MyLineNumber
public class MyLineBufferReader extends MyBufferedReader {
public MyLineBufferReader(Reader r) {
super(r);
}
private int LineNumber;
public int getLineNumber() {
return LineNumber;
}
public void setLineNumber(int lineNumber) {
LineNumber = lineNumber;
}
public String myReadLine() throws IOException {
LineNumber++;
return super.myReadLine();
}
}
自定义一个功能和readline一致的方法,来模拟下BufferedReader()
public class MyBufferedReader extends Reader {
private Reader r;
public MyBufferedReader(Reader r) {
super();
this.r = r;
}
//可以一次读取一行的方法
public String myReadLine() throws IOException {
//定义一个临时容器。StringBulider容器,应用于存储字符数组
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
}
}
读取一个.java文件,并打印在控制台上
FileReader fr=null;
char[] buf=new char[1024];
int num=0;
try {
fr= new FileReader("a.txt");
try {
while((num=fr.read(buf))!=-1) {
System.out.print(new String(buf,0,num));
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(fr!=null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
将C盘的一个文本文件拷贝到D盘(数组相当于存储之中的媒介)
步骤:
1.新建一个文件用于存储要被拷贝的文件
2.定义读取流和源文件关联
3.通不过不断读写完成数据存储
4.关闭资源
FileWriter fw=null;
FileReader fr=null;
try {
fw=new FileWriter("b.txt");
fr=new FileReader("a.txt");
char[] buf=new char[1024];
int num=0;
while ((num=fr.read(buf))!=-1) {
fw.write(buf,0,num);
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Java精选笔记_IO流(字符输入输出流、字符文件输入输出流、字符流的缓冲区)的更多相关文章
- Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)
字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...
- Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)
IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...
- Java精选笔记_IO流【File(文件)类、遍历目录下的文件、删除文件及目录】
File(文件)类 File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径 File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File ...
- Java IO流学习总结一:输入输出流
Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...
- java:IO流(File,字节流/输入输出流(InputStream(FileInputStream),OutputStream(FileOutStream)),字符流(Reader,Writer))
File: * java.io.File类:代表一个文件或目录. * 常用的构造方法: * File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例 ...
- Java开发笔记(八十八)文件字节I/O流
前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进.随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式 ...
- Java精选笔记_JSP技术
JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...
- Java精选笔记_Java编程基础
Java的基本语法 Java代码的基本格式 修饰符 class 类名 { 程序代码 } 一个Java源文件只定义一个类,不同的类使用不同的源文件定义:将每个源文件中单独定义的类都定义成public ...
- Java 7源码分析第13篇 - 字节输入输出流(1)
上一篇介绍了关于字节输入输出流的Java类框架,同时也简单介绍了一下各个类的作用,下面就来具体看一下这些类是怎么实现这些功能的. 1.InputStream和OutputStream InputStr ...
随机推荐
- css reset.css
/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, ...
- asp.net mvc 5 在没有外网win2008R2服务器部署方法
我在本地用最新的.net 4.5和asp.net mvc 5框架做了一个小应用.本地都测试打包成功. 现在要放到服务器上,这个应用只是内网用.服务器不允许连接外网.看到www.asp.net 没有mv ...
- stock article
stock 征服星辰大海 http://www.tianya.cn/95789158 论坛_悟道股市_天涯社区 http://www.tianya.cn/108318593/bbs?t=post 当下 ...
- python字符串转换成变量的几种方法
个人比较喜欢用第三种方法 var = "This is a string" varName = 'var' s= locals()[varName] s2=vars()[varNa ...
- SQL Injection绕过技巧
0x00 sql注入的原因 sql注入的原因,表面上说是因为 拼接字符串,构成sql语句,没有使用 sql语句预编译,绑定变量. 但是更深层次的原因是,将用户输入的字符串,当成了 "sql语 ...
- android开发中用到的px、dp、sp
先介绍一下这几个单位: px : pixels(像素),相应屏幕上的实际像素点. dip :device independent pixels,与密度无关的像素,基于屏幕密度的抽象单位. 在每英寸16 ...
- QT4.8.5 QComboBox 增加选择菜单记录
QT4.8.5 QComboBox 增加选择菜单记录 因为软件需要测试多个UART ,多个LAN,当要测试多个同样功能的时候就可以使用QComboBox类实现一个菜单选择功能. 步骤如下: 1. 在U ...
- jquery轮播控件
网上找了一个轮播控件,效果不错,而且很容易改,需要的同学去下载咯 地址是:http://download.csdn.net/detail/jine515073/7704143
- jQuery的Cookie操作插件
jQuery的cookie插件 01 // jQuery.cookie.js 02 jQuery.cookie = function(name, value, options) { 03 if ...
- 关于quartus ii软件中注释乱码问题的解决方法
乱码现象: 解决办法: 打开文件所在工程找到该verilog文件(后缀名是.v),使用记事本打开,这时你会看到注释好好的没乱码,很高兴是不,不用着急.接下来点击文件再另存为,选择编码:UTF-8,点保 ...