Java学习笔记六(I/O流)
1.介绍
在实际开发过程中经常会用到数据的输入/输出操作,本篇博客着重分析一下,java中经经常使用到的有关IO操作的类。而在java中能够将经常使用的流分为两个部分:字节流和字符流。
1.流的抽象基类
字节流 字符流 输入流 InputStream Reader 输出流 OutPutStream Writer 正如上图表格所看到的。字符和字节流都有自己的基类,其余的都是继承基类的扩展流的操作。以下会着重的解说一下。(仅仅要会了字符流,字节流与其操作一样,仅仅只是操作的文件类型不一致而已)
2.字符流
专门用于读写文本数据。凡是能够用记事本打开的文件比如txt、java、html都数据字符流的操作范围
1.字符输出流——FileWriter
字符输出流一般应用的是FileWriter,然后调用其构造函数,传递字符串的文件名称,将字符写在这个文件里。其次调用父类方法Write(String str)写字符串。在这里须要注意的是字符流写数据,不会直接写在目的文件里。而是写在内存中,必须走一个方法,刷新。将内存中的数据刷新到目的文件里,字符流写数据必须刷新。一般调用的是Void Flush()方法,最后用完后须要关闭流对象。
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.IO; import java.io.FileWriter;
import java.io.IOException; public class FileWriterDemo1 { public static void main(String[] args) {
FileWriter fw = null;
try {
//採用这样的形式的话。每次都会覆盖曾经的数据信息
// fw=new FileWriter("c:\\exception.txt");
//採用这样的构造器的话,将会採用追加的形式加入数据。
//查询本机默认编码表示GBK
fw=new FileWriter("c:\\exception.txt",true); fw.write("abd");
fw.flush();
fw.write("弄H啊哦吗");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("文件写入失败"); }finally{
try {
//必须在这里进行推断否则,报错。可能会报空指针的异常信息。 if(fw!=null){
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("关闭资源失败");
}
}
} }
</span></span>FileWriter写文本文件操作例如以下
单个字符的形式。调用的父类Write(int c)方法
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package cn.Io.iostream; import java.io.*;
class FileWriterDemo1
{
public static void main(String[] args)
{ //创建输出流对象
FileWriter fw = null;
try{
fw = new FileWriter("c:\\1.txt");
fw.write("abc");
fw.flush();
fw.write("adb");
//将内存中的数据刷新到文件里
fw.flush();
}catch(IOException e){
e.printStackTrace();
throw new RuntimeException("写入数据失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
e.printStackTrace();
throw new RuntimeException("关闭流对象失败");
} }
}
}
</span></span>字符数组的形式,调用的方法例如以下
~write(char[] ch)传递整个字符数组
~write(char[] ch,int off,int len)写数组的一部分,off開始下标。len个数
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package cn.IO.iostream;
/*
* FileWriter以数组的形式写入文件
*
*/
import java.io.*;
public class FileWriterDemo2 {
public static void main(String[] args) throws IOException {
//调用此输出流的构造函数,将会以追加的形式写入到文件内容中
FileWriter fw = new FileWriter("c:\\demo.txt",true); fw.write(97); char[] ch= {'a','b','c'};
fw.write(ch,1,1);
fw.write("sefser");
fw.flush();
fw.close();
}
}
</span></span>注意,假设要想文件里追加写入内容,而不是覆盖原来的内容的话。仅仅需在创建输入流对象的时候,调用其
FileWriter(String fileName, boolean append)构造方法就可以
2.字符输入流
字符输入流一般应用的是FileReader读取文本文件。然后调用其构造方法,创建输入流对象。传递字符文件名称,比如new FileReader('文件名称')。读取一个字符 int read()方法。每次仅仅读取一个字符,然后指定的read()方法,会自己主动的向后读取一个,读到末尾的时候,将会返回-1
读取单个字符
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package cn.IO.iostream;
/*
* 採用字符输入流对象。进行读取文件操作
*/
import java.io.*; public class FileReaderDemo {
public static void main(String[] args) throws IOException{
//创建输入流对象
FileReader fr = new FileReader("c:\\demo.txt");
//调用Read方法。每次仅仅读取一个字符操作
int x = 0;
while((x = fr.read())!=-1){
System.out.print((char)x);
}
fr.close();
}
} </span></span>读取字符数组操作
int read(char[] cbuf):读取方法,传递字符数组。返回值int代表有效读取的字符个数,此方法读取效率高
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package cn.itcast.iostream;
/*
* 採用字符输入流对象进行字符数组的读取
*/
import java.io.*;
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("c:\\demo.txt");
//创建一个字符数组
char[] ch = new char[1024];//通常是1024的倍数
int x = 0 ;
while(( x = fr.read(ch))!=-1){
//String(char[] value, int offset, int count)
System.out.print(new String(ch,0,x));
}
fr.close();
}
}
</span></span>拷贝文件操作
利用字符流的输入和输出流,来操作文件的复制功能
第一种方式,读一个字符,写一个字符
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package cn.IO.iostream;
/*
* 採用字符流来实现复制的功能
*/
import java.io.*;
public class CopyText {
public static void main(String[] args) {
long start = System.currentTimeMillis();
//创建字符输入和输出流的对象
FileReader fr = null;
FileWriter fw = null;
try{
//分别调用其构造函数
fr = new FileReader("c:\\demo.txt");
fw = new FileWriter("d:\\demo.txt");
//定义变量来报错单个字符读取的值
int len = 0 ;
while((len = fr.read())!=-1){
fw.write(len);
fw.flush();
}
}catch(IOException e){
throw new RuntimeException("复制失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
throw new RuntimeException("关闭写入流失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException e){
throw new RuntimeException("关闭输入流失败");
}
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
</span></span>另外一种方法:读一个字符数组。写一个字符数组
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package cn.IO.iostream;
/*
*採用输入和输出流完毕复制的功能操作
*/
import java.io.*;
public class CopyText2 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
//分别创建字符输入和输出流对象
FileReader fr = null;
FileWriter fw = null;
try{
//分别调用其构造函数实例化
fr = new FileReader("c:\\e.html");
fw = new FileWriter("d:\\1.html");
//定义要读取的字符数组
char[] ch = new char[1024];
int len = 0 ;
while((len = fr.read(ch))!=-1){
fw.write(ch,0,len);
fw.flush();
}
}catch(IOException e){
throw new RuntimeException("复制失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
throw new RuntimeException("关闭输出流失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException e){
throw new RuntimeException("关闭输入流失败");
}
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
</span></span>注意:利用读取字符数组的形式,效率会快非常多
3.缓冲流
在读写的时候。也能够採取缓冲流的形式对字符或者字节进行缓冲,从而实现字符、数组和行的高效读写操作。
字符 字节 缓冲输入流 BufferedReader BufferedInputStream 缓冲输出流 BufferedWriter BufferedOutputStream 主要是在缓冲流中能够採取读取一行方式。来操作源文件。
全部的操作都是一致的,都是通过构造方法的形式,传递字符或者字节流,比如BufferedReader(Reader r),来传递进去FileReader,通过String ReadLine()方法来读取文件的一行,当读到文件末尾的时候,将返回null值
<span style="font-family:SimSun;font-size:18px;">package com.IO; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; /*
* 字符输入流。BufferedReader,读取文本一行的功能
*/
public class BufferedReaderDemo { public static void main(String[] args) throws IOException { //建立字符输入流缓冲区对象,传递字符输入对象
BufferedReader bfr=new BufferedReader(new FileReader("c:\\1.txt")); //開始读取文本一行。返回string
String line=bfr.readLine();
System.out.println(line); } }
</span>其余的BufferedInputStream、BufferedOutPutStream、BufferedReader、BufferedWriter使用方法一致。參照上面写法就可以。
採用缓冲流实现文件复制的效果。
<span style="font-family:SimSun;font-size:18px;">package com.IO; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; import javax.management.RuntimeErrorException; /*
* 利用字符流缓冲区来赋值
* 读写行,写换行
*/
public class CopyTest2 {
public static void main(String[] args) {
// 匿名对象的形式。创建流对象和缓存去对象 BufferedReader bfr = null; BufferedWriter brw = null; try {
bfr = new BufferedReader(new FileReader("c:\\1.txt"));
brw = new BufferedWriter(new FileWriter("c:\\2.txt"));
// 读取一行,写一行,写换行
String line = null;
while ((line = bfr.readLine()) != null) {
brw.write(line);
//进行换行的功能
brw.newLine();
brw.flush();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("复制失败");
}finally{
try {
if(bfr!=null){
bfr.close();
}
} catch (IOException e2) {
throw new RuntimeException("写入关闭失败");
}finally{
try {
if(brw!=null){
brw.close();
}
} catch (IOException e3) {
throw new RuntimeException("读入关闭失败");
}
}
}
} }
</span>
4.转换流
Java中的转换流一般有两个各自是,OutPutStreamWriter、InputStreamReader。是字符流通向字节流的桥梁。
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVja3l6aG91c3Rhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
正如上图所看到的,通过缓冲流就能够把字节流转换成为字符流来处理,通过缓冲区一包装,就能够读取行的操作了。
<span style="font-family:SimSun;font-size:18px;">package com.IO; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; public class TranseDemo3 {
public static void main(String[] args) throws IOException {
/*//控制台输入的字节流
InputStream in=new FileInputStream("c:\\1.java");
//创建转换流对象,传递字节输入流
InputStreamReader isr=new InputStreamReader(in);
//既然已经将in转换成了字符流isr,能够使用字符流缓冲区对象BufferedReader,行读取
BufferedReader bfr=new BufferedReader(isr); OutputStream out=System.out;
OutputStreamWriter osw=new OutputStreamWriter(out);
BufferedWriter bfw=new BufferedWriter(osw);*/ BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter brw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while ((line=bfr.readLine())!=null) {
brw.write(line);
brw.flush();
brw.newLine();
} brw.close();
bfr.close(); }
}
</span>
Java学习笔记六(I/O流)的更多相关文章
- Java学习笔记之I/O流(读取压缩文件以及压缩文件)
		
1.读取压缩文件:ZipInputStream 借助ZipFile类的getInputStream方法得到压缩文件的指定项的内容,然后传递给InputStreamReader类的构造方法,返回给Buf ...
 - Java学习笔记43(打印流、IO流工具类简单介绍)
		
打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...
 - Java学习笔记42(序列化流)
		
对象中的数据,以流的形式,写入到文件中保存 过程称为写出对象,对象的序列化 ObjectOutputStream将对象写到文件中,实现序列化 在文件中,以流的形式,将对象读取出来, 读取对象,对象的反 ...
 - Java学习笔记40(缓冲流)
		
缓冲流: 在读写文件的各种流中,最令人烦恼的就是效率问题, 而缓冲流的目的就是提高读写效率 字节输出缓冲流: package demo; import java.io.BufferedOutputSt ...
 - Java学习笔记39(转换流)
		
转换流:字符流和字节流之间的桥梁 用于处理程序的编码问题 OutputStreamWriter类:字符转字节流 写文本文件: package demo; import java.io.FileOutp ...
 - Java学习笔记38(字符流)
		
字符输出流:Writer类:使用时候需要它的子类 局限性:只能写文本文件,无法写其他文件 方法: package demo; import java.io.FileWriter; import jav ...
 - Java学习笔记(7)---流(Stream),文件(File)
		
1.Stream流 a.定义: Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集 ...
 - java学习笔记六——数组
		
数组类型 数组是一种常见的数据结构,可用于存放多个数据,每一个数组元素存放一个数据,通常可以通过下标进行访问其元素. Java数组要求所有数组元素具有相同的数据类型.因此,数组元素的数据类型是唯一的. ...
 - Java 学习笔记 (六) Java 定义变量
		
这个问题来自于head first一书page68. package com.idea.study; public class Books { //headfirst page68 String ti ...
 
随机推荐
- js获取上传文件信息并及时查看
			
<form id="picForm" name="picForm" method="post" enctype="mult ...
 - MyISAM 和 InnoDB 讲解[转]
			
MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...
 - SuperSocket与Netty之实现protobuf协议,包括服务端和客户端
			
今天准备给大家介绍一个c#服务器框架(SuperSocket)和一个c#客户端框架(SuperSocket.ClientEngine).这两个框架的作者是园区里面的江大渔. 首先感谢他的无私开源贡献. ...
 - 目前最流行的网页自动运行EXE文件
			
大家对木马都不陌生了,它可能要算是计算机病毒史上最厉害的了,相信会使木马的人千千万万,但是有很多人苦于怎么把木马发给对方,现在随着计算机的普及,在网络上我相信很少有人会再轻易的接收对方的文件了,所以网 ...
 - bzoj2011: [Ceoi2010]Mp3 Player
			
Description Georg有个MP3 Player,没有任何操作T秒钟就会锁定,这时按下任意一个键就会变回没锁定的状态,但不会改变频道.只有在没锁定的状态下按键才有可能改变频道. MP3的频道 ...
 - iOS应用如何支持IPV6-b
			
果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6,以及应用中哪 ...
 - 移动端meta标签整理-备
			
分类 在介绍移动端特有 meta 标签之前,先简单说一下 HTML meta 标签的一些知识. meta 标签包含了 HTTP 标题信息 (http-equiv) 和 页面描述信息 (name). h ...
 - 转载:如何避免代码中的if嵌套
			
http://top.jobbole.com/4960/ http://stackoverflow.com/questions/24430504/how-to-avoid-if-chains 在Sta ...
 - bzoj 3751: [NOIP2014]解方程 同余系枚举
			
3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...
 - 【andorid】Attribute is missing the Android namespac
			
初学安卓,错误颇多 出现这个问题,是因为xml节点属性单词拼写错了,比如android我写成了adnorid,当然就错误了.