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!
其他的管道流(繼承自字節流),隨機流,內存流(繼承自字節流)下次有時間再寫