分类 |
字节输入流 |
字节输出流 |
字符输入流 |
字符输出流 |
|
抽象基类 |
InputStream |
OutputStream |
Reader |
writer |
节点流 |
访问文件 |
FilelnputStream |
FileOutputStream |
FileReader |
FileWriter |
节点流 |
转换流 |
|
|
InputStreamReader |
OutputStreamWriter |
处理流 |
缓冲流 |
BufferedinputStream |
BufferedOuputStream |
BufferedReader |
BufferedWriter |
处理流 |
对象流 |
ObjectinputStream |
ObjectinputStream |
|
|
处理流 |
内存流 |
|
|
|
|
处理流 |
/*
* IO流的概念:
* I: input,输入
* O: Output,输出
* 输入输出流。
*
* Java针对输入输出提出两*抽象类:
* java.io.InputStream: 输入流
* 根据数据源的不同,InputStream有可以分为众多的子类
* class FileInputStream extends InputStream (☆)
*
* java.io.OutputStream: 输出流
* 根据数据源的不同,OutputStream也可以分为众多的子类:
* class FileOutputStream extends OutputStream
* */
输入(读取):read()方法
public class Demo01 {
public static void main(String[] args) throws Exception {
/*
* FileInputStream: 将磁盘上的文件中的数据读取Java程序中。
* 构造方法: FileInputStream(String filePath)
* */
FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\123.txt"); // throws FileNotFoundException
/*
* int read(): 获取文件中的一个字节的数据
* 如果数据源已经读完,那么这个方法返回为-1.
* */
int data = fis.read();// private native int read0() throws IOException; 调用是C/C++去操作。\
System.out.println(data);
/*
* int read(byte [] bytes);
* 参数bytes: 一次性尝试读取bytes.length个字节,读取到的数据就放在byte数组中。
* 返回值: 实际读取到的字节数
* */
byte [] bytes = new byte[10];//一次读取10个字节的数据,数组容量本身不要刻意搞得太大, 因为创建数组本身就需要消耗时间,建议数组容量为1kb 或者 8kb
int count = fis.read(bytes);
System.out.println("实际读取到的个数:"+count);
for (byte aByte : bytes) {
System.out.println(aByte);
}
fis.close();//记得关闭流
}
}
一次读不完需要多次读取
public class Demo02 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
File file = new File("C:\\Users\\GzhAnkh\\Desktop\\test.txt");//1326个字节
System.out.println("文件的大小:"+file.length()+"byte");
fis = new FileInputStream(file);
byte [] bytes = new byte[1024];
int len;
// 没有读完, 就一直读取数据
while((len=fis.read(bytes))!=-1){
/*
* 会出现乱码, 乱码的原因是: 2.jpg本身不是文本文件不能转为字符串。
*
* 操作系统分为两大文件:
* 1、文本文件: 可以直接通过记事本可以打开,而且能正常显示其中的内容(.txt、.java)。
* 2、二进制文件: 不可以直接通过记事本可以打开,就算打开了也是看不懂的乱码(图片文件、视频文件、音频文件、.class)。
*
* 读取二进制文件获取到的数据, 把其转为字符串也没有太大意义。
* */
System.out.println(new String(bytes,0,len)); // 302
} // len代表此次读取的实际数据量
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();//记得关流,释放资源,如果不去释放资源, 表示这个文件一直被Java程序占用, 无法进行删除等操作.
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 面试题下面三个有什么区别:
* finally
* final
* finalize
*
* 三个完全不是同一个东西, 作用也不相同:
* finally: 和try一起使用, 表示最后执行的代码块
* final: 修饰符
* finalize: 是一个Object中的方法, GC回收机制的使用会用到。
*
* finally语句块:
* 不管有没有出现异常都会执行的代码
* */
}
}
简单完整例子
public class Demo03 {
public static void main(String[] args){
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code04.java");
byte[] bytes = new byte[1024];
int len;
while ((len = fileInputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len));
}
} catch (Exception e) {
throw new RuntimeException("异常");
} finally {//不管是否出现异常都会走下面的代码
try {
if(fileInputStream!=null)
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出数据到文件:write()方法
public class Demo04 {
public static void main(String[] args) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo01.txt", true);
//是否追加,最后的true意思是追加,默认是否,也就是会覆盖
fileOutputStream.write(97);//0110 0001也就是 ‘a'
//fileOutputStream.write(1);想输入'1',输入对应的字符串是的编码,’1‘的编码表上的值为49
//字符表的映射,每个字符都有对应的值
/*
* gbk是采用2个字节存储一个汉字
* utf-8采用3个字节存储汉字
* */
fileOutputStream.write(49);//'1'
byte[] bytes = {1, 2, 3, 4, 5};//
fileOutputStream.write(bytes);
String s = "高智豪