JAVA-IO流
1、IO流是什麼?
IO:input和output
輸入和輸出流的意思?
java程序進行數據傳輸的管道!
流就是管道的意思
流:Stream
現實網絡操作中有沒有進行數據輸入輸出的操作?
例如:上網註冊信息的時候對圖片信息的上傳!------上傳 —輸入程序中的輸入流
從網上下載數據的時候,也是數據的傳輸! — 下載 —輸出的操作
在計算機中所以的數據都是以文件的格式存儲的!
在Java中認爲文件是一個對象!!!
Java認爲所以的東西都是對象!
官方解釋:
文件和目錄路徑名的抽象表示形式 (磁盤上的文件和文件夾都是File的對象)
文件就是磁盤上的文件在Java語言中的表示對象!
Class 類—對象—>**.class 在內存中的表現形式
new 類();jvm----class文件 ------>class 對象
File類的對象 就是磁盤上所有的文件 在java語言中對象的表現形式
2、File類的構造方法
File(string pathname):根據一個路徑得到File對象
File(String parent),String child):根據一個目錄和子文件/目錄得到File對象
File(File parent,String child):根據一個父File對象和一個子文件/目錄得到File對象
package IO01;
import java.io.File;
/*
java.io.File類
1.凡是與輸入、輸出相關的類、接口等都定義在java.io包下
2.File是一個類,可以有構造器創建其對象。此對象對應着一個文件(.txt .png .jpg .mp3 .ppt) 或是文件夾(目錄)
3.File類對象是與平臺無關的。
4.File中的方法,僅涉及到如何創建、刪除、重命名等等。
只有涉及文件內容的,File是無能爲力的,必須由IO流來完成。
5.File類的對象常作爲IO流的具體類的構造器形參。
路徑
1.絕對路徑:包括盤符在內的完整文件路徑
2.相對路徑:在當前文件目錄下的文件的路徑
*/
public class Text {
// File(string pathname):根據一個路徑得到File對象
// Java中一個"\"反斜槓代表的是轉義字符的開始標誌,你要是想用“\”,就必須用兩個“\”來表示,或者一個“/”
File file1 = new File("D:\\桌面\\Java_IO流\\IO\\b.txt");
// File(String parent),String child):根據一個目錄和子文件/目錄得到File對象
// java中認爲文件夾是一種特殊的文件,只不過文件夾中的內容是其他的文件或文件夾,而文件中是數據
File file2 =new File("D:\\桌面\\Java_IO流\\IO","b.txt");
// File(File parent,String child):根據一個父File對象和一個子文件/目錄得到File對象
File file=new File("D:\\桌面\\Java_IO流\\IO");
File file3=new File(file,"b.txt");
}
3、File類的成員方法
1、創建功能
public boolean createNewFile():創建文件如果存在這樣的文件,就不創建了
public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
package IO01;
import java.io.File;
import java.io.IOException;
//public boolean createNewFile():創建文件如果存在這樣的文件,就不創建了
//public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
//public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
public class Text1 {
public static void main(String[] args) throws IOException {
//public boolean createNewFile():創建文件如果存在這樣的文件,就不創建了
File file=new File("D:\\桌面\\Java_IO流\\IO\\cc.txt");
boolean newFile = file.createNewFile();//創建一個文件返回一個布爾類型的值
System.out.println(newFile);
//如果沒有指明創建文件的路徑,那麼該文件是在項目路徑下創建
File file1=new File("dd.txt");
boolean newFile1 = file1.createNewFile();
System.out.println(newFile1);
//如果路徑不存在能不能創建
//如果調用該createNewFile方法的時候路勁必須存在
File file2 = new File("D:\\桌面抹布\\Java_IO流\\IO");
boolean newFile2 = file2.createNewFile();
System.out.println(newFile2);
//答案是不能,會報錯IOException,系統找不到指定文件
}
}
package IO01;
import java.io.File;
public class Text2 {
public static void main(String[] args) {
//public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
File file = new File("D:\\桌面\\Java_IO流\\IO\\cccc");
boolean mkdir = file.mkdir();
System.out.println(mkdir);
//public boolean mkdir():創建文件夾,如果存在這樣的文件夾,就不創建了
// 該方法不能創建多重文件夾
File file2 = new File("D:\\桌面\\Java_IO流\\IO\\ccccc\\aaa");
boolean mkdir2 = file2.mkdir();
System.out.println(mkdir2);//false
//public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
//他是用來創建多重文件夾的
File file3 = new File("D:\\桌面\\Java_IO流\\IO\\ccccc\\aaa");
boolean mkdir3 = file3.mkdirs();
System.out.println(mkdir3);//false
//同一個項目下,文件和文件夾不能重名
File file1 = new File("bbbb");
file1.mkdir();
}
}
2、刪除功能
public boolean delete(); 可以用來刪除文件和文件夾
package IO01;
import java.io.File;
//刪除功能
//public boolean delete(); 可以用來刪除文件和文件夾
public class Text3 {
public static void main(String[] args) {
File file = new File("dd.txt");
File file1 = new File("bbbb");
file.delete();
file1.delete();
}
}
3、重命名功能
renameTo
4、判斷功能
package IO01;
import java.io.File;
import java.io.IOException;
//刪除功能
//public boolean delete(); 可以用來刪除文件和文件夾
public class Text3 {
public static void main(String[] args) {
File file = new File("dd.txt");
//判斷這個文件是否存在 exists
boolean newFile = file.exists();
if(newFile){
System.out.println("文件已存在");
}else {
try {
boolean newFile1 = file.createNewFile();
System.out.println(newFile1?"創建成功":"創建失敗");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5、查詢文件
package IO01;
import java.io.File;
import java.io.IOException;
//刪除功能
//public boolean delete(); 可以用來刪除文件和文件夾
public class Text3 {
public static void main(String[] args) {
File file = new File("dd.txt");
boolean newFile = file.exists();
if(newFile){
System.out.println("文件已存在");
}else {
try {
boolean newFile1 = file.createNewFile();
System.out.println(newFile1?"創建成功":"創建失敗");
} catch (IOException e) {
e.printStackTrace();
}
}
//獲取文件大小
File file1 = new File("dd.txt");
long length = file1.length();
System.out.println("size="+length);
//獲取文件名
String name = file1.getName();
System.out.println("filename="+name);
//獲取文件的路徑
String path = file1.getPath();
System.out.println("path="+path);
}
}
String字符串:length(),返回字符串的個數
數組: 數組名.length ,是屬性,獲取數組中元素的個數
集合:集合對象名.size() ,返回集合中元素的個數
6、遞歸*
方法自己調用自己。。
isDirectory():判斷文件是否是文件夾
listFiles():查詢某個文件夾下的所有文件
遍歷 for(數據類型 變量名:數組/集合)
package IO01;
import java.io.File;
//遞歸:找出某個文件夾下所有的文件
public class Text4 {
public static void showFile(String patname){
File file = new File(patname);
//1、判斷文件是否是文件夾
boolean directory = file.isDirectory();
//選擇某個文件夾下所有文件
if (directory){//是文件夾
File[] files = file.listFiles();
for (File tempFile:files){
boolean directory1 = tempFile.isDirectory();
if(directory1){
showFile(tempFile.getPath());
}else{
String path = file.getPath();
System.out.println("普通文件----"+path);
// file.delete(); //刪除
}
}
}else{//不是文件夾
//獲取此文件的路徑
String path = file.getPath();
System.out.println("普通文件----"+path);
// file.delete(); //刪除
}
}
public static void main(String[] args) {
Text4.showFile("D:\\");
}
}
4、File類成員方法—重置版筆記
4.1、訪問文件名
-
getName() //獲取文件名
-
getPath() //獲取文件路徑
-
getAbsoluteFile() //絕對文件名
-
getAbsolutePath() //絕對文件路徑
-
getParent() //獲取上一層文件路徑
-
renameTo(File newName) //把一個文件改成另一個文件
package IO01;
import java.io.File;
public class FileMet {
public static void main(String[] args) {
FileMet fileMet = new FileMet();
fileMet.test1();
}
/*
* getName() //獲取文件名
* getPath() //獲取文件路徑
* getAbsoluteFile() //絕對文件名
* getAbsolutePath() //絕對文件路徑
* getParent() //獲取上一層文件路徑
* renameTo(File newName) //把一個文件改成另一個文件
* */
public void test1(){
File file1 = new File("D:\\桌面\\Java工程\\IO\\Hello.txt");
File file2 = new File("Hello.txt");
File file3 = new File("D:\\桌面\\Java工程\\IO");
System.out.println(file1.getName());
System.out.println(file1.getPath());
System.out.println(file1.getAbsoluteFile());
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getParent());
System.out.println();
System.out.println(file2.getName());
System.out.println(file2.getPath());
System.out.println(file2.getAbsoluteFile());
System.out.println(file2.getAbsolutePath());
System.out.println(file2.getParent());
System.out.println();
System.out.println(file3.getName());
System.out.println(file3.getPath());
System.out.println(file3.getAbsoluteFile());
System.out.println(file3.getAbsolutePath());
System.out.println(file3.getParent());
//renameTo(File newName): 重命名
//file1.renameTo(file2): 將file1重命名爲file2
//要求file1文件一定存在,file2一定不存在
//同是文件或文件目錄
boolean b = file1.renameTo(file2);
System.out.println(b);
}
}
4.2、文件檢測&獲取常規文件信息
-
exists() //判斷這個文件是否存在
-
canWrite() //判斷是否可寫
-
canRead() //判斷是否可讀
-
isFile() //判斷是否爲文件
-
isDirectory() //判斷是否爲文件目錄(文件夾)
-
lastModified() //返回文件最後修改時間
-
length() //返回文件的大小
package IO01;
import java.util.Date;
import java.io.File;
public class FileTest {
public static void main(String[] args) {
FileTest fileTest = new FileTest();
fileTest.test();
}
/*
exists() //判斷這個文件是否存在
canWrite() //判斷是否可寫
canRead() //判斷是否可讀
isFile() //判斷是否爲文件
isDirectory() //判斷是否爲文件目錄(文件夾)
lastModified() //返回文件最後修改時間
length() //返回文件的大小
*/
public void test(){
File file1 = new File("D:\\桌面\\Java工程\\IO\\Hello.txt");
File file2 = new File("D:\\桌面\\Java工程\\IO");
System.out.println(file1.exists());
System.out.println(file1.canWrite());
System.out.println(file1.canRead());
System.out.println(file1.isFile());
System.out.println(file1.isDirectory());
System.out.println(new Date(file1.lastModified()));
System.out.println(file1.length());
System.out.println();
System.out.println(file2.exists());
System.out.println(file2.canWrite());
System.out.println(file2.canRead());
System.out.println(file2.isFile());
System.out.println(file2.isDirectory());
System.out.println(new Date(file2.lastModified()));
System.out.println(file2.length());
}
}
4.3、文件操作相關&目錄操作相關
package IO01;
import java.io.File;
import java.io.IOException;
public class CreateFile {
public static void main(String[] args) throws IOException {
CreateFile createFile = new CreateFile();
createFile.test();
}
/*
文件相關 createNewFile() :創建一個文件
文件夾相關 |delete() //刪除成功返回true
mkDir() :創建一個文件目錄,只有在上層文件目錄存在的情況下,才能返回true
mkDirs() :創建一個文件目錄,若上層文件目錄不存在,一併創建
list() : 字符串形式保存
listFiles()
*/
public void test() throws IOException {
File file1 = new File("D:\\桌面\\Java工程\\IO\\Hello.txt");
System.out.println(file1.delete());
if (!file1.exists()){
boolean newFile = file1.createNewFile();
System.out.println(newFile);
}
File file2 = new File("D:\\桌面\\Java工程\\IO\\IO02");
if (!file2.exists()){
boolean mkdir = file2.mkdir();
System.out.println(mkdir);
//上層文件目錄不存在,無法創建。如果用mkdirs,上層目錄不在,也創建
}
File file3 = new File("D:\\桌面");
String[] list = file3.list();
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
System.out.println();
File[] files = file3.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
}
}
}
5、IO流
輸入input
輸出output
分類:
-
數據單位:字節流(8 bit),字符流(16 bit)
-
流向:輸入流,輸出流
-
角色:節點流,處理流
[抽象基類] | 字節流 | 字符流 |
---|---|---|
輸入流 | InputStream | Reader |
輸出流 | OutputStream | Writer |
1、字節流
FileInputStream
輸入流:InputStream
package Z$IO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class TestFileInputOutputStream {
public static void main(String[] args) throws Exception {
TestFileInputOutputStream test = new TestFileInputOutputStream();
// test.testFileInputStream1();
// test.testFileInputStream2();
test.testFileInputStream3();
}
/*
1.流的分類
按照流向的不同,分爲輸入輸出流
按照處理數據的單位不同,字節流,字符流(處理的文本文件)
按照角色不同,節點流(直接作用於文件上),處理流
1.IO的體系
抽象基類 節點流(文件流)//訪問文件//
InputStream FileInputStream
OutputStream FileOutputStream
Reader FileReader
Writer FileWriter
*/
public void testFileInputStream3(){
FileInputStream fis = null;
try {
File file = new File("Hello.txt");
fis = new FileInputStream(file);
byte[] b = new byte[5];//要讀取到的數據要寫入的數組
int len; //每次讀入到byte中的字節的長度
while ((len=fis.read(b))!=-1){
for (int i = 0; i < len; i++) {
System.out.print((char) b[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis!=null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//使用try-catch的方式處理如下的異常更合理!:保證流的關閉操作一定可以執行
public void testFileInputStream2(){
FileInputStream FIS = null;
try {
//1.創建一個File類的對象
File file = new File("Hello.txt");
//2.創建一個FileInputStream類的對象
FIS = new FileInputStream(file);
//3.調用FileInputStream的方法,實現file文件的讀取。
int b;
while ((b=FIS.read())!=-1){
System.out.print((char) b);
}//一次一個字節,想辦法一次多送幾個字節 詳情見方法3
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("123");
try {
if (FIS!=null) {
//4.關閉相應的流
FIS.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//從硬盤存在的一個文件中,讀取其內容到程序中。使用FileInputStream
//要讀取的文件一定要存在,否則拋FileNoFoundException異常
public void testFileInputStream1() throws Exception {
//1. 創建一個File類的對象。
File file = new File("Hello.txt");
//2. 創建一個FileInputStream類的對象
FileInputStream fileInputStream = new FileInputStream(file);
//3. 調用FileInputStream的方法,實現file文件的讀取。
/*
read():讀取文件的一個字節。當執行到文件結尾時返回-1
*/
// int b=fileInputStream.read();
// while (b!=-1){
// System.out.print((char)b);
// b=fileInputStream.read();
// } //讀取操作
// 簡寫
int b;
while ((b=fileInputStream.read())!=-1){
System.out.print((char)b);
}
//4.關閉相應的流
fileInputStream.close();
}
}
FileOutputStream
輸出流:OutputStream
package Z$IO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileOutputStream {
public static void main(String[] args) {
TestFileOutputStream test = new TestFileOutputStream();
test.testFileOutputStream();
}
/*
1.流的分類
按照流向的不同,分爲輸入輸出流
按照處理數據的單位不同,字節流,字符流(處理的文本文件)
按照角色不同,節點流(直接作用於文件上),處理流
1.IO的體系
抽象基類 節點流(文件流)//訪問文件//
InputStream FileInputStream
OutputStream FileOutputStream
Reader FileReader
Writer FileWriter
*/
public void testFileOutputStream(){
//1.創建一個File對象,表明要寫入的文件位置
//輸出的物理文件可以不存在,當執行過程中,若不存在,會自動創建
File file = new File("HelloWord.txt");
//2.創建一個FileOutputStream的對象,將file的對象作爲形參傳遞給FileOutputStream的構造器中
FileOutputStream fos=null;
try {
fos = new FileOutputStream(file);
//3.寫入的操作
fos.write(new String("I love China").getBytes());
//將一個字符串轉換成字符數組
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.關閉輸出流
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2、字符流
輸入流:Reader
輸出流:Writer
Reader&Writer
package Z$IO;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestFileReader {
public static void main(String[] args) {
TestFileReader testFileReader = new TestFileReader();
// testFileReader.testFileReader();
testFileReader.testFileReaderWriter();
}
/*
使用FileReader FileWriter 可以實現文本文件的複製
對於非文本文件(視頻文件,音頻,圖片等),只能使用字節流!
*/
public void testFileReaderWriter(){
//1.輸入流對應的文件src一定要存在,否則拋異常
//輸出流對應的文件file可以不存在,執行過程中會自動創建
FileReader fr=null;
FileWriter fw=null;
try{
File src = new File("ABC.txt");
File file = new File("ABCD.txt");
//2.
fr=new FileReader(src);
fw = new FileWriter(file);
//3.
char[] chars = new char[24];
int len;
while ((len=fr.read(chars))!=-1){
fw.write(chars,0,len);
}
}catch(Exception e){
e.printStackTrace();
}finally {
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void testFileReader(){
FileReader fr = null;
try {
File file = new File("ABC.txt");
fr = new FileReader(file);
char[] chars = new char[24];//每次讀24個
int len;//記錄長度
while ((len=fr.read(chars))!=-1){
String s = new String(chars, 0, len);
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3、RandomAccessFile類
-
RandomAccessFile類支持“隨機訪問”的方式,程序可以直接跳到文件的任意地方來讀、寫文件
- 支持只訪問文件的部分內容
- 可以向已存在的文件後追加內容
-
RandomAccessFile對象包含一個記錄指針,用以標示當前讀寫處的位置。RandomAccessFile類對象可以自由移動記錄指針:
- long getFilePointer():獲取文件記錄指針的當前位置
- void seek(long pos):將文件記錄指針定位到pos位置
-
構造器
- public RandomAccessFile(File file,String mode)
- public RandomAccessFile(String name,String mode)
-
創建RandomAccessFile類實例需要指定一個mode參數,該參數指定RandomAccessFile的訪問模式:
- r:以只讀方式打開
- rw:打開以便讀取和寫入
- rwd:打開以便讀取和寫入:同步文件內容的更新
- rws:打開以便讀取和寫入:同步文件內容和元數據的更新
package Z$IO;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/*
* RandomAccessFile:支持隨機訪問
*
* 特點:
* 1. 既可以充當一個輸入流,又可以充當一個輸出流
* 2. 支持從文件的開頭讀取、寫入
* 3. 支持從任意位置的讀取、寫入(插入)
* */
public class TestRandomAccessFile {
public void test4(){
//相比於test3更通用
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(new File("HelloWord.txt"),"rw");
raf.seek(4);
byte[] bytes = new byte[10];
int len;
StringBuffer sb = new StringBuffer();
while ((len=raf.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
raf.seek(4);
raf.write("xy".getBytes());
raf.write(sb.toString().getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf!=null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//實現插入的效果,在D字符後面插入"XY" //文本只有一行的時候
public void test3(){
//long getFilePointer():獲取文件記錄指針的當前位置
//void seek(long pos):將文件記錄指針定位到pos位置
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(new File("HelloWord.txt"),"rw");
raf.seek(4);
//把D後邊的取出來
String s = raf.readLine();//讀一行 EFJGhina
// long filePointer = raf.getFilePointer();//獲取當前指針位置
// System.out.println(filePointer);
raf.seek(4);
raf.write("XY".getBytes());
raf.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf!=null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//實現了實際上是覆蓋效果
public void test2(){
//long getFilePointer():獲取文件記錄指針的當前位置
//void seek(long pos):將文件記錄指針定位到pos位置
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(new File("HelloWord.txt"),"rw");
raf.seek(3);
raf.write("XY".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf!=null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//進行文件的讀、寫
public void test1(){
RandomAccessFile raf1 = null;//r 只讀
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile(new File("Hello.txt"),"r");
raf2 = new RandomAccessFile(new File("HelloWord.txt"),"rw");
byte[] bytes = new byte[20];
int len;
while ((len=raf1.read(bytes))!=-1){
raf2.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf2!=null) {
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (raf1!=null) {
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
TestRandomAccessFile tRAF = new TestRandomAccessFile();
// tRAF.test1();
// tRAF.test2();
// tRAF.test3();
tRAF.test4();
}
}
//部分圖片來自網絡,若有侵犯了您的合法權益,請聯繫我刪除