在項目中一般都會遇到文件的讀寫,
一般有兩個問題要進行處理
1路徑問題
2讀寫問題
路徑的解決方法
路徑之間的連接”//”=”\”=”/”
eg1:D盤下面file文件夾裡面的1.txt
path=”D://file//1.txt”
path=”D:/file/1.txt”
path=”D:\file\1.txt”
這三種都可以
1絕對路徑(堅決不推薦使用)
就是從電腦的根目錄開始C盤D盤,詳情參考eg1
2相對路徑
java項目中默認是從項目的根目錄開始的 如下圖

獲取到該目錄下的所有文件(獲取的是一個目錄)
./ 獲取到當前根目錄
- String path=”./”;
- File f=new File(path);
- File[] files=f.listFiles();
- for(int i=0;i<files.length;i++){
- System.out.println(files[i].getName());
- }
../ 獲取到根目錄下的父目錄 想要獲取到多級的父目錄只需要../ 寫n個就好了(需要注意的是這種方法最大只能獲取到 Windows盤下面的根目錄,就是最多只能獲取到 C盤 或者D盤,不可能和Linux 那種 /root/D)web 項目中
主要是分清楚 工作空間和發布空間就好了
比如當初使用struts2文件上傳的時候
定義接受文件的目錄
ServletContext servletContext = ServletActionContext.getServletContext();
String str=servletContext.getRealPath(“/files/”+fileFileName);
eclipse暫時出了點小問題等會再寫這個
讀寫文件(如果不正確歡迎積極指出,一起進步)
因為文件有不同的格式,就文本文件來說有utf-8 GBK 等等
建議使用位元組流 ( InputStream是所有位元組輸入流的祖先,而OutputStream是所有位元組輸出流的祖先)進行讀取而不是字元流( Reader是所有讀取字元串輸入流的祖先,而writer是所有輸出字元串的祖先)
其實就是內部一個使用byte[]實現,一個是用char[] 這個可以看一下 JDK的源碼就了解了
具體 字元流位元組流之間的區別請看轉載處
- http://blog.csdn.net/zxman660/article/details/7875799
- http://blog.csdn.net/cynhafa/article/details/6882061
- 讀寫文件
- package com.wzh.utils;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- public class InOutFile {
- /**
- * @param file null、一個文件、一個文件目錄、
- * <pre>
- * fileToByte(null)=null
- * fileToByte(file)=null file>2G
- * fileToByte(文件目錄)=null
- * fileToByte(file)=byte[]
- * </pre>
- * @return null(文件不存在,null,文件目錄,文件太大>2G) byte[](轉換成功)
- */
- public byte[] fileToByte(File file) {
- byte[] buffer = null;
- if (file == null) {
- throw new IndexOutOfBoundsException();
- }
- if (file.isDirectory())
- return buffer;
- if (file.length() > Integer.MAX_VALUE)
- return buffer;
- if (file.isFile()) {
- int filelength = (int) file.length();
- InputStream inputStream = null;
- BufferedInputStream bufferedInputStream = null;
- OutputStream outputStream=null;
- BufferedOutputStream bufferedOutputStream=null;
- File outfile=new File(“files//out//”+file.getName());
- int n = 0;
- int off = 0;
- int length = 4096;
- try {
- if(!outfile.exists())
- outfile.createNewFile();
- inputStream = new FileInputStream(file);
- outputStream=new FileOutputStream(outfile, true);
- bufferedInputStream = new BufferedInputStream(inputStream);
- bufferedOutputStream=new BufferedOutputStream(outputStream);
- buffer = new byte[filelength];
- /*
- * 添加(length <= filelength – off) ? length : filelength – off)的比較
- * 為了防止讀到最後buffer 剩餘的長度沒有4096 裝不下那麼多會導致讀取不了IndexOutOfBoundsException()
- * 當filelength – off=0時表示文件讀取完畢但是read內部認為是其他線程佔用io導致堵塞並不會認為文件讀取完畢
- * 所以要添加上filelength – off>0
- */
- while ((filelength – off) > 0 && (n = bufferedInputStream.read(buffer, off,
- ((length <= filelength – off) ? length : filelength – off))) >= 0) {
- bufferedOutputStream.write(buffer, off, n);
- off += n;
- }
- }
- catch (Exception e) {
- }
- finally {
- closeInputStream(bufferedInputStream);
- closeInputStream(inputStream);
- closeOutputStream(bufferedOutputStream);
- closeOutputStream(outputStream);
- System.out.println(“end”);
- }
- }
- return buffer;
- }
- /**
- * close inoutstream
- * @param inputStream null or the inputstream’s child
- */
- private void closeInputStream(InputStream inputStream) {
- if (inputStream == null)
- return;
- try {
- inputStream.close();
- }
- catch (Exception e) {
- }
- }
- /**
- * close outputStream
- * @param outputStream null or the outputStream child
- */
- private void closeOutputStream(OutputStream outputStream) {
- if (outputStream == null)
- return;
- try {
- outputStream.flush();
- outputStream.close();
- }
- catch (Exception e) {
- }
- }
- }
當然字元流也可以進行讀取文件
字元流也可以進行讀取文件只不過要指定文件(文本文件)的編碼
- /**
- * 創建不同格式的文本文件
- * @throws Exception
- */
- private void createFile() throws Exception {
- File file = new File(“files//kindsformat//utf//1.txt”);
- //File file = new File(“files//kindsformat//gbk//1.txt”);
- if (!file.exists())
- file.createNewFile();
- Writer writer = new OutputStreamWriter(new FileOutputStream(file, true), “UTF-8”);
- //Writer writer = new OutputStreamWriter(new FileOutputStream(file), “GBK”);
- BufferedWriter bufferedWriter = new BufferedWriter(writer);
- bufferedWriter.write(“我是中文測試啊測試啊”);
- bufferedWriter.flush();
- bufferedWriter.close();
- writer.close();
- }
有不對的地方歡迎指出,謝謝
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/275378.html