java 输入输出流详解及分类
字节流与字符流的详解,文件流,数据流
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 输入输出流详解及分类相关推荐
- Java输入输出流详解
1 什么是IO? 1 Java的IO机制有流IO和块IO两种,核心库 java.io是大多数面向数据流的IO类的主要软件包:核心库 java.nio中采用的便是块IO.流IO的好处是简单易用,缺点是效 ...
- java的 I/O 输入输出流详解
I/O 输入输出流 流的定义: 流就是程序和设备之间嫁接起来的一根用于数据传输的管道,这个管道上有很多按钮,不同的按钮可以实现不同的功能. 这根用于数据传输的管道就是流,流就是一根管道 流一定是类,但 ...
- Java实现文件写入——IO流(输入输出流详解)
输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据.流是一组有序的数据序列,根据操作的类型,分为输入流和输出流. 程序从输入流读取数据,向输出流写入数据. ...
- python输入输出流详解_输入输出流的概念
Java中的文件复制相较Python而言,涉及到输入输出流的概念,实现中会调用很多对象,复杂很多,在此以文件复制进行简单总结. 这里是一个简单的处理代码: import java.io.*; publ ...
- python输入输出流详解_Python 初体验之 输入输出流
任何一个语言都有他的输入输出,对于文件的操作是非常有用的.在Java中曾经有对象序列化这么一个概念,在 Python中同样可以对对象进行序列化然后存放到文件中去,同时还能从文件中再读取出来,估计也可以 ...
- java输入hello_详解JAVA输出Hello World
想必大家对这一段JAVA代码一定不会陌生: public classTest {public static voidmain(String[] args) { System.out.println(& ...
- Java输入/输出流体系中常用的流分类
java输入/输出流体系中常用的流分类 分类 字节输入流 字节输出流 字符输入流 字符输出流 抽象基类 InputStream OutputStream Reader Writer 访问文件 File ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- java IO编程详解
java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...
最新文章
- Squid处理web数据请求
- 叉乘点乘混合运算公式_期末复习|人教版二年级上册数学概念和公式总结
- php连接mysql并读取数据
- Hadoop入门(二十)Mapreduce的最小值程序
- JAVA确定这天是这年的某一天_[Java] 练习题014: 输入某年某月某日,判断这一天是这一年的第几天?...
- oracle服务端安装和下载,oracle 11g 服务端下载地址及安装说明
- 机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)
- C语言编程序编数独,求用C语言编一个解九宫格数独的程序怎么办? 爱问知识人...
- Java并发包JUC的Lock锁讲解
- OCA读书笔记(11) - 实现Oracle数据库审计
- 休闲娱乐的计算机配置,入门APU主机配置 1199元双核APU家用娱乐电脑配置推荐
- 批量删除redis key
- 关于IDM下载器免费注册这件事
- 以后睡觉还是关上手机吧!
- 含echarts图表の网页打印
- java+svm多分类器_svm多分类的java源码
- AD19——双面PCB快速铺铜
- 关于Unity通过webgl打包中文消失问题
- AccountManager 数据库存储位置
- DuerOS智能设备激活数破亿!百度补贴上亿造节再添一把火