字节流与字符流的详解,文件流,数据流

2017年04月29日 19:54:47

阅读数:1294

首先看一下File类的常用方法

•File类的对象不但可以表示文件,还可以表示目录,在程序中一个File类对象可以代表一个文件或目录;

•当创建一个文件对象后,就可以利用它来对文件或目录的属性进行操作,如:文件名、最后修改日期、文件大小等等;

需要注意的是,File对象并不能直接对文件进行读/写操作,只能查看文件的属性;

方 法 原 型

说    明

boolean exists()

判断文件是否存在,存在返回true,否则返回false

boolean isFile()

判断是否为文件,是文件返回true,否则返回false

boolean isDirectory()

判断是否为目录,是目录返回true,否则返回false

String getName()

获得文件的名称

String getAbsolutePath()

获得文件的绝对路径

long length()

获得文件的长度(字节数)

boolean createNewFile()

throws IOException

创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉

boolean delete()

删除文件,删除成功返回true,否则返回false

File[] listFiles()

返回文件夹内的子文件与子文件夹的数组

File类示例

package file;

import java.io.File;

public class FileDemo {

public static void main(String[] args) {
File file = new File("test.txt");
System.out.println("文件或目录是否存在:"+file.exists());
System.out.println("是文件吗:"+file.isFile());
System.out.println("是目录吗:"+file.isDirectory());
System.out.println("名称:"+file.getName());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件大小:"+file.length());
System.out.println("获取自由空间的大小"+file.getFreeSpace());
System.out.println("有文件夹吗"+file.mkdirs());
System.out.println("有父文件吗"+file.getParentFile());
System.out.println("可以写吗"+file.canWrite());
System.out.println("是可执行文件吗"+file.setExecutable(false));
}

}

•根据流动方同,流分为输入流向的不和输出流;

•对于输入和输出流,由于传输格式的不同,又分为字节流和字符流:

–字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类;

–字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。

•FileInputStream类称为文件输入流,继承于InputStream类,是进行文件读操作的最基本类;

•它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件;

•由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。

•FileInputStream类和FileOutputStream类是成对出现的,一个进行输入(读文件)操作,一个进行输出(写文件)操作;

•由于采用字节方式进行数据传输,不必考虑数据的格式问题,这两个类对文件操作的效率较高;

•可以使用这两个类完成复制文件的操作。

复制文件示例

publicclass CopyFileDemo {

public static void main(String[] args)throws IOException {

File srcFile =new File("src.dat");    //源文件对象

File destFile =new File("dest.dat");  //目标文件对象

if (!(destFile.exists())){  //判断目标文件是否存在

destFile.createNewFile();  //如果不存在则创建新文件

}

//使用源文件对象创建文件输入流对象

FileInputStreamfis =new FileInputStream(srcFile);

//使用目标文件对象创建文件输出流对象

FileOutputStreamfos =new FileOutputStream(destFile);

byte[] buf =new byte[1024];  //创建字节数组,作为临时缓冲

System.out.println("开始复制文件...");

while (fis.read(buf) !=-1) {  //循环从文件输入流中读取数据

fos.write(buf);    //写入到文件输出流中

}

System.out.println("文件复制成功!");

fis.close();    //关闭流

fos.close();

}

}

***************************************************************************************下面来看字符流***************************************************************************

•FileInputStream类和FileOutputStream类虽然可以高效率地读/写文件,但对于Unicode编码的文件,使用它们有可能出现乱码;
•考虑到Java是跨平台的语言,要经常操作Unicode编码的文件,使用字符流操作文件是有必要的;
•使用字符流将涉及到以下4个类:
–FileReader类和FileWriter类;
BufferedReader类和BufferedWriter类

FileReader类称为文件读取流,允许以字符流的形式对文件进行读操作
•该类将从文件中逐个地读取字符,效率比较低下,因此一般将该类对象包装到缓冲流中进行操作。BufferedReader类主要为字符流提供缓冲

FileReader配合BufferedReader读文件

public class RraderDemo

{

public static voidmain(String[] args)throws IOException

{

File file =new File("test.txt");

//通过文件对象创建文件读取流对象

FileReaderfr =new FileReader(file);

//将文件读取流包装成缓冲读取流

BufferedReaderbr =new BufferedReader(fr);

String str;

while ((str = br.readLine())!= null)  //逐行读取数据

{

System.out.println(str);

}

br.close();   //关闭流

fr.close();   //关闭流

}

}

FileWriter类称为文件写入流,以字符流的形式对文件进行写操作
与FileReader类相似,FileWriter类同样需要使用缓冲流进行包装
FileWriter配合BufferedWriter写文件示例

public class WriterDemo

