File类
public File(String pathname)
File类中主要的方法和常量
f.list() 返回该目录下的所有文件名
f.fIleList()返回该目录下所有文件的路径
显示该目录下所有的文件包括子目录
方法
import java.io.File;
import java.io.IOException;
public class demo1 {
public static void main(String[] args)
{
File f= new File("./");
printf(f);
}
public static void printf(File file)
{
if(file!=null)
{
if(file.isDirectory())
{
File f[] =file.listFiles();
if(f!=null)
{
for(int i=0;i<f.length;i++)
{
printf(f[i]);
}
}
}
else
{
System.out.println(file);
}
}
}
}
Random AccessFile类
完成随机读取功能,可以读取指定位置的内容。
在文件中所有的内容是在字节存放的,有固定的保存位置
public RandomAccessFile(File f,String mode)
创建对象时要制定要操作的文件对象和操作模式,r-read,w-write rw-read&&write
操作例子
写入内容
读取内容:
字节流和字符流
流中保存的全是字节文件
OutputStream类 抽象类
写入数据到文件过程
实例化File对象
实例化FileOutputStream对象并向上转型为OutputStream对象,将要写入的内容通过getBytes()方法转化为字节数组,调用OutputStream的write(Byte[] b)方法写入字节数组
最后关闭字节流
不覆盖已有文件内容添加数据到文件的方法
通过FileOutputStream的另一个构造方法
FileOutputStream(File file,boolean append) ,append设置为true则表示追加内容例如:
InputStream
和输出流类似,注意read(byte[] b)方法返回的是读取内容的字节个数。
可以通过File对象的length()方法获取文件内容的大小,依据这个数值来开辟接收读取内容的数组的大小空间
方法如下
另一种读取方式,依据是读到文件末尾时=-1,这种适用于不知道文件内容大小的情况。
字符流
输出流Writer
较字节流好的一点是可以直接输出字符串了,不需要再进行转换。例如:
输入流没啥要记的
字节流和字符流的区别
真正操作文件的是字节流
字节流直接操作文件,字符流则需要经过缓存来操作文件,根据是字符流不关闭,输出的文件不会有内容显示,只有关闭后,才会强制刷新缓冲区,才能把内容输出,当然也可以用flush强制刷新。
使用字节流好还是字符流?
实现将一个文件内容读取到另外一个文件,且采用边读边写的方式代码如下
import java.io.*;
public class Copy {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
if(args.length!=2)
{
System.out.println("输入参数不足");
System.exit(1);
}
File f1= new File(args[0]);
File f2= new File(args[1]);
if(!f1.exists())
{
System.out.println("不存在源文件");
System.exit(1);
}
InputStream in = new FileInputStream(f1);
OutputStream out = new FileOutputStream(f2);
int temp;
while((temp=in.read())!=-1)
{
out.write(temp);
}
System.out.print("copy完成");
out.close();
in.close();
}
}
字符-字节转换流
使用这种方式输出的话,操作的是字符流,然后通过转换成字节流输入到文件
输入的话则以下为例
梳理一下继承关系
FileWriter和FileReader中间使用了转换类
内存操作流
主要方法
实例:
内存操作对象一定是以内存为准。
重点:通过此类可以很深入的了解字节流,根据要操作的对象,生成不同的字节流的子类的实例,再通过向上转型,由于不同子类的操作方法不一样,但通过父类可以将子类不同的操作给统一化,都通过父类这个接口来完成操作,不需要关注子类是如何实现此功能的,这很重要!!!!!
管道流
线程间的通讯。
打印流
通过指定输出流类型如FileOutputStream来表示程序输出数据要到的位置
构造方法
public PrintStream(OutputSream out)
例如:
这个时候其实就是将FIleOutputStream的功能包装了一下。
System类对io的支持
System.out
这out是由指定输出位置为屏幕的类实例化得来的
梳理一下继承关系,OutputStream是PrintStream和FileOutputStream的 父类,
printStream有构造方法 传入OutputStream类型的对象实例化,这样可以通过对象的多态传入OutputStream的子类来指定输出的位置。
实例:
System.err
表示错误的标准输出
与out的区别:
System.in
实际上是一个键盘的输入流,本身是InputStream的对象,完成从键盘读取数据的功能。
例子
一个字节一个字节的读取造成中文乱码的问题。
输入输出重定向
重定向的方法setOut/err/in
例子:
将错误信息输出到文件
System.err向内存中输出
System.in重定向
将输入位置变为文件:
重定向一般是用Out来给用户显示信息
BufferedReader
这个类接收的是一个字符流对象
例子:
io操作实例
校验输入的数据是否是整型,不是则提示重新输入功能。
需要使用正则表达式
String.matches(规则)
格式化日期:
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
class Util{
private BufferedReader buf=null;
public Util() {
this.buf= new BufferedReader(new InputStreamReader(System.in));
}
public String getInfo(String info) throws Exception
{
String temp = null;
System.out.println(info);
temp=this.buf.readLine();
return temp;
}
public Date getDate(String info,String err) throws Exception
{
Date temp=null;
String str=null;
boolean flag= true;
while(flag)
{
str=this.getInfo(info);
if(str.matches("^\\d{4}-\\d{2}-\\d{2}$"))
{
SimpleDateFormat sdf= new SimpleDateFormat("YYYY-MM-DD");
temp=sdf.parse(str);
flag = false;
}
else
System.out.println(err);
}
return temp;
}
}
public class Demo3 {
public static void main(String[] args) throws Exception
{
Util util = new Util();
Date i=util.getDate("请输入日期","输入错误请请重新输入");
System.out.println(i);
}
}
一个提供操作说明的菜单
Scanner类
接收输入的数据
常用方法
比BufferedReader方便一些
使用时要使用useDelimiter(String pattern)来设置分隔符
将分隔符设置为\n
接收整数和小数
输入正确格式的日期例子:
直接操作文件数据:
读取文件存在一些问题,就是换行符作为读取的分隔符,即读取完一行就不读了
这时需要经过以下处理
数据操作类
实例:
输出流
输入流
合并流
将两个文件的内容合并到一个文件
例子
压缩流
先不学。。
回退流
先不学
字符编码
System.getProperty(“file.encoding”)查找本机编码
测试例子:
对象序列化
根据这张图后者是前者的父类,后者定义了两个方法来选择进行输出和输入对象的属性,后后者只能全部保存对象的属性。
serializable:
import java.io.*;
class Person implements Serializable{
private String name;
private static final long serialVersionUID=1L;
public Person(String name,int age)
{
this.name= name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private int age;
@Override
public String toString()
{
return this.name+this.age;
}
}
public class Demo5 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File f= new File("./test2");
ObjectInputStream ois= new ObjectInputStream(new FileInputStream(f));
Person per =(Person)ois.readObject();
System.out.println(per);
}
}
ExternalSerializable
接口定义:
实现此接口例子:
被序列化的类中必须定义一个无參构造!!!!!!
transient关键字
在序列化操作的时候,某个属性不属于被序列化,则直接用transient关键字声明
保存多个对象
例子如下:
所引用资料来自midnjava视频教程,只用学习交流。