這兩個常用的方法是:read(),從此輸入流中讀取一個數據字節;read(byte[] b),從此輸入流中將最多b.length個字節的數據讀入一個byte數組中;read(byte[] b,int off,int len),從此輸入流中將最多len個字節的數據讀入一個byte數組中;write(byte[] b),將b.length個字節從指定byte數組寫入此文件輸出流中;write(byte [] b,int off,int len),將指定byte數組中從偏移量off開始的len個字節寫入此文件輸出流;write(int b),將指定字節寫入此文件輸出流;close(),關閉流。
①拷貝文件,一個一個字節的拷貝
@Test
public void t1() throws Exception{
FileInputStream fis = new FileInputStream("H:\\javaio\\copy01.txt");//讀取文件
FileOutputStream fos = new FileOutputStream("H:\\javaio\\copy02.txt");//寫
int n;
//這里面是n等於讀取到的字節數,當讀取到末尾時,返回的是-1,所以這里用!=-1來表示沒有讀到文件末尾
while((n = fis.read()) != -1){
fos.write(n);//讀取完畢寫入 H:\\javaio\\copy02.txt"
}
fos.close();
fis.close();
}
②拷貝視屏:1024個字節1024個字節的拷貝
@Test
public void t2() throws IOException{
FileInputStream fis = new FileInputStream("H:\\javaio\\測試.avi");
FileOutputStream fos = new FileOutputStream("H:\\javaio\\測試copy.avi");
byte[] n = new byte[1024];
int len;
//這里是1024個字節的讀取,所以在read()里面放的是每次讀取的字節數
while((len = fis.read(n)) != -1){
fos.write(n, 0, len);
}
fos.close();
fis.close();
}
③利用FileOutputStream將數據寫入文件
@Test
public void t3() throws Exception{
FileOutputStream fos = new FileOutputStream("H:\\javaio\\test1.txt");
fos.write(98);//這里寫入的是ASCII碼
//注意這里的getBytes(),這個是String類里面的方法,使用平台的默認字符集將此 String 編碼為 byte 序列,並將結果存儲到一個新的 byte 數組中
fos.write("sadsadsada".getBytes());
fos.close();
}
④實現對文件內容的追加,即不會覆蓋掉原來的內容,在末尾繼續添加
@Test
public void t4() throws Exception{
//從基礎流考慮追加,在以后遇到的一些追加中,都要從基礎流來考慮,即都是在FileOutputStream這個基礎流上來實現添加的
FileOutputStream fos = new FileOutputStream("H:\\javaio\\qianfengwrite1.txt",true);
fos.write(98);
fos.write("sadsadsada".getBytes());
fos.close();
}
⑤對文件的讀取
@Test
public void t5() throws Exception{
FileInputStream fis = new FileInputStream("H:\\javaio\\qianfengwrite1.txt");
int len;
while((len = fis.read()) != -1){
System.out.print((char)len);
}
fis.close();
}
例題:將E盤的文本文檔的內容復制到c盤中
public static void main(String[]args){
try {
FileInputStream in=new FileInputStream("E:\\ee\\title.txt");
FileOutputStream out=new FileOutputStream("C:\\復制.txt");
byte[]b=new byte[12];
int len=0;
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
用字節流FileInputStream和FileOutputStream來讀寫文件
public class File_Stream {
public static void main(String[] args) throws IOException {
Scanner sca=new Scanner(System.in);
//寫文件
System.out.print("請輸入文件名:");
String name=sca.next();
File file=new File(name+".txt");//文件名 相對路徑(項目名根目錄下)
// FileOutputStream fs=new FileOutputStream(file); //如果文件存在 覆蓋
FileOutputStream fos=new FileOutputStream(file,true);//true表示追加,如果文件存在 向里面繼續添加內容
System.out.println("請輸入寫入的內容:");
String str=sca.next();
byte bytes[]=str.getBytes(); //FileOutputStream 是基於字節流 把要寫入的信息 保存到字節數組中
fos.write(bytes,0,bytes.length);//將字節數組中全部內容寫到文件中 從0—數組的長度
fos.close();//關閉流
System.out.println("文件寫入成功!");
//讀文件
FileInputStream fis=new FileInputStream(file);
byte bt[]=new byte[1024];//1KB 每次最多讀取的1KB 根據文件大小而定
int temp=0;
while((temp=fis.read(bt))!=-1){ //將數據保存到數組(緩沖區)中 並返回讀取的字節數 -1表示讀完了
System.out.println(new String(bt,0,temp));//輸出數組中保存內容 按照每次讀取的字節數
}
fis.close();
}
}
用字節流FileInputStream和FileOutputStream來Copy文件
package FileStream;
import java.io.*;
public class File_Copy {
public static void main(String[] args) throws IOException {
File file=new File("dome.txt");
if(!file.isFile()){ //判斷文件是否存在
System.out.println("該文件不存在,無法Copy!");
return;
}
FileInputStream fis=new FileInputStream(file); //"src\\"+file.getName()
FileOutputStream fos=new FileOutputStream("src/"+file.getName());//把文件拷(輸出)到src下
byte bytes[]=new byte[1024];
int temp=0; //邊讀邊寫
while((temp=fis.read(bytes))!=-1){ //讀
fos.write(bytes,0,temp); //寫
}
fis.close();
fos.close();
System.out.println("文件拷貝成功!");
}
}
---------file常用的屬性和方法-------
代碼如下:
public class FileDemo {
public static void main(String[] args){
//構造函數File(String pathname)
File f1 =new File("c:\\abc\\1.txt");
//File(String parent,String child)
File f2 =new File("c:\\abc","2.txt");
//File(File parent,String child)
File f3 =new File("c:"+File.separator+"abc");//separator 跨平台分隔符
File f4 =new File(f3,"3.txt");
System.out.println(f1);//c:\abc\1.txt
}
}
//***************************************************************************************************************************************************
//通過上傳文件的名字刪除上傳的文件(刪除服務器上的文件)
//strPath url ,fileName 文件名
public void refreshFileList(String strPath,String fileName) {
File dir = new File(strPath);
File[] files = dir.listFiles();
if (files == null)
{
System.out.println("該目錄下沒有任何一個文件!");
return;
}
for (int i = 0; i < files.length; i++) {
//一個目錄則返回true isDirectory檢查是不是文件夾 是返回true
if (files[i].isDirectory()) {
refreshFileList(files[i].getAbsolutePath(),fileName);
}else {
//獲取到每一個文件的根目錄轉換成小寫
String strFileName = files[i].getAbsolutePath().toLowerCase();
//
if(strFileName.endsWith(fileName)){
System.out.println("正在刪除:" + strFileName);
files[i].delete();
}
}
}
}
//刪除本地的文件夾
String path = Config.version_url+fileName;//文件所在的目錄
File file = new File(path);
if(file.exists()&&(!file.isDirectory())){
file.delete();
}
//**********************************************************************************************************************************************
創建方法
String path ="E:\\data\\a\\b\\c";
Boolean result = new File(path).mkdir();//當c的父目錄存在時 返回true當c的父目錄不存在時 返回false
System.out.println(result);
//******************************************************************************************************************************
String path ="E:\\data\\a\\b\\c";
Boolean result = new File(path).mkdirs();//當c父的目錄不存在時,mkdirs會創建父目錄 返回true
System.out.println(result);
System.in.read();
//******************************************************************************************************************************
1.boolean createNewFile() 不存在返回true 存在返回false
2.boolean mkdir() 創建目錄
3.boolean mkdirs() 創建多級目錄
String path ="D:\\data\\a\\b\\c";
File file = new File(path); //讀取文件
Boolean result = file.mkdirs(); //創建多級目錄
/**
* .exists()測試此抽象路徑名表示的文件或目錄是否存在.文件或目錄存在時,返回true;否則返回false;
* .isDirectory()是檢查一個對象是否是文件夾返回值是boolean類型的。如果是則返回true,否則返回false。
調用方法為:對象.isDirectory() 無需指定參數。
*
*/
if(!file.exists() && !file.isDirectory()){
System.out.println("文件不存在");
}
System.err.println(result); //true
//*******************************************************************************************************************************************************
文件下載
@RequestMapping(value="/appDownloadImg.action",method= {RequestMethod.GET})
@ResponseBody
//downloadURL 要下載文件名字
public Response appDownloadImg(String downloadURL,HttpServletResponse response){
Response result = new Response ();
try{
if(StringUtils.isEmpty ( downloadURL )){
result.setError ( "下載路徑不可以為空!" );
result.setSuccess ( false );
return result;
}
String file_url = Config.upload_url+downloadURL;//文件得根目錄 如:Root/a/ddd/dasdasdasd_sdad.zip
File f = new File(file_url);
if(f.exists()){
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadURL, "UTF-8"));
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(f);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
}
catch (Exception e) {
throw new Exception(e.getMessage());
}
finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}catch(Exception e){
e.printStackTrace();
response.setHeader("content-type","application/json");
result.setSuccess(false);
result.setError("下載失敗");
try{
response.getWriter().println( JSONObject.fromObject(result).toString());
}catch(Exception e1){
e1.printStackTrace();
}
}
result.setError ( "下載成功!" );
return result;
}
JAVA遍歷文件下的所有文件和文件夾
@Test
public void traverseFolder1( ) {
String path = "D:\\TEST";
int fileNum = 0;
int folderNum = 0;
int foldeNum = 0;
File file = new File(path);
if (file.exists()) {
LinkedList<File> list = new LinkedList<File>();
//list()方法是返回某個目錄下的所有文件和目錄的文件名,返回的是String數組
//listFiles()方法是返回某個目錄下所有文件和目錄的絕對路徑,返回的是File數組
File[] files = file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {
System.out.println("文件夾:" + file2.getAbsolutePath());
list.add(file2);
foldeNum++;
} else {
System.out.println("文件:" + file2.getAbsolutePath());
fileNum++;
}
}
File temp_file;
while (!list.isEmpty()) {
temp_file = list.removeFirst();//刪除第一個元素,也就是找到數組中的第一個元素返回一個File去判斷,說白了就是循環分別找到每個文件下面對應的是文件還是文件夾,如果循環下一級還是文件夾則繼續循環直到結束(思想就是一層一層去判斷查找知道找到所有的文件和文件夾)
files = temp_file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {//如果是個目錄(文件夾)則返回true
System.err.println("文件夾:" + file2.getAbsolutePath());
list.add(file2);
folderNum++;
} else {//輸出文件
System.out.println("文件:" + file2.getAbsolutePath());//返回文件的完整路徑。
fileNum++;
}
}
}
} else {
System.out.println("文件不存在!");
}
System.out.println("文件夾共有:" + folderNum + ",文件共有:" + fileNum);
}
例子:
LinkedList list=new LinkedList();
list.add("a");
list.add(1);
list.add('b');
String kk=(String) list.removeFirst(); // (String) 這代表強制轉換 原理同上
char k=(char) list.removeLast();//刪除最后一個元素
System.out.println(kk);
System.out.println(k);
}
}
結果為:
a
b
//讀取文件按指定的格式輸出到指定的位置
public static List readFile() throws FileNotFoundException{
//讀
File file = new File("D:\\新建文本文檔 (5).txt");
//寫
FileOutputStream fos = new FileOutputStream("D:\\result.txt");
List list = new ArrayList();
try {
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader io = new InputStreamReader(fileInputStream,"gbk");
BufferedReader reader = new BufferedReader(io);
String terminalInfo = null;
while((terminalInfo=reader.readLine())!=null){//循環讀取每一行內容
list.add(terminalInfo); //放入到集合當中
}
reader.close();
io.close();
fileInputStream.close();
BufferedOutputStream bOutputStream = new BufferedOutputStream(fos);//寫
String result = "";
for(int i = 0;i < list.size();i++)
{
String add = "INSERT INTO `excel_title` VALUES (%s, '%s', '%s');\n";//按指定格式拼接
String[] tmp = list.get(i).toString().split(" ");
String id = tmp[0];
String title = tmp[1];
String insert = String.format(add, (i + 1) + "",id,title);
result = result + insert;
}
bOutputStream.write(result.getBytes("gbk"));//寫入
bOutputStream.flush();
bOutputStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
}
return list;
}
//*******************************************************************************************************************************************************
//將文件大小轉換轉換成 "B", "KB", "MB", "GB", "TB"
public static String readableFileSize(long size) { if (size <= 0) return "0"; final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};//直接給數組賦值 int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; }
刪除方法
1.boolean delete()
2.boolean deleteOnExit() 文件使用完成后刪除
import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args){
File f =new File("d:\\1.txt");
try {
System.out.println(f.createNewFile());//當文件存在時返回false
System.out.println(f.delete());//當文件不存在時返回false
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
列出磁盤下的文件和文件夾
public class FileDemo3 {
public static void main(String[] args){
File[] files =File.listRoots();
for(File file:files){
System.out.println(file);
if(file.length()>0){
String[] filenames =file.list();
for(String filename:filenames){
System.out.println(filename);
}
}
}
}
}
文件過濾
import java.io.File;
import java.io.FilenameFilter;
public class FileDemo4 {
public static void main(String[] args){
File[] files =File.listRoots();
for(File file:files){
System.out.println(file);
if(file.length()>0){
String[] filenames =file.list(new FilenameFilter(){
//file 過濾目錄 name 文件名
public boolean accept(File file,String filename){
return filename.endsWith(".mp3");
}
});
for(String filename:filenames){
System.out.println(filename);
}
}
}
}
}
File[] listFiles()
File[] listFiles(FilenameFilter filter)
利用遞歸列出全部文件
public class FileDemo5 {
public static void main(String[] args){
File f =new File("e:\\音樂");
showDir(f);
}
public static void showDir(File dir){
System.out.println(dir);
File[] files =dir.listFiles();
for(File file:files){
if(file.isDirectory())
showDir(file);
else
System.out.println(file);
}
}
}
//讀取壓縮文件里面的文件,不需要解壓 ,讀取指定得文件和內容。
假如我們讀取的是 “D:\\測試1.zip”;測試文件該文件下面有四個文件我們只讀取 “20887027411111110156_20180105_業務明細.csv” 這個文件
該文件里面的內容:
我們只要支付寶交易號,其余的不要我們應該怎么讀取?
@Test
public void sss() throws Exception{
//獲取文件輸入流
FileInputStream input = new FileInputStream("D:\\測試1.zip");
//獲取ZIP輸入流(一定要指定字符集Charset.forName("GBK")否則會報java.lang.IllegalArgumentException: MALFORMED)
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
//定義ZipEntry置為null,避免由於重復調用zipInputStream.getNextEntry造成的不必要的問題
ZipEntry ze = null;
//循環遍歷
while ((ze = zipInputStream.getNextEntry()) != null) {
String[] split = ze.getName().split("_");
if(split.length == 3){
if("業務明細".equals(split[2].substring(0,split[2].lastIndexOf(".")))){
System.out.println("文件名:" + ze.getName() + " 文件大小:" + ze.getSize() + " bytes");
BufferedReader br = new BufferedReader(new InputStreamReader(zipInputStream,Charset.forName("GBK")));
String line;
//內容不為空,輸出
List<String> list = new ArrayList<>();
while ((line = br.readLine()) != null) {
String strr = line.trim();
String[] abc = strr.split(",");
String businesNumbers = abc[0];
//是數字開頭並且是不是“#號”開頭
if(isNumbers(businesNumbers) && !businesNumbers.contains("#") ){
System.out.println("支付寶交易號:"+businesNumbers);
}
}
}
}
}
//一定記得關閉流
zipInputStream.closeEntry();
input.close();
}
/**
* 判斷是不是數字
* @param businesNumbers
* @return
*/
public static boolean isNumbers(String businesNumbers){
Pattern pattern = Pattern.compile("[0-9].*") ;
Matcher isNum = pattern.matcher(businesNumbers.charAt(0)+"");
if (!isNum.matches()) {
return false;
}
return true;
}
打印結果:
支付寶交易號:2018010521001004610298615123
支付寶交易號:2018010521001004610298615123
支付寶交易號:2018010521001004610298046342
支付寶交易號:2018010521001004610298046342
支付寶交易號:2018010521001004610298046371
移動文件
找出d盤下所有的 .java 文件,拷貝至 c:\jad 目錄下,並將所有文件的類型由.java 修改為.jad 。
public class Test5 {
public static void main(String[] args){
File f1 = new File("d:\\");
moveFile(f1);
} public static void moveFile(File dir){
File[] files=dir.listFiles();
for(File file:files){
if(file.isDirectory())
moveFile(file);
else{
if(file.getName().endsWith(".java"))
file.renameTo(new File("c:\\jad\\"+
file.getName().substring(0,file.getName().lastIndexOf('.'))+".jad"));
}
}
}
}
1 常用方法
a、createNewFile方法
public boolean createNewFile() throws IOException
該方法的作用是創建指定的文件。該方法只能用於創建文件,不能用於創建文件夾,且文件路徑中包含的文件夾必須存在。
方法介紹:當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
使用: File file = new File("D:\\test\\1.txt"); boolean res = file.createNewFile(); if(!res)System.out.println("創建失敗!");
如果D:/test 目錄下沒有 1.txt文件,則創建該文件;如果沒有test目錄,直接拋出異常,如果1.txt已經存在,那么文件創建失敗。
可以得知,createNewFile() 方法,根據抽象路徑創建一個新的空文件,當抽象路徑制定的文件存在時,創建失敗。
b、delete方法
public boolean delete()
該方法的作用是刪除當前文件或文件夾。如果刪除的是文件夾,則該文件夾必須為空。如果需要刪除一個非空的文件夾,則需要首先刪除該文件夾內部的每個文件和文件夾,然后在可以刪除,這個需要書寫一定的邏輯代碼實現。
c、exists方法
public boolean exists()
該方法的作用是判斷當前文件或文件夾是否存在。
d、getAbsolutePath方法
public String getAbsolutePath()
該方法的作用是獲得當前文件或文件夾的絕對路徑。例如c: est1.t則返回c: est1.t.
e、getName方法
public String getName()
該方法的作用是獲得當前文件或文件夾的名稱。例如c: est1.t,則返回1.t.
f、getParent方法
public String getParent()
該方法的作用是獲得當前路徑中的父路徑。例如c: est1.t則返回c: est.
g、isDirectory方法
public boolean isDirectory()
該方法的作用是判斷當前File對象是否是目錄。
h、isFile方法
public boolean isFile()
該方法的作用是判斷當前File對象是否是文件。
i、length方法
public long length()
該方法的作用是返回文件存儲時占用的字節數。該數值獲得的是文件的實際大小,而不是文件在存儲時占用的空間數。
j、list方法
public String[] list()// 並不包含其屬性。
該方法的作用是返回當前文件夾下所有的文件名和文件夾名稱。說明,該名稱不是絕對路徑。
k、listFiles方法
public File[] listFiles()
該方法的作用是返回當前文件夾下所有的文件對象。包含其屬性。
獲取文件的名字:文件.getOriginalFilename ();
//獲取文件的大小
Long fileSize = apk_name.getSize();
l、mkdir方法
public boolean mkdir()
該方法的作用是創建當前文件文件夾,而不創建該路徑中的其它文件夾。假設d盤下只有一個test文件夾,則創建d: estabc文件夾則成功,如果創建d:a文件夾則創建失敗,因為該路徑中d:a文件夾不存在。如果創建成功則返回true,否則返回false.
m、mkdirs方法
public boolean mkdirs()
該方法的作用是創建文件夾,如果當前路徑中包含的父目錄不存在時,也會自動根據需要創建。
n、renameTo方法
public boolean renameTo(File dest)
該方法的作用是修改文件名。在修改文件名時不能改變文件路徑,如果該路徑下已有該文件,則會修改失敗。
o、setReadOnly方法
public boolean setReadOnly()
該方法的作用是設置當前文件或文件夾為只讀。
p、File(String pathname)
public File(String pathname)
可以使用絕對路徑也可以使用相對路徑。
q、File(String parent, String child)
public File(String parent, String child)
也可以使用父路徑和子路徑結合,實現代表文件路徑。
2 常用屬性
CanWrite():返回文件是否可寫。
CanRead():返回文件是否可讀。
CompareTo(File pathname):檢查指定文件路徑間的順序。
Delete():從文件系統內刪除該文件。
DeleteOnExit():程序順利結束時從系統中刪除文件。
Equals(Object obj):檢查特定對象的路徑名是否相等。
Exists():判斷文件夾是否存在。
GetAbsoluteFile():返回文件的完整路徑。
GetAbsolutePath():返回文件的完整路徑。
GetName():返回文件名稱。
GetParent():返回文件父目錄路徑。
GetPath():返回文件的潛在相對路徑。
GetParentFile():返回文件所在文件夾的路徑。
HashCode():返回文件哈希碼。
IsDirectory():判斷該路徑指示的是否是文件夾。
IsFile():判斷該路徑指示的是否是文件。
LastModified() :返回文件的最后修改時間標志。
Length():返回文件長度。
List():返回文件和目錄清單。
Mkdir():生成指定的目錄。
RenameTo(File dest):更名文件。
SetReadOnly():將文件設置為可讀。
ToString():返回文件狀態的字符串。
ToURL():將文件的路徑字符串轉換成URL