{

public static voidmain(String[] args)throws IOException

{

File file =new File("test.txt");

//通过文件对象创建文件输出字符流对象

FileWriterfw =new FileWriter(file);

//将文件输出字符流包装成缓冲流

BufferedWriterbw =new BufferedWriter(fw);

bw.write("大家好!");

bw.write("我正在学习Java。");

bw.newLine();    //换个新行

bw.write("请多多指教。");

bw.newLine();    //换新行

bw.write("Luckybug@21cn.com");

bw.close();      //关闭流

fw.close();      //关闭流

}

}

从控制台接受输入

•System.in的read方法可以从控制台接受输入;
•但由于in实际上是一个InputStream类的对象,它只能以字节形式接收数据,并且一次只能接受一个字节,这使输入操作很不便;
•必须将System.in进行处理,才可以顺利地从控制台接受输入,这将使用到:
–InputStreamReader类
–BufferedReader类

InputStreamReader类用于将InputStream类型的字节输入流对象转换成Reader类型的字符读取流对象;

•可以使用它来转换System.in,如:

InputStreamReaderisr =new InputStreamReader(System.in);

•这样的字符流效率很低,再使用BufferedReader类来为其建立缓冲,如:

BufferedReaderbr =new BufferedReader(isr);

•这样,就可以从控制台接受输入了。

从控制台接受输入示例

publicclass ConsoleInputDemo

{

public static void main(String[] args)throws IOException

{

//将System.in转化成字符流对象

InputStreamReaderisr =new InputStreamReader(System.in);

//用缓冲流进行包装

BufferedReaderbr =new BufferedReader(isr);

System.out.println("请输入您的姓名:");

String name = br.readLine();  //接受输入

System.out.println("请输入您的年龄:");

int age= Integer.parseInt(br.readLine());  //接受输入

System.out.println("您的姓名:"+ name);

System.out.println("您的年龄:"+ age);

br.close();   //关闭流

isr.close();  //关闭流

}

}

从控制台输入并写入到文件示例

/*本例从控制台接受输入,然后写入到文件中,直到用户输入"!!!"为止*/

File file =new File("input.txt");   //创建文件对象

if (!file.exists())                  //判断该文件是否存在,如果不存在则创建新文件

{

file.createNewFile();

}

FileWriterfr =new FileWriter(file);   //针对文件对象创建文件写入流对象

BufferedWriterbw =new BufferedWriter(fr);   //为文件写入流建立缓冲流

//将控制台输入对象转化成字符流,并建立缓冲流

BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));

String str = bin.readLine();    //接受从控制台输入的一行字符串

while (!(str.equals("!!!")))    //如果输入"!!!"则代表输入结束

{

bw.write(str);              //将从控制台输入的字符串写入到文件中

bw.newLine();               //换新行

str = bin.readLine();       //再从控制台接受输入

}

//关闭所有已经打开的流

bw.close();

fr.close();

bin.close();

基本数据类型的读/写

•FileInputStream和FileOutputStream在读写文件时不考虑数据的类型;
•FileWriter和FileReader在读写文件时,将所有的数据都看做字符;
但有时候,我们需要将各种类型的数据写入文件或是从文件中读取,DataInputStream类和DataOutputStream类可以满足需要

DataInputStream类

•DataInputStream类可以输入任何类型的数据,但它不可以单独使用,需要要配合其它字节输入流一起使用;

//将文件输入流包装成数据输入流,以便从文件中读取各种类型的数据
  FileInputStream fis = newFileInputStream("data.dat");
  DataInputStreamdis = new DataInputStream(fis);

DataInputStream类的常用方法

方 法 原 型

说    明

final boolean readBoolean()

throws IOException

从数据输入流中读取一个boolean型数据

final char readChar()

throws IOException

从数据输入流中读取一个char型数据

final int readInt()

throws IOException

从数据输入流中读取一个int型数据

final long readLong()

throws IOException

从数据输入流中读取一个long型数据

final float readFloat()

throws IOException

从数据输入流中读取一个float型数据

final double readDouble()

throws IOException

从数据输入流中读取一个double型数据

•DataOutputStream类可以输出任何类型的数据,同样也需要配合其他字节输出流一起使用;
//将文件输出流包装成数据输出流,以便往文件中写入各种类型的数据
  FileOutputStreamfos = new FileOutputStream("data.dat");
  DataOutputStream dos = new DataOutputStream(fos);

DataOutputStream类的常用方法

方 法 原 型

说    明

final void writeBoolean(boolean v)

throws IOException

往数据输出流中写入一个boolean型数据

final void writeChar(char v)

throws IOException

往数据输出流中写入一个char型数据

final void writeInt(int v)

throws IOException

往数据输出流中写入一个int型数据

final void writeLong(long v)

throws IOException

往数据输出流中写入一个long型数据

final void writeFloat(float v)

throws IOException

往数据输出流中写入一个float型数据

final void writeDouble(double v)

throws IOException

