IO篇
io即实现数据的读写操作,java针对io的操作由java.io包,该包的主要核心是File类,InputStream,OutputStream,Reader,Wirter,Serializable接口
File
常用的方法如下:
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file =new File("d:\\test.txt");//构造方法
if(file.exists()){//判断是否存在
file.delete();//存在删除
}
else
file.createNewFile();//创建新的文件,并抛出异常
}
}
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file =new File("d:\\i\\test.txt");
if(!file.getParentFile().exists()){//判断父路径在不在
file.getParentFile().mkdirs();//不在则创建
}
if(file.exists()){
file.delete();
}
else
file.createNewFile();
}
}
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) throws IOException {
File file =new File("d:\\i\\test.txt");
file.createNewFile();
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
}
}
综合案例:批量扫描文件目录
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void listDir(File file){
if(file.isDirectory()){
File[] files = file.listFiles();
if(files!=null){
for(File f:files){
listDir(f);
}
}
}
System.out.println(file.getName());
}
public static void main(String[] args) throws IOException {
File file = new File("d:\\my");
listDir(file);
}
}
字节流
字节输出流OutputStream
抽象类,继承Object,实现Closeable Flushable接口
一般是由FIleOutputStream实现
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
OutputStream out = new FileOutputStream(file);
String msg = "你好!";
out.write(msg.getBytes());
out.flush();
}
}
字节输入流InputStream
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
InputStream in =new FileInputStream(file);
byte[] bytes = new byte[1024];
int length=in.read(bytes);
System.out.println(new String(bytes,0,length));
in.close();
}
}
字符流
字节流适合在网路中进行传输,操作的时候需要进行字节数组的转换操作,为了简化操作,java提供了字符流,直接支持字符的输出
Writer
一般由FileWriter实现
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
Writer writer = new FileWriter(file,true);//默认是覆盖原来的,使用append属性之后则会追加
String msg = "你好!";
writer.write(msg);
writer.flush();
}
}
Reader
看出Reader可以直接对字符进行操作,使用的缓冲区数组也是char类型的
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
Reader reader =new FileReader(file);
char[] chars = new char[1024];
int length=reader.read(chars);
System.out.println(new String(chars,0,length));
reader.close();
}
}
Wirter,Reader在数据传输的时候其实依然是在操作字节数据,不过在缓冲区中将字节转换成字符。
在写入文本的时候可能乱码,使用getBytes(“编码”)解决
转换流
字节流和字符流可以进行转换的,使用InputStreamReader(继承Reader)和OutputStreamWirter(继承Wirter)进行转化。
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
OutputStream out =new FileOutputStream(file);
Writer writer=new OutputStreamWriter(out);
writer.write("好饿啊!");
writer.close();
out.close();
}
}
打印流
PrintStream(继承自FilterOutputStream)PrintWriter(继承自Writer)
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file=new File("D:\\test.txt");
PrintWriter printWriter =new PrintWriter(new FileOutputStream(file));
printWriter.print("我太饿了!!!!");
printWriter.close();
}
}
文件复制思路,使用FileOutputStream和FileInputStream进行一边读一边写!
System.in本质是inputStream!
其他的管道流(继承自字节流),随机流,内存流(继承自字节流)下次有时间再写