I/O流
来源:互联网 发布:wordpress 程序员主题 编辑:程序博客网 时间:2024/06/05 03:02
该文章简要介绍java I/O输入输出流的用法。
一、流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
二、流的数据的表现形式
数据的内部表示便于程序进行数据处理。典型的内部表示有:整型数的二进制表示、浮点数的IEEE表示、字符的ASCII或Unicode编码表示。
在输入输出流中在进行数据处理转换的时候,数据位可能会出现乱码,是由于编码后的字符长度不同,导致数据尾部填充出现乱码现象。
例:
输入:
输出:
三、IO流的分类
根据处理数据类型的不同分为:字符流和字节流。
根据数据流向不同分为:输入流和输出流。
(1)字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
(2)输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。输入流是将数据从文件读入当前程序中,输出流是将数据从当前程序中写入到文件中。
四、在JAVA中的IO流
字节流:InputStream/OutputStream
字符流:Reader/Writer
包装流:数据流、缓存流……
包装流,故名思义,目的是为了增强某种流的功能,如OutputStream,只负责输出字节,字节数组,关闭等简单的原始字节操作。为了使其在输出过程中具备更多的功能,如可以输出数字,布尔值,整数,小数,对象,UTF字符串等,则可以使用DataOutputStream完成各种数据的输出转换,并且将转换后的数据传递给被包装得原始OutputStream流,如FileOutputStream
包装流有个特点,必须有原始的具体的IO对象,不等独立使用,如ObjectOutputStream,ObjectIputStream,都必须要有具体的输出流对象FileOutputStream,SockeObjectOutputStream,因为包装流本省不能真正完成输入或者输出过程,必须使用可以完成输入、输出流对象作为动作的真正执行者,包装流不过简化了调用者在输入、输出过程中的一些数据处理和特殊要求。
五、IO流的一些基本函数
java.io.InputStream:
1)available()返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
2)close()关闭此输入流并释放与该流关联的所有系统资源。
3)read()从输入流中读取数据字节。
注:如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
java.io.OutputStream:
1)close()关闭此输出流并释放与该流关联的所有系统资源。
2) flush()刷新此输出流并强制写出所有缓冲的输出字节。
注:在关闭流之前需刷新流。
3) write()将指定的字节写入此输出流。
六、实例应用
下为文件查找器的部分代码:
else if(type.equals("输出")){
if(list.getSelectedValue()==null){
}
else if(list.getSelectedValue().trim().toLowerCase().endsWith(".txt")){
InputStreamReader inr = null;
try {
InputStream in = new FileInputStream(new File(list.getSelectedValue()));
inr = newInputStreamReader(in);
try {
int len =in.available();
char[]c =new char[len];
inr.read(c);
System.out.println(c);
} catch (IOException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
} catch (FileNotFoundException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
if(inr!=null){
try {
inr.close();
} catch (IOException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
}
}
}
else if(type.equals("增加")){
if(list.getSelectedValue()==null){
}
else if(list.getSelectedValue().trim().toLowerCase().endsWith(".txt")){
OutputStreamWriter osw = null;
OutputStream out;
try {
if(type.equals("增加")){
out = new FileOutputStream(new File(list.getSelectedValue()),true);
osw = new OutputStreamWriter(out);
String str1 = JOptionPane.showInputDialog(null,"请输入所需增加的内容");
try {
osw.write(str1);
osw.flush();
} catch (IOException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
}
} catch (FileNotFoundException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
if(osw!=null){
try {
osw.close();
} catch (IOException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
}
}
}
else if(type.equals("复制")){
if(list.getSelectedValue()==null){
}
else if(list.getSelectedValue().trim().toLowerCase().endsWith(".txt")){
FileInputStream in = null;
FileOutputStream out = null;
FileChannel fin = null;
FileChannel fout = null;
try {
in = new FileInputStream(new File(list.getSelectedValue()));
JFileChooser fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//只选择目录
int returnVal = fc.showOpenDialog(null);
String path1 = null;
if(returnVal == JFileChooser.APPROVE_OPTION) {
path1 =fc.getSelectedFile().getAbsolutePath();
}
String str1 = JOptionPane.showInputDialog(null,"请输入所需创建文件名");
path1+="\\";
path1+=str1;
path1+=".txt";
out = new FileOutputStream(new File(path1));
fin = in.getChannel();
fout = out.getChannel();
try {
fin.transferTo(0, fin.size(), fout);
} catch (IOException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}//链接两个通道,并且从in通道读取,然后写入out通道
} catch (FileNotFoundException e1) {
// TODO Auto-generatedcatch block
e1.printStackTrace();
}
}
在文件复制的时候,用文件通道(FileChannel)来实现文件复制将比老方法快了近三分之一。在复制大文件的时候更加体现出FileChannel的速度优势。而且FileChannel是多并发线程安全的。
- I/O 流
- java I/O流
- c++I/O流
- I/O流
- java I/O流
- java I/O流
- 文件I/O流
- Java I/O流
- I/O 流分类
- I/O流
- I/O流操作
- C++ I/O流
- Day18 I/O流
- JAVA--I/O流
- java I/O流
- C++ I/O流
- I/O流
- 16、I/O流
- MBProgressHUD的提示很快就消失了
- App启动页--实现二
- ViewDragHelper
- OpenGL系列教程之八:OpenGL顶点缓冲区对象(VBO)
- codevs3729: [NOIP2014]飞扬的小鸟
- I/O流
- Go语言基础学习一:对go的感性初步认识
- DAY57_LastModified
- Google Java编程风格指南
- 207. Course Schedule 难度:medium 类别:图
- fd_set 用法
- C语言基础学习运算符-逻辑运算符
- Eclipse安装JD-Eclipse反编译插件
- 江西SEO:软文推广需要掌握的几大技巧