作者:卿笃军

原文地址:http://blog.csdn.net/qingdujun/article/details/41154807

本文简绍解说了FileWriter、FileReader、BufferWriter、BufferReader、LineNumReader、FileOutputStream、FileInputStream、BufferInputStream、BufferOutputStream等流操作技术。

——————————————————————————————————————————————————————

1、明白“源”和“目的”:

字节流              字符流

源(输入流):InputStream()、 Reader();

目的(输出):OutputStream()、Reader()。

2、明白数据是否“纯文本”:

是:字符流;

否:字节流。

3、明白详细使用对象:

源设备:内存、硬盘、键盘。

目的   : 内存、硬盘、控制台。

——————————————————————————————————————————————————————

1、写文件FileWriter

flush()和close()的差别:

1)flush()刷新流后,将数据写入文件里,流还能够使用;

2)close()关闭流之前。会自己主动调用flush()刷新流。

关闭后。流不能再次使用。

package io.dol.sn;

import java.io.FileWriter;
import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) throws IOException { //创建对象,就一定要明白被操作的文件。 假设该文件夹下已有同名文件,该文件将被覆盖。
FileWriter fWriter = new FileWriter("demo.txt");
//写入流中,并非直接写在demo.txt里面
fWriter.write("I's Dolphin");
//刷新流中数据
//fWriter.flush();
fWriter.close();//关闭之前会刷新一次缓冲流
//flush刷新后,流能够继续用
//close之后,流被关闭
}
}

2、对写文件操作加入异常捕捉try:

1)FileWriter()、write()、close()都会产生抛出;

2)我们将close()放在finally里面进行处理;

3)那么。须要将fWriter变量定义在外面,同一时候须要再又一次try一次close()。

4)注意,如果创建文件失败,则fWriter=null; 此时进入finally调用close()。异常。

所以须要判null。

5)注意,换行须要用“\r\n”实现。

package io.dol.sn;

