JavaSE基础IO流【一】
一、java.io.File类
1.凡是与输入、输出相关的类、接口等都定义在java.io包下
2.File是一个类,可以由构造器创建其对象,此对象对应者一个文件(.txt .mp3 .mp4 .doc等等)或一个文件
目录
3.File类对象是与平台无关的。(即也可以在其他平台使用)
4.File类中的方法,仅涉及到如何创建、删除、重命名等等。只要涉及文件内容的,File是无能为力的,必须由IO来完成。
5.File类的对象常作为IO流的集体类的构造器的形参。
二、IO流的概述
1.流的分类
按照数据流向不同:输入流,输出流
按照处理数据的单位不同:字节流、字符流(处理纯文本文件)
按照角色的不同:节点流(直接作用与文件)、处理流(在节点流的基础上加以处理)
2.IO的体系
抽象基类 节点流(文件流)
缓冲流(处理流的一种,可以提升文件操作的效率)
InputStream FileInputStream
BufferedInputStream
OutputStream FileOutputStream
BufferedOutputStream
(flush() )
Reader FileReader
BufferedReader
(readLine())
Writer FileWriter
BufferedWriter (flush() )
①、FileInputStream 读取文件
一个字节一个字节的读取(读取速度较慢,不推荐使用)
②
基本用法:
private static void FileInputStreamTest() throws Exception {
// TODO Auto-generated method stub
File file1=new File("hello.txt");
FileInputStream fis=new FileInputStream(file1);
//调用FileInputStream的方法 实现file文件的读取
/*
read() 读取文件的一个字节,当执行到文件结尾时,返回-1.
* int b = fis.read();
while(b!=-1){
System.out.print((char)b);
b=fis.read();
}
*/
int b;
while((b=fis.read())!=-1){
System.out.print((char)b);
}
fis.close();
}
使用数组控制每次读取字节的长度,可同时读取多个字节 速度大大提升。
private static void FileInputStreamTest(){
FileInputStream fis=null;
//调用FileInputStream的方法 实现file文件的读取
try {
// TODO Auto-generated method stub
File file1 = new File("hello.txt");
fis = new FileInputStream(file1);
byte[] b = new byte[5]; //读取到的数据写到数组, 数组长度为同时读取的字节长度
int len; //因为数组长度是固定的 这里要用len 来表示同一次读取到的字节长度 有可能并没有装满数组
while ((len = fis.read(b)) != -1) {
// for (int i = 0; i < len; i++) {
// System.out.print((char) b[i]);
// }
String str=new String(b, 0, len);
System.out.print( str);
}
} catch (Exception e) {
// TODO: handle exception
}finally{
try {
if(fis!=null){
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
、FileOutputStream 写入文件
private static void FileOutputStreamTest() {
// TODO Auto-generated method stub
//1.创建File对象 指定hello2.txt 文件的位置 ★该文件不存在时,系统自动创建。如果已存在且存在内容时 此方法写入会覆盖其内容。
File file2=new File("hello2.txt");
//2.创建FileOutputStream 对象 将File对象作为形参 传递给FileOutputStream的构造中
FileOutputStream fos=null;
try {
fos=new FileOutputStream(file2);
//3.写入操作
fos.write(new String("hello world !").getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//4.关闭流
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
FileInputStream、File
OutputStream 同时使用,实现从硬盘读取一个文件,并写入到另一个位置。(相当于文件的复制):
private static void FileInputOutputStreamTest() {
// TODO Auto-generated method stub
//实现从硬盘读取一个文件,并写入到另一个位置。(相当于文件的复制):
//1.准备要读取和要写入的文件
File file1=new File("C:\Users\asusnb\Desktop\1.jpg"); //等会儿读取的文件 一定是存在的!!
File file2=new File("C:\Users\asusnb\Desktop\2.jpg"); //作为写入的文件 可以是不存在的
//2.准备相应的流
FileInputStream fis=null;
FileOutputStream fos=null;
//3.实现文件的复制
try{
fis=new FileInputStream(file1);
fos=new FileOutputStream(file2);
//3.1 先从file1中 读取到文件的数据
byte[] b=new byte[5];
int len;
while((len=fis.read(b))!=-1){
//3.2 把file1中读取到的数据写入到file2中
fos.write(b, 0, len);
}
}catch(Exception e){
e.printStackTrace();
}finally{
//4.关闭流
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
③、FileReader读取文件
跟上面的FileInputStream 几乎相同 不同的是 FileReader读取的是字符,而FileInputStream读取的是字节
private static void FileReaderTest() {
// TODO Auto-generated method stub
//1.创建File对象 准备要读取的文件
File file=new File("C:\Users\asusnb\Desktop\1.txt");
//2.创建FileReader 对象 将要读取的文件放入FileReader
FileReader reader=null;
//3.通过FileReader 的read方法 读取文件
try{
reader=new FileReader(file);
char c[]=new char[20]; //创建char数组 数组长度为一次同时读取的字符长度
int len;
while((len=reader.read(c))!=-1){
String str=new String(c, 0, len);
System.out.print(str);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
④
、FileWriter 写入文件
因为与上面的FileOutStream 相似 这里直接用了一个FileReader和FileWriter 结合的例子实现了字符流文件的复制
private static void FileWriter() {
// TODO Auto-generated method stub
//注意 FileReader、FileWriter 只能读取和写入 字符流(文本文件),而FileInputStream、FileOutputStream 只能读取和写入 字节流(包括.mp3 视频等等)
//使用FileReader 和 FileWriter 把一个文本文件从硬盘复制到另一个地方
//1.准备要读取和写入的文件
File file1=new File("C:\Users\asusnb\Desktop\1.txt"); //要读取的文件必须存在!!
File file2=new File("C:\Users\asusnb\Desktop\2.txt"); //此时是不存在的,若存在则覆盖该文件(写入可以不存在)
//2.准备相应的流
FileReader reader=null;
FileWriter writer=null;
//3.实现复制
try{
reader=new FileReader(file1);
writer=new FileWriter(file2);
char c[]=new char[24];
int len;
while((len=reader.read(c))!=-1){
writer.write(c, 0, len);
}
}catch(Exception e){
e.printStackTrace();
}finally{
//4.关闭流
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(writer!=null){
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}