Java基础——IO流
IO核心就是五个类(File,InputStream,OutPutStream,Reader,Writer)+ 一个接口(Serializable)
一、File类
File类是java.io包中唯一一个与文件本身操作(创建、删除、取得信息)有关的程序类。
对文件做操作前,需要先创建一个File类:
public File(String pathname);
public File(String parent,String child);
判断文件是否存在:
public boolean exists();
删除文件:
public boolean delete();
取得父路径或父File对象:
public String getParent();
public File getParentFile();
创建目录
(无论有多少级父目录,都会创建)
public boolean mkdirs();
举个栗子:
/** 创建文件前先判断其父目录是否存在,若不存在,则需要先创建父目录,
若存在,则再判断当前文件是否已创建。 */
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+
File.separator+"xiaoaxiao"+File.separator+
"Desktop"+File.separator+"com"+File.separator+
"xiaoaxiao"+File.separator+"io"+File.separator+
"IOTest.java");
// 若父路径不存在,则先创建父路径
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
// 当前文件,存在则删除,不存在则创建
if(file.exists()){
file.delete();
}else {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、字节流与字符流的输入输出
字节流:InputStream,OutputStream
字符流:Reader,Writer
字节流和字符流的本质区别
是:字节流是原生操作(网络数据传输、磁盘数据保存都是字节),而字符流是经过处理后的操作(先读取到内存再将字节转换为字符)。
字节流与字符流的操作流程几乎相同:
1、根据文件路径先创建File对象
2、根据字节流或字符流的子类实例化父类对象
3、进行数据的读取或写入操作
4、关闭流(close())
InputStream、OutputStream、Reader、Writer都是抽象类,要实例化父类,必须使用子类
,以操作文件为例,FileInputStream(File file),FileWriter(File file)。
操作字节流时:使用一个字节数组(byte[])进行输入输出
// 输出
output.writer("hello".getBytes());
// 输入,read返回数据的读取个数
(开辟的字节数组>读取到的数据大小?读取到的数据大小:开辟的字节数组大小)
int len = 0;
byte[] data = new byte(1024);
len = input.read(data);
操作字符流时:可以直接使用字符串进行输出(也可以是字节数组),但只能使用字节数组进行输入(最终将字节数组转换为字符串即可)
// 输出
output.writer("hello");
// 输入,read返回数据的读取个数
(开辟的字节数组>读取到的数据大小?读取到的数据大小:开辟的字节数组大小)
// 若文件读取结束,则返回-1
int len = 0;
byte[] data = new byte[1024];
len = input.read(data);
// 将字节数组转换为字符串
String msg = new String(data,0,len);
处理图片、音乐、文字都可以使用字节流;只有处理中文时才会使用字符流。
三、转换流
所谓转换流就是将字节输入/出流转换为字符输入/出流。没什么大的意义。
// 字节输出流->字符输出流
Writer writer = new OutputStreamWriter(outputStream);
// 字节输入流->字符输入流
Reader reader = new InputStreamReader(inputStream);
以此就能说明:所有的字符流都是经过字节流转换而来的。
四、字符编码
由于设计网络浏览器服务器编程就会有很大可能性出现乱码的问题,而乱码的最主要原因就是:编解码不一致。
要避免乱码问题,就需要知道常见的编码方式有哪些:
1、GBK,GB2312:国际编码。GBK即包含简体中文也包含繁体中文,GB2312只包含简体中文。
2、UNICODE:java提供的16进制编码,可以描述世界上任意文字,由于采用16进制编码,导致编码的体积太大,造成网络传输负担。
3、ISO-8859-1:国际通用编码,但所有编码均需转换。
4、UTF编码(UTF-8):结合了ISO-8859-1与UNICODE,支持所有语言,体积较小。以后编码只用UTF-8
。
乱码产生的原因:
windows10中文版默认GBK编码
一般出现全是?:编解码不一致
一般出现不认识的汉字:传输中丢失了部分数据
五、内存流
除了文件外,IO操作也可以出现在内存中,适用于:需要进行IO处理,但不希望产生文件。使用内存作为操作终端。
字节内存流:ByteArrayInputStream,ByteArrayOutputStream
字符内存流:CharArrayReader,CharArrayWriter
相当于把内存作为一个临时文件,这样理解即可。
六、打印流
对OutPutStream的升级
字节打印流:PrintSteam
字符打印流:PrintWriter
printStream.print();
printStream.write();
七、标准输入输出
标准输出:显示器
标准输入:键盘
System.out都是PrintStream的实例化对象,System.in是InputStream的对象。
八、输入输出总结
输出就用打印流
(PrintWriter,PrintStream)
输入就用Scanner
(Scanner(InputStream input),将输入流传给Scanner即可,文件,网络等都可以)