import java.io.FileWriter;
import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) {
//须要将申明写在外面。否则finally中会出现变量没有定义
FileWriter fWriter = null;
try
{
fWriter = new FileWriter("demo.txt");
//注意换行须要用“\r\n”来实现
fWriter.write("I'm Dolphin.\r\n我叫海豚.");
}
catch (IOException e) {
System.out.println("文件创建失败");
}
finally{
try {//注意:close()要单独try
//同一时候要对流是否为空进行推断
if (fWriter != null)
fWriter.close();
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

3、读文件FileReader

read()函数,每次读取一个字符。返回值为int。

package io.dol.sn;

import java.io.FileReader;
import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) { FileReader fReader = null;
try
{
fReader = new FileReader("demo.txt");
//read()一次读一个字符,且自己主动往后移动
int ch = fReader.read();
//System.out.println(ch);
System.out.println((char)ch);
}
catch (IOException e) {
System.out.println("文件读取失败");
}
finally{
try {
if (fReader != null)
fReader.close();
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

改进后1,用个while()循环,每次读取一个字符直到将文件所有读取完成。

package io.dol.sn;

import java.io.FileReader;
import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) { FileReader fReader = null;
try
{
fReader = new FileReader("demo.txt");
int ch = 0;
//read()一次读一个字符。且自己主动往后移动
while ((ch = fReader.read()) != -1)
{
//System.out.println(ch);
System.out.print((char)ch);
}
}
catch (IOException e) {
System.out.println("文件读取失败");
}
finally{
try {
if (fReader != null)
fReader.close();
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

改进后2,每次读取一块数据直到将文件读完。

这里注意一下。int read(char [])返回值为成功读取到的数据。

package io.dol.sn;

import java.io.FileReader;
import java.io.IOException; public class FileReaderDemo { public static void main(String[] args) { FileReader fReader = null;
try
{
fReader = new FileReader("demo.txt");
//注意,这里随便开辟3个空间,一般开辟为2的整数倍。如1024
char buf[] = new char[3];
int n = 0;
//int read(char[])返回值为读取成功的个数
while ((n=fReader.read(buf)) != -1)
{
System.out.print(new String(buf,0,n));
}
}
catch (IOException e) {
System.out.println("文件读取失败");
}
finally{
try {
if (fReader != null)
fReader.close();
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

4、文件缓冲区之写文件操作BufferedWriter

1)缓冲区的出现,是为了提高流的操作效率;

2)所以,创建缓冲区之前,必须有流;

3)缓冲区提供了一个跨平台是方法:newLine()  这里不做过多说明。

package io.dol.sn;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; //缓冲区的出现。是为了提高流的操作效率;
//所以。创建缓冲区之前。必须有流。
public class BufferWriterDemo { public static void main(String[] args) { BufferedWriter bfBufferedWriter = null;
FileWriter fWriter = null;
try
{
//创建一个文件
fWriter = new FileWriter("demo.txt");
//将数据流关联上缓冲区,以后都是直接对缓冲区操作
bfBufferedWriter = new BufferedWriter(fWriter);
bfBufferedWriter.write("I'm Dolphin.\r\n我叫海豚.");
}
catch (IOException e) {
System.out.println("文件创建失败");
}
finally{
try {
if (bfBufferedWriter != null)
{
//凡是牵涉到缓冲区的都须要刷新数据
bfBufferedWriter.flush();
//这里关闭缓冲区。事实上就相当于是关闭了数据流
bfBufferedWriter.close();
//fWriter.close() 就不须要调用了
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

5、文件缓冲区之读文件操作BufferedReader

注意:这里的readLine()方法,仅仅返回回车前的内容。并不返回回车符;所以,读取多行的时候。会出现不换行情况。

package io.dol.sn;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; public class BufferReaderDemo { public static void main(String[] args) { BufferedReader bfBufferedReader = null;
FileReader fReader = null;
try
{
//打开一个文件
fReader = new FileReader("demo.txt");
//将数据流关联上缓冲区,以后都是直接对缓冲区操作
bfBufferedReader = new BufferedReader(fReader);
//String readLine()这种方法非常牛。一次从文本读取一行数据
String buf = bfBufferedReader.readLine();
System.out.println(buf);
}
catch (IOException e) {
System.out.println("文件创建失败");
}
finally{
try {
if (bfBufferedReader != null)
{
bfBufferedReader.close();
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

改进后,每次读取一行,循环读取,实现读取文件里的全部数据.

package io.dol.sn;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; public class BufferReaderDemo { public static void main(String[] args) { BufferedReader bfBufferedReader = null;
FileReader fReader = null;
try
{
fReader = new FileReader("demo.txt");
bfBufferedReader = new BufferedReader(fReader);
//String readLine()读取到文件末尾返回值为null
String buf = null;
while ((buf=bfBufferedReader.readLine()) != null)
System.out.println(buf);
}
catch (IOException e) {
System.out.println("文件创建失败");
}
finally{
try {
if (bfBufferedReader != null)
{
bfBufferedReader.close();
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

6、跟踪行号缓冲字符输入流LineNumberReader

此类定义了方法getLineNumber(int)和getLineNumber()用于设置行号和获取行号;

package io.dol.sn;

import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader; public class LineNumberReaderDemo { public static void main(String[] args) { LineNumberReader lnReader = null;
FileReader fReader = null;
try
{
fReader = new FileReader("demo.txt");
lnReader = new LineNumberReader(fReader); String buf = null;
//行号默认是从0開始。我们设置从100開始
lnReader.setLineNumber(100);
while ((buf=lnReader.readLine()) != null)
System.out.println(lnReader.getLineNumber()+":"+buf);
}
catch (IOException e) {
System.out.println("文件创建失败");
}
finally{
try {
if (lnReader != null)
{
lnReader.close();
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

7、字节流操作之写文件FileOutputStream

当我们须要对图片视频等数据进行操作的时候,就须要用到字节流。

package io.dol.sn;

import java.io.FileOutputStream;
import java.io.IOException; //图片数据就须要用到字节流
public class FileOutputStreamDemo { public static void main(String[] args) { FileOutputStream fos = null;
try
{
fos = new FileOutputStream("demo.txt");
//直接对字节流进行操作是不须要刷新的
fos.write("abcde".getBytes());
}
catch (IOException e)
{
System.out.println("文件创建失败");
}
finally
{
try {
if (fos != null)
{
fos.close();
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

8、字节流操作之读文件FileInputStream

推荐用该方法读取数据,后面我讲到的那种方法不推荐;

package io.dol.sn;

import java.io.FileInputStream;
import java.io.IOException; public class FileInputStreamDemo { public static void main(String[] args) { FileInputStream fis = null;
try
{
fis = new FileInputStream("demo.txt");
byte[] buf = new byte[1024];
int len = 0;
while ((len=fis.read(buf)) != -1)
{
System.out.println(new String(buf,0,len));
}
}
catch (IOException e)
{
System.out.println("文件创建失败");
}
finally
{
try {
if (fis != null)
{
fis.close();
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

补充一种另外的方法,不推荐使用该方法读取数据。

package io.dol.sn;

import java.io.FileInputStream;
import java.io.IOException; public class FileInputStreamDemo { public static void main(String[] args) { FileInputStream fis = null;
try
{
fis = new FileInputStream("demo.txt");
//获得文件大小
int num = fis.available();
//定义一个刚刚好的数组大小。这样下面就不用再for循环读取了。
//可是怎样这种话,一个电影1G大小,难道我们开辟一个这么大的数组?!
byte[] buf = new byte[num];
int len = 0;
while ((len=fis.read(buf)) != -1)
{
System.out.println(new String(buf,0,len));
}
}
catch (IOException e)
{
System.out.println("文件创建失败");
}
finally
{
try {
if (fis != null)
{
fis.close();
}
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

9、使用字节流实现对文件进行拷贝操作BufferInputStream、BufferOutputStream

1)创建两个流(输入流,输出流);

2)与缓冲区建立关联;(这里仅仅是为了加快拷贝速度,该步骤可省略)。

3)開始拷贝。

以下展示一个mp3拷贝样例:

package io.dol.sn;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; //加入缓冲区对字节流进行操作,将1.mp3拷贝为2.mp3
public class BufferIOputStreamDemo { public static void main(String[] args) { BufferedInputStream bfi = null;
BufferedOutputStream bfo = null; try
{
//将两个字节流与缓冲流建立关联
bfi = new BufferedInputStream(new FileInputStream("D:\\1.mp3"));
bfo = new BufferedOutputStream(new FileOutputStream("D:\\2.mp3")); int byteNum = 0;
//先把硬盘数据弄进缓冲区,read()方法是从缓冲区里取数据
while ((byteNum=bfi.read()) != -1)
{
bfo.write(byteNum);
}
}
catch (IOException e)
{
System.out.println("文件创建失败");
}
finally
{
try {
if (bfi != null)
bfi.close();
if (bfo != null)
bfo.close();
} catch (IOException e2) {
System.out.println("文件关闭失败");
}
}
}
}

原文地址:http://blog.csdn.net/qingdujun/article/details/41154807

參考文献:Java视频,毕向东主讲。

Java I/O操作汇总的更多相关文章

  1. Java IO流操作汇总: inputStream 和 outputStream【转】

    我们在进行Android java 开发的时候,经常会遇到各种IO流操作.IO流操作一般分为两类:字符流和字节流.以“Reader”结尾都是字符流,操作的都是字符型的数据:以“Stream”结尾的都是 ...

  2. 全面吃透JAVA Stream流操作,让代码更加的优雅

    全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...

  3. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  4. Java的JDBC操作

    Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...

  5. Java读写文本文件操作

    package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...

  6. 第26章 java进制操作

    java进制操作 1.二进制 二进制只有0和1,逢二进一 二进制多用在计算机中,来自计算机硬件的开关闭合 2.位运算 分别讲解: 2.1.按位与 & 两位全为1,结果才为1 0&0=0 ...

  7. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  8. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  9. Java的大数操作分为BigInteger和BigDecimal

    Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: 1 pack ...

随机推荐

  1. ECNU 2018 10月月赛 E 盖房子 (bitset + 倍增)

    题目链接  ECNU Monthly 2018.10 Problem E 从开场写到结束…… 显然要把三角形分成上下两部分. 把每一部分分成三部分,以上部分为例. 上面和右边,以及左下角的正方形. 也 ...

  2. Linux命令之chmod

    chmod [选项] … MODE[,MODE] … FILE … chmod [选项] … OCTAL-MODE FILE … chmod [选项] … --reference=RFILE FILE ...

  3. CentOS7系统防火墙开关、状态与自启

    首先需要说明的是CentOS7使用的是firewalld.service,而不是iptables.service [xf@xuexi ~]$ systemctl status firewalld.se ...

  4. 【推导】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) B. Arpa and an exam about geometry

    题意:给你平面上3个不同的点A,B,C,问你能否通过找到一个旋转中心,使得平面绕该点旋转任意角度后,A到原先B的位置,B到原先C的位置. 只要A,B,C构成等腰三角形,且B为上顶点.那么其外接圆圆心即 ...

  5. 【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles

    平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...

  6. 【最小乘积生成树】bzoj2395[Balkan 2011]Timeismoney

    设每个点有x,y两个权值,求一棵生成树,使得sigma(x[i])*sigma(y[i])最小. 设每棵生成树为坐标系上的一个点,sigma(x[i])为横坐标,sigma(y[i])为纵坐标.则问题 ...

  7. [JZOJ3484]密码

    题目大意: 给你一个很长的字符串a(|a|<=300000),一个比较短的字符串b(|b|<=200),请你搞一些破坏. 你可以从a的两边去掉一些字符使得b仍是a的一个字串,问有多少种方案 ...

  8. python函数式编程之匿名函数、装饰器、偏函数

    匿名函数 当我们在传入函数时,有些时候,不需要显式的定义函数,直接传入匿名函数就行.如下面 lambda x: x*x 在python中,关键字lambda表示匿名函数,冒号前面的x表示函数参数 匿名 ...

  9. [典型漏洞分享]YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

    YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述: YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口 ...

  10. Unicode中的BOM

    BOM简述 BOM是byte order mark的缩写,在UTF-16和UTF-32中需要使用BOM来区分字节的顺序,因为我们目前的CPU有两种系列,一种是大端模式,一种是小端模式(我们常用的电脑手 ...