流是什么?
流是程序与外部的数据传输通道。输入流可以看作一个输入通道,输出流可以看作一个输出通道。
输入流,输出流
按照流的方向分为:输入流,输出流。
流入流出是针对内存而言,流出内存就是输出流,向内存写入就是输入流。
输入流示例:
//获取⽤键盘输⼊数据的常⽤方法
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
输出流示例:
未完待续…
OutPutStreamWriter
OutPutStreamWriter 将字节流转成字符流
字节流,字符流
按处理数据单位不同分为字节流、字符流
字节流:每次读取(写出)一个字节
字符流:每次读取(写出)两个字节
字符流的由来:
字符流是由Java虚拟机把字节转换而来的,过程耗时,不知道编码类型会出现乱码.为了更加方便读写字符类型的文件,提供了一个直接操作字符的接口.
(我的理解是,字符流就是在字节流的基础上多了转码的操作)
字节流:可以直接操作字节数据(byte数据)的流对象
字符流:可以直接操作字符数据(char数据)的流对象
https://blog.csdn.net/itqcyyl/article/details/81531801
https://blog.csdn.net/jc_benben/article/details/80196502
https://blog.csdn.net/qq_39304441/article/details/99670966
字符流与字节流转换(字符流输入输出原理)
文本文件在硬盘中是以字节流的形式存储,通过InputStreamReader读取字节转化为字符流给程序处理,程序处理的字符流通过OutputStreamWriter转换为字节流保存。
InputStreamReader 是字节到字符的桥梁,完成byte流解析为char流,按照编码解析
OutputStreamWriter 是字符到字节的桥梁,提供char流到byte流,按照编码处理
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class IOTest {
public static void main(String[] args) {
String result = null;
File fileIn = new File("E:/test/test1.txt");
File fileOut = new File("E:/test/test2.txt");
InputStreamReader inStream = null;
OutputStreamWriter outStream = null;
try {
inStream = new InputStreamReader(new FileInputStream(fileIn),
"UTF-8");
outStream = new OutputStreamWriter(new FileOutputStream(fileOut),
"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(inStream);
BufferedWriter writer = new BufferedWriter(outStream);
try {
while ((result = reader.readLine()) != null) {
writer.write(result);
writer.newLine();
writer.flush();
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节流,字符流的区别:
- 使用范围: 字节流可以对所有类型的数据输入输出,字符流只能输入输出字符类型的数据
- 操作单元: 字节流一次操作一个字节,字符流一次操作两个字节
- 缓存: 节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。
四种最基本流类型:
字节流: InputStream,OutputStream
字符流: Reader,Writer
参考:
Java-IO流
Java:字节流和字符流(输入流和输出流)
File
File是文件和目录路径名的抽象表示。一旦创建, File对象表示的抽象路径File永远不会改变。
file.exists()
file.exists()是判断file对象所指向的文件或目录是否存在,并不是判断file对象是否存在。
如:new File(“/filea.txt”) 并不会创建一个叫filea.txt的文件,只是创建了一个对象指向了filea.txt这个文件。只有当filea.txt这个文件存在时,file.exists()才会返回true。
fileb.createNewFile()
才是创建了一个文件。
package com.cmb.cpc.cpc2.util;
import java.io.File;
import java.io.IOException;
public class dmm {
public static void main(String[] args){
//创建一个指向"/APP/filea.txt"的文件对象
File filea = new File("/APP/filea.txt");
System.out.println(filea.exists());
//创建一个指向"/APP/fileb.txt"的文件对象
File fileb = new File("/APP/fileb.txt");
try {
//创建一个在路径“/D/APP/”下名叫“fileb.txt”文件
fileb.createNewFile();
} catch(IOException e) {
e.printStackTrace();
}
System.out.println(fileb.exists());
//删除掉fileb指向的文件
fileb.delete();
System.out.println(fileb.exists());
}
}