输出流
输入流
File类
File类学习代码
package com.imooc.file;
import java.io.File;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args)
{
//创建File对象的三种构造方法,由于反斜杠代表转义字符,因此两个反斜杠才能代表一个真正的反斜杠的作用
/*
* File(String pathname)
* ——通过将给定的路径名字符串转换为抽象路径名来创建新的文件实例。
* File(String parent, String child)
* ——从父抽象路径名和子路径名字符串创建新的文件实例。
* 注意File类对象指向的路径不需要一定存在
*/
File file1=new File("G:\\imooc\\io\\score.txt");//方法一
File file2=new File("G:\\imooc","io\\score.txt");//方法二
//方法3
/*
* public File(File parent,String child)
*/
File file3=new File("G:\\imooc");
File file4=new File(file3,"io\\score.txt");
//判断是文件还是目录
/*
* public boolean isDirectory()
* ——测试此抽象路径名所表示的文件是否为目录。
* public boolean isFile()
* ——测试此抽象路径名所表示的文件是否为文件。
*/
System.out.println("file1的路径名表示的是否是目录:"+file1.isDirectory());
System.out.println("file1的路径名表示的是否是文件:"+file1.isFile());
System.out.println("file2的路径名表示的是否是目录:"+file2.isDirectory());
System.out.println("file2的路径名表示的是否是文件:"+file2.isFile());
//创建目录
/*
* public boolean exists()
* ——判断File类对象指向的路径是否存在,存在则返回true,不存在则返回false
*/
File file5=new File("G:\\imooc","set\\HashSet");
if(!file5.exists())//如果set目录及其子目录HashSet不存在,则创建多级目录
{
/*
* public boolean mkdirs()
* ——创建以File类对象指向的路径名命名的多级目录
* public boolean mkdir()
* ——创建以File类对象指向的路径名命名的单级目录
*/
file5.mkdirs();//由于G盘imooc下没有set目录及其子目录,因此要调用mkdirs实现多级目录创建
System.out.println("目录set\\HashSet创建成功!");
}
//创建文件
/*
* public boolean createNewFile() throws IOException
* ——创建以File类对象指向的路径名命名的文件
*/
if(!file1.exists())
{
try
{
file1.createNewFile();
System.out.println("文件score.txt创建成功!");
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
字节输入输出流
一、字节流
1、字节输入流类及其子类
之后的代码重点学习文件输入流和缓冲输入流,字符输入流等其他流可以对比着学习,基本上是大同小异。
(1)文件输入流及其常用方法
字节输入流之文件输入流学习代码一
package com.imooc.input_output_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo1
{
public static void main(String[] args)
{
//创建一个FileInputStream对象
/*
* 两种常用构造方法:
* public FileInputStream(File file) throws FileNotFoundException
* public FileInputStream(String name) throws FileNotFoundException
*/
try
{
//由于imooc.txt是存放在这个工程目录下的,是相对路径,因此直接写文件名即可
FileInputStream fis=new FileInputStream("imooc.txt");
/*
* public int read() throws IOException
* ——从此文件输入流读取"一个"字节,返回读取的字节数据.
* 注意,读取一个字节后就不会再读取这个字节了,相当于水管中取水滴
* 如果第二遍执行read方法那么读取的就是下一个字节了
*/
int n;
while((n=(fis.read()))!=-1)//读取的字节为-1时,说明读到了文件的末尾
{
System.out.print((char) n);//将读到的字节转换为对应的字符
}
/*
* public void close() throws IOException
* ——关闭此文件输入流,并释放与流相关联的任何系统资源。
* 要养成随手关闭输入流的习惯
*/
fis.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e) //由于FileNotFoundException是IOException的子类,因此IOException要放后面
{
e.printStackTrace();
}
}
}
字节输入流之文件输入流学习代码二
package com.imooc.input_output_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo2
{
public static void main(String[] args)
{
try
{
FileInputStream fis=new FileInputStream("imooc.txt");
/*
* public int read(byte[] b) throws IOException
* ————从该输入流中最多读取b.length个字节的数据并存放在字节数组b中,返回实际读取的字节数
* public int read(byte[] b,int off,int len) throws IOException
* ————从输入流中最多读取len个字节的数据,并将其存放在字节数组b中,但放入数组b中时,从index为off的位置开始放
* 并返回实际读取的字节数
*/
byte[] b=new byte[100];
fis.read(b);//等价于fis.read(b,0,12)
//将字节数组转换为字符串输出,利用之前学过的String类构造方法public String(byte[] bytes)
System.out.println(new String(b));
fis.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
2、字节输出流及其子类
(1)、文件输出流及其常用方法
字节输出流之文件输出流学习代码一
package com.imooc.input_output_stream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1
{
public static void main(String[] args)
{
try
{
/*
* public FileOutputStream(String name) throws FileNotFoundException
* ————用这种构造方法创建的输出流输出字节时会覆盖要写入文件原有的数据
* public FileOutputStream(File file,boolean append) throws FileNotFoundException
* ————用这种构造方法创建的输出流输出输出字节时,若append为true则在要写入文件最后写入新输出的数据,否则覆盖
*/
FileOutputStream fos=new FileOutputStream("imooc.txt");
/*
* public void write(int b) throws IOException
* ————将指定的字符输出到输出流中,其中b既可以代表字节,也可以代表字符
*/
fos.write(50);
fos.write('a');//字符是可以和整型之间相互转换的
fos.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
字节输出流之文件输出流学习代码二
package com.imooc.input_output_stream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo2
{
public static void main(String[] args)
{
try
{
/*
* public FileOutputStream(String name) throws FileNotFoundException
* ————用这种构造方法创建的输出流输出字节时会覆盖要写入文件原有的数据
* public FileOutputStream(File file,boolean append) throws FileNotFoundException
* ————用这种构造方法创建的输出流输出输出字节时,若append为true则在要写入文件最后写入新输出的数据,否则覆盖
*/
FileOutputStream fos=new FileOutputStream("imooc.txt",true);
/*
* public void write(int b) throws IOException
* ————将指定的字符输出到输出流中,其中b既可以代表字节,也可以代表字符
*/
fos.write(50);
fos.write('a');//字符是可以和整型之间相互转换的
fos.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
字节输出流之文件输出流学习代码三
package com.imooc.input_output_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo3
{
public static void main(String[] args)
{
//文件拷贝,实际上就是字节数据经输入流输入再经输出流输出到另一个文件的过程
try
{
//创建读取图片数据的输入流
FileInputStream fis=new FileInputStream("happy.png");
//创建输出图片数据的输出流
FileOutputStream fos=new FileOutputStream("happycopy.png");
int n;
byte[] b=new byte[2048];
/*
* public void write(byte[] b,int off,int len) throws IOException
* ————向输出流中输出字节数组b中off位置开始的长度为len的字节数据
*/
while((n=fis.read(b))!=-1)
{
fos.write(b,0,n);//用这种多参数的write方法可以保证不会写入多余的数据
}
fis.close();
fos.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
3、缓冲流
缓冲流学习代码
package com.imooc.input_output_stream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferDemo
{
public static void main(String[] args)
{
try
{
FileOutputStream fos=new FileOutputStream("imooc.txt");
//创建缓冲输出流,将文件输出流和缓冲输出流连接
/*
* public BufferedOutputStream(OutputStream out)
* ————创建新的缓冲输出流,以将数据写入指定的基础输出流。
*/
BufferedOutputStream bos=new BufferedOutputStream(fos);
FileInputStream fis=new FileInputStream("imooc.txt");
//将文件输入流和缓冲输入流连接
/*
* public BufferedInputStream(InputStream in)
* ————创建缓冲输入流并保存其参数————基础输入流,供以后使用。
*/
BufferedInputStream bis=new BufferedInputStream(fis);
/*
* public void write(int b) throws IOException
* ————将指定的字节写入此缓冲输出流,但实际是存储在缓冲输出流的内部缓冲区buf中,只有缓冲区满了
* 才会自动执行写操作,因此需要手动强制清空内部缓存区执行写操作
* public void flush() throws IOException
* ————刷新此缓冲输出流,这将强制任何缓冲的输出字节被写出到基础输出流。只有具有缓冲区的输出流才需要使用此方法强制执行写数据的操作,但建议在每一个write语句后都加一句flush以防万一
*/
bos.write(50);
bos.write('a');
bos.flush();
bos.close();//释放资源
/*
* 缓冲输入流的read方法与文件输入流的read方法基本一致
*/
System.out.println(bis.read());
System.out.println((char) bis.read());
bis.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
二、字符流
字符输入流和输出流
由于字符流和字节流方法基本一致,只有处理数据的不同,因此不单独写学习代码了,直接拿出字节字符转换流的代码。字节流转换成字符流。
package com.imooc.reader_writer;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class ChangeStreamDemo
{
public static void main(String[] args)
{
try
{
FileInputStream fis=new FileInputStream("imooc.txt");
/*
* 将字节输入流转换为字符输入流
* public InputStreamReader(InputStream in)
*/
InputStreamReader isr=new InputStreamReader(fis);
int n;
char[] cbuf=new char[10];
/*
* public int read() throws IOException
* ————从输入流读取单个字符,返回读取的字符数据(转换为int类型)
* public int read(char[] cbuf) throws IOException
* ————从输入流读取最多cbuf.length个字符的数据,存放在字符数组cbuf中,返回实际读取的字符数
* public String(char[] value,int offset,int count)
* ————从字符数组value的offset位置开始,创建一个长度为count的字符串
*/
/*
* 以下注释代码为读取的步骤,由于这个步骤会导致下面的输出流的例子出错,因此注释掉
while((n=isr.read(cbuf))!=-1)
{
System.out.print(new String(cbuf,0,n));//保证最后一次在未将数组cbuf存满的时候也能正确输出
}
*/
//字节输出流转字符输出流
FileOutputStream fos=new FileOutputStream("imooc1.txt");
/*
* public OutputStreamWriter(OutputStream out)
* ————将基础字节输出流转换为字符输出流
* public void write(char[] cbuf,int off,int len) throws IOException
* ————将cbuf字符数组中第off个位置开始长度为len的字符串输出到输出流中
*/
OutputStreamWriter osw=new OutputStreamWriter(fos);
while((n=isr.read(cbuf))!=-1)
{
osw.write(cbuf,0,n);
osw.flush();/*所有含有缓冲区的输出流的write方法都是在输出流的未满时不自动执行write操作的,
因此需要手动清空强制执行write操作才能将输出流中的数据写入文件,之前学习的字节输出流中没有flush是因为
后面加了close();但是实际中最好两个都加上
*/
}
fis.close();
fos.close();
isr.close();
osw.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
三、对象序列化及反序列化
步骤
用到的类
对象序列化学习代码之Goods商品类
package com.imooc.serial;
import java.io.Serializable;
/*创建一个实现序列化接口的类*/
public class Goods implements Serializable
{
private String goodsId;
private String goodsName;
private double price;
public Goods()
{
}
public Goods(String goodsId, String goodsName, double price)
{
this.goodsId = goodsId;
this.goodsName = goodsName;
this.price = price;
}
public String getGoodsId()
{
return goodsId;
}
public void setGoodsId(String goodsId)
{
this.goodsId = goodsId;
}
public String getGoodsName()
{
return goodsName;
}
public void setGoodsName(String goodsName)
{
this.goodsName = goodsName;
}
public double getPrice()
{
return price;
}
public void setPrice(double price)
{
this.price = price;
}
@Override
public String toString()
{
return "Goods [goodsId=" + goodsId + ", goodsName=" + goodsName + ", price=" + price + "]";
}
}
对象序列化学习代码之商品测试类
package com.imooc.serial;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class GoodsTest
{
public static void main(String[] args)
{
//定义Goods类对象,将对象写入文件中,再读出来判断是否写入成功
Goods goods1=new Goods("gd001","电脑",3000);
try
{
/*
* public ObjectOutputStream(OutputStream out) throws IOException
* ————创建一个对象输出流以写入指定的输出流
* public final void writeObject(Object obj) throws IOException
* ————将一个指定的对象写入对象输出流
*/
//将对象信息写入文件
FileOutputStream fos=new FileOutputStream("imooc.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(goods1);//将goods1对象写入文件imooc.txt中
oos.flush();
oos.close();
fos.close();
/*
* public final Object readObject() throws IOException,ClassNotFoundException
* ————从对象输入流读出一个对象
*/
//将对象信息从文件读出来
FileInputStream fis=new FileInputStream("imooc.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
Goods goods2=(Goods)ois.readObject();//由于readObject方法返回的是Object类,因此要强制转换
System.out.println(goods2);
fis.close();
ois.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}