之前一直都没有怎么仔细学习过Java的io操作,都是半推半就的使用着,最近想学习一下网络编程,发现里面对于io的操作还是涉及较多的,于是乎学习了一下Java的io类。这篇文章简单介绍一下Java的io类。
1、什么是io? 什么是流?
io: 是input/output的缩写,意思是输入与输出。
流:流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。(来源于百度百科)
流的分类:
- 对于传输方向,分为输入流与输出流
- 对于传输的数据的单位,分为字节流与字符流(所有文件都可以以字节流的方式读取,至于打印输出能否得到想要的结果就不一定了)
对于一个流是输入流还是输出流,需要站在
内存
的角度来看待。
1、 input(输入流):从硬盘中读取文件将数据加载到内存中。
2、output(输出流):从内存中将数据写入到硬盘形成文件。
java.io包下有两个关于表示字节流的所有类的超类:
InputStream OutputStream
,与字节流相关操作的类都是基于这两个超类。
先介绍关于文件操作的字节流类:
FileInputStream FileOutputStream
,在 JDK API 1.6中文版帮助手册(文章结尾给出链接地址下载) 可以查找到信息如图:
红色区域是我们主要使用的方法,
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定,
简单来说参数就是传入一个文件的绝对路径
int read() 从此输入流中读取一个数据字节。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
不带参数的read方法,一次只读取文件的一个字节,
传入一个byte[] b
数组的read方法,一次读取b.length
个字节,并将数据存储到b数组
中
注意:
当一个文件被读取到最后时,返回的就是-1,而不是文件内容
FileInputStreamDemo.java
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {//文件输入流demo
public static void main(String[] args) throws IOException {
//前提你的d盘下有一个a.txt文件
FileInputStream fis = new FileInputStream("d:\\a.txt");
//1.读取单个字节
/*System.out.println("一次一个字节读取");
int data = 0;
while((data = fis.read) !=-1){
System.out.println((char) data);
}
fis.close();//使用完记住释放资源*/
//2. 用一个byte[] 数组作为缓冲区
byte[] bytes = new byte[1024];//大小可自行设置,此处设置为1KB
int count = 0;//字节流读取到的数据个数
while((count = fis.read(bytes)) != -1){
System.out.print(new String(bytes,0,count));
}
fis.close();
}
}
FileOutputStreamDemo.java
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {//文件输出流demo
public static void main(String[] args) throws IOException {
//后面的boolean设置写入文件是否为追加,true表示为追加
//FileOutputStream fos = new FileOutputStream("d:\\b.txt",true);
FileOutputStream fos = new FileOutputStream("d:\\b.txt");
/*fos.write(97);//一次写入一个字节
fos.write('b');
fos.write('c');*/
fos.write("你好世界!".getBytes());
fos.close();
}
}
基本上的操作就是这样,下面来一个小demo,复制文件:
即读取文件,再写入文件
CopyFileDemo.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFileDemo {//文件字节流实现文件流复制demo
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("d:\\01.png");
FileOutputStream fos = new FileOutputStream("d:\\01copy.png");
byte[] bytes = new byte[1024];//一次读1KB
int count = 0;
int i = 0;
while ((count = fis.read(bytes)) != -1){
i++;
fos.write(bytes,0,count);
}
fis.close();
fos.close();
System.out.println("一共读取"+i+"次");
}
}
以上就是字节流类的基本操作,熟悉了这些操作,其他类只是对这些类进一步的封装完善。
例如:BufferedInputStream BufferedOutputStream
这个类在内部有一个byte[]数组
作为数据缓冲区,大小为8KB
,直接将文件读取到这个数组,减少内存与硬盘的交互从而提高效率,也可以自定义缓冲区的大小。
字节流与字符流的区别就在于,英文字母阿拉伯数字等都是由一个字节存储在文件中,而汉字一般都大于一个字节,如果用字节流的方式读取汉字会出现乱码。文件的本质其实都是以0或者1存储,只不过因为表示不同所以显示的意义不同。字符流更适合于文本文件的操作。
以上就是对于Java的io操作的简单介绍,文末附上JDK API 1.6帮助手册链接:https://gitee.com/six_teen/necessary_utils/blob/master/JDK_API_1_6_zh_CN.CHM