# java之IO操作
一.文件的概念
文件是數據源(保存數據的地方)的一種,比如大家經常使用的word文檔,txt文件,excel文件…都是文件。文件最主要的作用就是保存數據,它既可以保存一張圖片,也可以保存視頻,聲音…
二.文件流
文件在程序中是以流的形式來操作的。
流:數據在數據源(文件)和程序(內存)之間經歷的路徑。
輸入流:數據從數據源(文件)到程序(內存)的路徑。
輸出流:數據從程序(內存)到數據源(文件)的路徑。
注:如何判斷是輸入流還是輸出流?
以內存爲參照,如果數據向內存流動則是輸入流,反之是輸出流。
三.java流分類
1.字節流:可以用於讀寫二進制文件以及任何類型文件。 byte
2.字符流:可以用於讀寫文本文件。不能操作二進制文件。
字節流 | 字符流 | |
---|---|---|
輸入 | InputStream | Reader |
輸出 | OutputStream | Writer |
四.常用io流 之文件對象
案例:文件數據源File類介紹
public static void fileDemo(){
//創建一個文件對象
File f = new File("src/test.txt");
//得到文件的路徑
System.out.println("文件路徑:"+f.getAbsolutePath());
//得到文件的大小
System.out.println("文件字節的大小:"+f.length() );
//判斷文件是否可讀或可寫
System.out.println("可讀:"+f.canRead());
//創建文件和文件夾
File f2 = new File("d:/demo.txt");
if (!f2.exists()){
//可以創建
try {
f2.createNewFile();
System.out.println("創建成功");
} catch (IOException e) {
e.printStackTrace();
}
}else {
System.out.println("有文件,不能創建");
}
}
結果:
文件路徑:D:\study\jiebademo2\src\test.txt
文件字節的大小:2102
可讀:true
創建成功
在D盤下創建了demo.txt文件。
若想創建創建文件夾,代碼如下:
public static void demo2(){
File f = new File("d:/ff");
//判斷文件夾是否存在
if (f.isDirectory()){
System.out.println("該文件夾已存在");
}else {
//創建文件夾
f.mkdir();
}
}
列出一個文件夾下的所有文件:
//列出文件夾下的所有文件
public static void demo3(){
File f = new File("d:/study");
if(f.isDirectory()){
File[] files = f.listFiles(); //返回文件對象數組
for(int i=0;i<files.length;i++){
System.out.println("文件名 "+files[i].getName());
}
}
}
結果是:
文件名 apache-tomcat-9.0.14
文件名 campus_live_platform-master.zip
文件名 icutword
文件名 jar包
文件名 jiebademo
文件名 jiebademo2
文件名 jieba分詞
文件名 navicat for mysql10.0.11簡體中文破解版
文件名 springbootmybatisplus
文件名 springboot實戰資料
文件名 test.txt
文件名 筆記
五.常用io流 之文件字節流
案例1.讀取文件(文件字節輸入流使用。FileInputStream類),用FileInputStream的對象把文件讀入到內存。
public static void demo(){
File f = new File("d:/demo.txt");
FileInputStream fis = null;
System.out.println("文件字節的大小:"+f.length() );
//因爲File沒有讀寫的能力,所以需要使用InputStream
try {
fis = new FileInputStream(f);
//定義一個字節數組,相當於緩存
byte[] bytes = new byte[1024];
int n = 0;//得到實際讀取到的字節數
//循環讀取
while ((n=fis.read(bytes))!=-1){
//把字節轉成String
String s = new String(bytes,0,n);
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//關閉文件流
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
案例2.在內存中寫入字符串,並保存到文件中(文件字節輸出流,FileOutputStream類)。
public static void demo(){
//如果有這個文件,則在這個文件寫入,如果沒有則創建一個文件並寫入
File f = new File("d:/demo.txt");
//字節輸出流
FileOutputStream fos = null;
try {
fos = new FileOutputStream(f);
String s = "你好!";
//定義字節數組
byte[] bytes = new byte[1024];
//如何把String轉化成一個bytes數組
fos.write(s.getBytes());
} catch (Exception e){
e.printStackTrace();
}finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
六.常用io流 之文件字符流
案例.(文件字符輸入輸出流 FileReader FileWriter類)讀取一個文件,並寫入到另一個文件中。
注意:FiileReader和FilerWriter是針對字符操作!而不是字節!
public static void demo(){
//文件讀取字符流對象(輸入流)
FileReader fr = null;
//寫入到文件(輸出流)
FileWriter fw = null;
try{
//創建fr對象
fr = new FileReader("D://demo.txt");
//創建輸出對象
fw = new FileWriter("D:/test2.txt");
int n = 0;//記錄實際讀取到的字符數
//讀取到內存
char[] c = new char[1024];
while((n=fr.read(c)) != -1){
fw.write(c);
}
}catch(Exception e){
e.printStackTrace();
} finally {
try {
fr.close();
fw.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
七.緩衝字符流
爲了提高效率引入了緩衝字符流 BufferReader 和BufferWriter。直接操作String。
public static void demo2(){
BufferedReader br = null;
BufferedWriter bw = null;
FileWriter fw =null;
FileReader fr = null;
try{
fr = new FileReader("D:/demo.txt");
br = new BufferedReader(fr);
fw = new FileWriter("D:/test3.txt");
bw = new BufferedWriter(fw);
String s="";
while ((s = br.readLine()) != null){
//輸出到磁盤
fw.write(s+"\r\n");
}
} catch (Exception e){
e.printStackTrace();
} finally {
try {
fr.close();
fw.close();
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}