往数据输出流中写入一个double型数据

总结:

•java.io包是Java内置的包,其中包含一系列对输入/输出进行操作的类;
•File类的对象可以访问文件(或目录)的属性,但不可以进行读/写操作;
•从方向上讲,流分为输入流和输出流,但从格式上区分的话,流分为字节流和字符流
•使用FileInputStream类和FileOutputStream类以字节流方式对文件进行读/写操作,这是操作文件最基本的两个类;

•FileReader类和FileWriter类配合BufferedReader类和BufferedWriter类可以以字符流方式对文件进行读/写操作;
•从控制台接受输入要使用到InputStreamReader类和BufferedReader类;
•DataInputStream类和DataOutputStream类允许读/写各种基本数据类型;

但前提是写进去的数据类型和读出来的数据类型相对应
绝大部分的IO操作都可能抛出IOException

java 输入输出流详解及分类相关推荐

  1. Java输入输出流详解

    1 什么是IO? 1 Java的IO机制有流IO和块IO两种,核心库 java.io是大多数面向数据流的IO类的主要软件包:核心库 java.nio中采用的便是块IO.流IO的好处是简单易用,缺点是效 ...

  2. java的 I/O 输入输出流详解

    I/O 输入输出流 流的定义: 流就是程序和设备之间嫁接起来的一根用于数据传输的管道,这个管道上有很多按钮,不同的按钮可以实现不同的功能. 这根用于数据传输的管道就是流,流就是一根管道 流一定是类,但 ...

  3. Java实现文件写入——IO流(输入输出流详解)

    输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据.流是一组有序的数据序列,根据操作的类型,分为输入流和输出流. 程序从输入流读取数据,向输出流写入数据. ...

  4. python输入输出流详解_输入输出流的概念

    Java中的文件复制相较Python而言,涉及到输入输出流的概念,实现中会调用很多对象,复杂很多,在此以文件复制进行简单总结. 这里是一个简单的处理代码: import java.io.*; publ ...

  5. python输入输出流详解_Python 初体验之 输入输出流

    任何一个语言都有他的输入输出,对于文件的操作是非常有用的.在Java中曾经有对象序列化这么一个概念,在 Python中同样可以对对象进行序列化然后存放到文件中去,同时还能从文件中再读取出来,估计也可以 ...

  6. java输入hello_详解JAVA输出Hello World

    想必大家对这一段JAVA代码一定不会陌生: public classTest {public static voidmain(String[] args) { System.out.println(& ...

  7. Java输入/输出流体系中常用的流分类

    java输入/输出流体系中常用的流分类 分类 字节输入流 字节输出流 字符输入流 字符输出流 抽象基类 InputStream OutputStream Reader Writer 访问文件 File ...

  8. Java注解(Annotation)详解

    转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...

  9. java IO编程详解

    java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...

最新文章

  1. Squid处理web数据请求
  2. 叉乘点乘混合运算公式_期末复习|人教版二年级上册数学概念和公式总结
  3. php连接mysql并读取数据
  4. Hadoop入门(二十)Mapreduce的最小值程序
  5. JAVA确定这天是这年的某一天_[Java] 练习题014: 输入某年某月某日,判断这一天是这一年的第几天?...
  6. oracle服务端安装和下载,oracle 11g 服务端下载地址及安装说明
  7. 机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)
  8. C语言编程序编数独,求用C语言编一个解九宫格数独的程序怎么办? 爱问知识人...
  9. Java并发包JUC的Lock锁讲解
  10. OCA读书笔记(11) - 实现Oracle数据库审计
  11. 休闲娱乐的计算机配置,入门APU主机配置 1199元双核APU家用娱乐电脑配置推荐
  12. 批量删除redis key
  13. 关于IDM下载器免费注册这件事
  14. 以后睡觉还是关上手机吧!
  15. 含echarts图表の网页打印
  16. java+svm多分类器_svm多分类的java源码
  17. AD19——双面PCB快速铺铜
  18. 关于Unity通过webgl打包中文消失问题
  19. AccountManager 数据库存储位置
  20. DuerOS智能设备激活数破亿!百度补贴上亿造节再添一把火

热门文章

  1. 俄罗斯总统拒赦前首富 须承认犯有欺诈逃税罪4z
  2. 新手用Python通过Pygame一步步实现贪吃蛇
  3. 记一次goroutine泄漏的问题
  4. SSLOJ1624 小萨的烦恼
  5. QQ号码在线状态代码
  6. html css3 3d翻转,一款基于css3的散子3D翻转特效
  7. 不懂copy与deepcopy的区别?这一篇就够了
  8. 2019-9-19【Javase】String字符串、装箱和拆箱、日期类、正则
  9. iis服务器 关闭自动启动,设置IIS服务器定时自动重启的方法
  10. bug生命周期你们公司是如何管理bug的