人不該被語言束縛,咱們最重要的是思想。而思想絕對凌駕於語言之上。
javascript
語言對比手冊是我一直想寫的一個系列:通過認真思考,我決定從縱向和橫行兩個方面
來比較Java,Kotlin,Javascript,C++,Python,Dart,六種語言。
縱向版按知識點進行劃分,總篇數不定,橫向版按語言進行劃分,共6篇。其中:html
Java基於jdk8
Kotlin基於jdk8
JavaScript基於node11.10.1,使用ES6+
C++基於C++14
Python基於Python 3.7.2
Dart基於Dart2.1.0
複製代碼
文件操做是做爲每一個編程語言必備的模塊,本文將看一下六種語言對文件的操做java
G:/Out/language/java/應龍.txt
/**
* 建立文件
*
* @param path 文件路徑
*/
private static void mkFile(String path) {
File file = new File(path);//1.建立文件
if (file.exists()) {//2.判斷文件是否存在
return;
}
File parent = file.getParentFile();//3.獲取父文件
if (!parent.exists()) {
if (!parent.mkdirs()) {//4.建立父文件
return;
}
}
try {
file.createNewFile();//5.建立文件
} catch (IOException e) {
e.printStackTrace();
}
}
|-- 使用
String path = "G:/Out/language/java/應龍.txt";
mkFile(path);
複製代碼
/**
* 字符流插入
*
* @param path 路徑
* @param content 內容
*/
private static void writeStr(String path, String content) {
File file = new File(path);
FileWriter fw = null;
try {
fw = new FileWriter(file);//建立字符輸出流
fw.write(content);//寫入字符串
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw != null) {
fw.close();//關流
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
|-- 使用
String path = "G:/Out/language/java/應龍.txt";
String content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
writeStr(path, content);
複製代碼
/**
* 使用字符編碼寫入
* @param path 路徑
* @param content 內容
* @param encoding 編碼
*/
private static void writeStrEncode(String path, String content, String encoding) {
OutputStreamWriter osw = null;
try {
FileOutputStream fos = new FileOutputStream(path);
osw = new OutputStreamWriter(fos, encoding);
osw.write(content);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (osw != null) {
osw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
|-- 使用
String pathGBK = "G:/Out/language/java/應龍-GBK.txt";
String pathUTF8 = "G:/Out/language/java/應龍-UTF8.txt";
mkFile(path);
String content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
writeStrEncode(pathGBK, content, "GBK");
writeStrEncode(pathUTF8, content, "UTF-8");
複製代碼
/**
* 讀取字符文件
* @param path 路徑
* @param encoding 編碼格式
* @return 文件字符內容
*/
private static String readStrEncode(String path, String encoding) {
InputStreamReader isr = null;
try {
FileInputStream fis = new FileInputStream(path);
isr = new InputStreamReader(fis, encoding);
StringBuilder sb = new StringBuilder();
int len = 0;
char[] buf = new char[1024];
while ((len = isr.read(buf)) != -1) {
sb.append(new String(buf, 0, len));
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (isr != null) {
isr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
|-- 使用
String result = readStrEncode(pathUTF8, "UTF-8");
//String result = readStrEncode(pathUTF8, "GBK");
System.out.println(result);
複製代碼
|-- 遍歷language文件夾---------------------------------------------
/**
* 掃描文件夾
* @param dir 文件夾
*/
private static void scan(String dir) {
File fileDir = new File(dir);
File[] files = fileDir.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
if (file.isDirectory()) {
scan(file.getAbsolutePath());
}
}
}
|-- 重命名-----------------------------------------------------------
String path = "G:/Out/language/java/應龍.txt";
File file = new File(path);
File dest = new File(file.getParent(), "應龍-temp.txt");
file.renameTo(dest);
|-- 獲取磁盤空間----------------------------------------------------
long space = dest.getUsableSpace();//獲取該磁盤可用大小
System.out.println(space * 1.f / 1024 / 1024 / 1024 + "G");//260.25247G
long freeSpace = dest.getFreeSpace();//同上
System.out.println(freeSpace * 1.f / 1024 / 1024 / 1024 + "G");//260.25247G
long totalSpace = dest.getTotalSpace();//獲取該磁盤總大小
System.out.println(totalSpace * 1.f / 1024 / 1024 / 1024 + "G");//316.00098G
|-- 修改日期-----------------------------------------------------
String time = new SimpleDateFormat("yyyy/MM/dd a hh:mm:ss ")
.format(dest.lastModified());
System.out.println(time);
|--刪除文件-----------------------------------------------
dest.delete();//刪除文件
複製代碼
|-- 寫相關
File fileUTF8 = new File(pathUTF8);
fileUTF8.setWritable(false);//不可寫
fileUTF8.setWritable(true);//可讀
fileUTF8.canWrite();//是否可寫--false
|-- 寫相關
fileUTF8.canRead();//是否可讀--true
fileUTF8.setReadable(false);//不可寫讀
fileUTF8.setReadable(true);//可讀
fileUTF8.setReadOnly();//只讀
複製代碼
/**
* 建立文件
*
* @param path 文件路徑
*/
private fun mkFile(path: String) {
val file = File(path)//1.建立文件
if (file.exists()) {//2.判斷文件是否存在
return
}
val parent = file.parentFile//3.獲取父文件
if (!parent.exists()) {
if (!parent.mkdirs()) {//4.建立父文件
return
}
}
try {
file.createNewFile()//5.建立文件
} catch (e: IOException) {
e.printStackTrace()
}
}
|-- 使用
val path = "G:/Out/language/kotlin/應龍.txt"
mkFile(path)
複製代碼
挺爽的,簡潔明瞭。固然用java的api也是能夠的node
val content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
val file = File(path)
file.writeText(content)
複製代碼
Charset默認居然只有這幾個,但看一下源碼,能夠用
Charset.forName
來建立Charset
python
//指定編碼寫入
String content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
val pathGBK = "G:/Out/language/kotlin/應龍-GBK.txt"
val pathUTF8 = "G:/Out/language/kotlin/應龍-UTF8.txt"
val gbk = Charset.forName("GBK")//建立Charset
File(pathGBK).writeText(content, gbk)
File(pathUTF8).writeText(content, Charsets.UTF_8)
複製代碼
感受蠻爽的,各類花式玩法c++
|------ 一次讀完
val pathUTF8 = "G:/Out/language/kotlin/應龍-UTF8.txt"
val result = File(pathUTF8).readText(Charsets.UTF_8)
//val result = File(pathUTF8).readText(Charset.forName("GBK"))
println(result)
//|--------按行讀取
File(pathUTF8).forEachLine {
println(it)
}
//|--------讀取幾行
File(pathUTF8).readLines().take(2).forEach{
println(it)
}
//|------File直接各類開流,注意它們的類型
val fileUTF8 = File(pathUTF8)
val isr = fileUTF8.reader(Charsets.UTF_8)//InputStreamReader
val osw = fileUTF8.writer(Charsets.UTF_8)//OutputStreamWriter
val fis = fileUTF8.inputStream()//FileInputStream
val fos = fileUTF8.outputStream()//FileOutputStream
val br = fileUTF8.bufferedReader(Charsets.UTF_8)//BufferedReader
val bw = fileUTF8.bufferedWriter(Charsets.UTF_8)//BufferedWriter
val pw = fileUTF8.printWriter(Charsets.UTF_8)//PrintWriter
複製代碼
|-- 遍歷language文件夾---------------------------------------------
val dir = "G:/Out/language";
File(dir).walk().maxDepth(2)//深度
.filter {it.absolutePath.contains("kotlin")}//過濾
.forEach { println(it.absolutePath)//操做
}
|-- 重命名-----------------------------------------------------------
val file = File(path)
val dest = File(file.parent, "應龍-temp.txt")
file.renameTo(dest)
|-- 獲取磁盤空間----------------------------------------------------
val space = dest.usableSpace//獲取該磁盤可用大小
println((space * 1f / 1024f / 1024f / 1024f).toString() + "G")//260.25247G
val freeSpace = dest.freeSpace//同上
println((freeSpace * 1f / 1024f / 1024f / 1024f).toString() + "G")//260.25247G
val totalSpace = dest.totalSpace//獲取該磁盤總大小
println((totalSpace * 1f / 1024f / 1024f / 1024f).toString() + "G")//316.00098G
|-- 修改日期-----------------------------------------------------
val time = SimpleDateFormat("yyyy/MM/dd a hh:mm:ss ")
.format(dest.lastModified())
println(time)
|--刪除文件-----------------------------------------------
dest.delete();//刪除文件
複製代碼
|-- 寫相關
val fileUTF8 = File(pathUTF8)
fileUTF8.setWritable(false)//不可寫
fileUTF8.setWritable(true)//可讀
fileUTF8.canWrite()//是否可寫--false
|-- 寫相關
fileUTF8.canRead();//是否可讀--true
fileUTF8.setReadable(false);//不可寫讀
fileUTF8.setReadable(true);//可讀
fileUTF8.setReadOnly();//只讀
複製代碼
|-- 建立文件夾--------------------------------------
|-- {recursive: true}表示可遞歸建立
const fs = require("fs");
let path = "G:/Out/language/javascript";
fs.mkdir(path, {recursive: true}, function (err) {
if (err) {
console.log(err);
}
console.log("建立ok");
});
|-- 建立文件--------------------------------------
fs.writeFile(path + "/應龍.txt", "", (err) => {
if (err) throw err;
console.log('文件建立完成');
});
複製代碼
writeFile的同步異步git
let content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
|--- 異步寫入
fs.writeFile(path + "/應龍.txt", content, (err) => {
if (err) throw err;
console.log('文件已保存');
})
|--- 同步寫入
fs.writeFileSync(path + "/應龍.txt","writeFileSync");
複製代碼
默認node不支持GBK...,可經過:第三方模塊iconv-lite來轉換編碼github
//指定編碼寫入
String content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
fs.writeFile(path + "/應龍-UTF8.txt", content, {encoding: 'utf8'}, (err) => {
if (err) throw err;
console.log('文件已保存');
});
複製代碼
|--- 異步讀取
fs.readFile(path + "/應龍.txt", (err, data) => {
if (err) throw err;
console.log(data.toString());
});
|--- 同步讀取
let data = fs.readFileSync(path + "/應龍.txt").toString();
console.log(data);
|--- open方法+read(文件描述符,緩衝區,緩衝區偏移量,字節數,起始位置,回調函數)+close
let buf = new Buffer.alloc(1024);
fs.open(pathDir + "/應龍-temp.txt", "r+", (err, fd) => {
if (err) throw err;
fs.read(fd, buf, 0, buf.length, 0, (err, bytes, buffer) => {
console.log(bytes);//字節長度
console.log(buffer.toString());//數據
fs.close(fd, function (err) {// 關閉文件
if (err) throw err;
console.log("文件關閉成功");
});
})
});
複製代碼
|-- 文件狀態--異步---------------------------------------------
fs.stat(path + "/應龍.txt", function (err, stats) {
if (err) {
return console.error(err);
}
console.log(stats);
//Stats {
// dev: 3540543445,
// mode: 33206,
// nlink: 1,
// uid: 0,
// gid: 0,
// rdev: 0,
// blksize: undefined,
// ino: 1688849860264802,
// size: 123,
// blocks: undefined,
// atimeMs: 1551622765220.3064,
// mtimeMs: 1551624397905.7507,
// ctimeMs: 1551624397905.7507,
// birthtimeMs: 1551622765220.3064,
// atime: 2019-03-03T14:19:25.220Z,
// mtime: 2019-03-03T14:46:37.906Z,
// ctime: 2019-03-03T14:46:37.906Z,
// birthtime: 2019-03-03T14:19:25.220Z }
});
|-- 文件狀態--同步---------------------------------------------
let stat = fs.statSync(path + "/應龍.txt");
console.log(stat);
|-- 遍歷language文件夾---------------------------------------------
fileList("G:/Out/language",file=>{
console.log(file);
});
/**
* 文件遍歷方法
* @param filePath 須要遍歷的文件路徑
*/
function fileList(filePath,cbk) {
fs.readdir(filePath, (err, files) => {//讀取當前文件夾
if (err) throw err;
files.forEach(filename => {//遍歷文件列表
let file = path.join(filePath, filename);//文件路徑拼合
fs.stat(file, function (eror, stats) {//獲取fs.Stats對象
if (err) throw err;
let isFile = stats.isFile();//是文件
let isDir = stats.isDirectory();//是文件夾
if (isFile) {
cbk(file);
}
if (isDir) {
fileList(file,cbk);//遞歸,若是是文件夾,就繼續遍歷該文件夾下面的文件
}
})
});
}
)
}
|-- 重命名-----------------------------------------------------------
fs.rename('G:/Out/language/javascript/應龍.txt', 'G:/Out/language/javascript/應龍-temp.txt', (err) => {
if (err) throw err;
console.log('重命名完成');
});
|--刪除文件-----------------------------------------------
fs.unlink('G:/Out/language/javascript/應龍-temp.txt', (err) => {
if (err) throw err;
console.log('刪除完成');
});
複製代碼
函數的options 參數的 flag 字段是控制讀寫權限的,下面的當作常識,瞭解一下
方法不少,就不一一說了,比較生疏的,須要的時候仍是看看API,仍是頗有必要的npm
'a' - 打開文件用於追加。若是文件不存在,則建立該文件。
'ax' - 與 'a' 類似,但若是路徑存在則失敗。
'a+' - 打開文件用於讀取和追加。若是文件不存在,則建立該文件。
'ax+' - 與 'a+' 類似,但若是路徑存在則失敗。
'as' - 以同步模式打開文件用於追加。若是文件不存在,則建立該文件。
'as+' - 以同步模式打開文件用於讀取和追加。若是文件不存在,則建立該文件。
'r' - 打開文件用於讀取。若是文件不存在,則會發生異常。
'r+' - 打開文件用於讀取和寫入。若是文件不存在,則會發生異常。
'rs' - 以同步的方式讀取文件。
'rs+' - 以同步模式打開文件用於讀取和寫入。指示操做系統繞開本地文件系統緩存。
'w' - 打開文件用於寫入。若是文件不存在則建立文件,若是文件存在則截斷文件。
'wx' - 與 'w' 類似,但若是路徑存在則失敗。
'w+' - 打開文件用於讀取和寫入。若是文件不存在則建立文件,若是文件存在則截斷文件。
'wx+' - 與 'w+' 類似,但若是路徑存在則失敗。
複製代碼
|-- 建立文件夾--------------------------------------
#include <direct.h>
/**
* 建立多級目錄
* @param pDirPath 文件夾路徑
* @return
*/
int mkDirs(char *pDirPath) {
int i = 0;
int iRet;
int iLen;
char *pszDir;
if (nullptr == pDirPath) {
return 0;
}
pszDir = strdup(pDirPath);
iLen = static_cast<int>(strlen(pszDir));
// 建立中間目錄
for (i = 0; i < iLen; i++) {
if (pszDir[i] == '\\' || pszDir[i] == '/') {
pszDir[i] = '\0';
iRet = _access(pszDir, 0);//若是不存在,建立
if (iRet != 0) {
iRet = _mkdir(pszDir);
if (iRet != 0) {
return -1;
}
}
pszDir[i] = '/';
}
}
iRet = _mkdir(pszDir);
free(pszDir);
return iRet;
}
|-- 建立文件--------------------------------------
#include <fstream>
ofstream file("G:/Out/language/c++/dragon.txt");
複製代碼
char *content = "應龍----張風捷特烈\n 一遊小池兩歲月,洗卻凡世幾閒塵。\n 時逢雷霆風會雨,應乘扶搖化入雲。";
ofstream file("G:/Out/language/c++/dragon.txt");
if (file.is_open()) {
file << content;
file.close();
}
複製代碼
目前本人關於C++的知識有限,關於字符集相關的可見:此篇:
暫略編程
ifstream file("G:/Out/language/c++/dragon.txt");
char buffer[1024];
while (!file.eof()) {
file.getline(buffer, 100);
cout << buffer << endl;
}
複製代碼
遍歷文件夾部分參考文章
|-- 遍歷language文件夾---------------------------------------------
/**
* 遍歷文件夾
* @param dir
*/
void scan(const char *dir) {
intptr_t handle;
_finddata_t findData;
handle = _findfirst(dir, &findData); // 查找目錄中的第一個文件
if (handle == -1) {
cout << "Failed to find first file!\n";
return;
}
do {
if (findData.attrib & _A_SUBDIR
&& !(strcmp(findData.name, ".") == 0
|| strcmp(findData.name, "..") == 0
)) { // 是不是子目錄而且不爲"."或".."
cout << findData.name << "\t<dir>-----------------------\n";
string subdir(dir);
subdir.insert(subdir.find("*"), string(findData.name) + "\\");
cout << subdir << endl;
scan(subdir.c_str());//遞歸遍歷子文件夾
} else {
for (int i = 0; i < 4; ++i)
cout << "-";
cout << findData.name << "\t" << findData.size << endl;
}
} while (_findnext(handle, &findData) == 0);// 查找目錄中的下一個文件
_findclose(handle); // 關閉搜索句柄
}
|-- 使用
string inPath = "G:/Out/language/*";//遍歷文件夾下的全部文件
scan(inPath.c_str());
|-- 重命名-----------------------------------------------------------
string path = "G:/Out/language/c++/dragon.txt";
string dest = "G:/Out/language/c++/dragon-temp.txt";
rename(path.c_str(), dest.c_str());
|--刪除文件-----------------------------------------------
if (!_access(dest.c_str(), 0)) {
SetFileAttributes(dest.c_str(), 0);////去掉文件只讀屬性
if (DeleteFile(dest.c_str())) {
cout << dest.c_str() << " 已成功刪除." << endl;
} else {
cout << dest.c_str() << " 沒法刪除:" << endl;
}
} else {
cout << dest.c_str() << " 不存在,沒法刪除." << endl;
}
複製代碼
暫略
|-- 建立文件--------------------------------------
#建立文件 支持多級目錄下文件
def create(name):
parent = os.path.dirname(name)
if not os.path.exists(parent):
os.makedirs(parent) # 建立父文件夾
if not os.path.exists(name): # 若是文件不存在
f = open(name, 'w')
f.close()
print(name + " created.")
else:
print(name + " already existed.")
return
|-- 使用
filePath = "G:/Out/language/python/6/7/4/5/6/應龍.txt"
create(filePath)
複製代碼
content = """應龍----張風捷特烈 一遊小池兩歲月,洗卻凡世幾閒塵。 時逢雷霆風會雨,應乘扶搖化入雲。"""
f = open(filePath, "w", encoding="utf-8") # 只讀方式打開:w。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
f.write(content)
# f.flush() # 需調用,刷新緩衝區 或關閉
f.close()
複製代碼
filePathGBK = "G:/Out/language/python/6/7/4/5/6/應龍-GBK.txt"
content = """應龍----張風捷特烈 一遊小池兩歲月,洗卻凡世幾閒塵。 時逢雷霆風會雨,應乘扶搖化入雲。"""
f = open(filePathGBK, "w", encoding="gbk")
f.write(content)
# f.flush() # 需調用,刷新緩衝區 或關閉
f.close()
複製代碼
|--- 一段一段讀
f = open(filePath, encoding="utf-8") # 默認只讀方式打開:r
print(f.readline()) # 應龍----張風捷特烈
print(f.readline(5)) # 一遊小池兩
print(f.readline(5)) # 歲月,洗卻
print(f.read(4)) # 凡世幾閒
|--- 返回全部行的列表
f = open(filePath, encoding="utf-8") # 默認只讀方式打開:r
readlines = f.readlines() #<class 'list'>
print(readlines[0]) # 應龍----張風捷特烈
print(readlines[1]) # 一遊小池兩歲月,洗卻凡世幾閒塵。
print(readlines[2]) # 時逢雷霆風會雨,應乘扶搖化入雲。
|--- 迭代遍歷
f = open(filePath, encoding="utf-8")
for line in iter(f): # 迭代遍歷
print(line)
複製代碼
|-- 文件信息---------------------------------------------
f1 = open(filePath)
print(f1.fileno()) # 4 文件描述符
print(f1.mode) # r 文件打開模式
print(f1.closed) # False 文件是否關閉
print(f1.encoding) # cp936 文件編碼
print(f1.name) # G:/Out/language/python/6/7/4/5/6/應龍.txt 文件名稱
f1.close()
print(os.path.exists(filePath)) # True 是否存在
print(os.path.isdir(filePath)) # False 是不是文件夾
print(os.path.isfile(filePath)) # True 是不是文件
print(os.path.getsize(filePath)) # 125 文件大小
print(os.path.basename(filePath)) # 應龍.txt
print(os.path.dirname(filePath)) # G:/Out/language/python/6/7/4/5/6
print(os.stat(filePath))
#os.stat_result(
# st_mode=33206,
# st_ino=2533274790397459,
# st_dev=3540543445,
# st_nlink=1,
# st_uid=0,
# st_gid=0,
# st_size=133,
# st_atime=1551668005,
# st_mtime=1551668005,
# st_ctime=1551667969)
|-- 文件狀態--同步---------------------------------------------
let stat = fs.statSync(path + "/應龍.txt");
console.log(stat);
|-- 遍歷language文件夾---------------------------------------------
# 掃描文件加下全部文件
def scan(dir):
if os.path.exists(dir):
lists = os.listdir(dir)
for i in range(0,len(lists)):
sonPath = os.path.join(dir, lists[i])
print(sonPath)
if os.path.isdir(sonPath):
scan(sonPath)
|--使用
scan("G:/Out/language")
|-- 重命名-----------------------------------------------------------
filePath = "G:/Out/language/python/6/7/4/5/6/應龍.txt"
destPath = "G:/Out/language/python/6/7/4/5/6/應龍-temp.txt"
os.rename(filePath,destPath)
|--刪除文件-----------------------------------------------
os.remove(destPath)
複製代碼
# 文件打開方式
# r: 只讀 --文件的指針將會放在文件的開頭。這是默認模式。
# rb:二進制只讀。 --文件指針將會放在文件的開頭。這是默認模式。
# r+:讀寫。 --文件指針將會放在文件的開頭。
# rb+:二進制讀寫。 --文件指針將會放在文件的開頭。
# w: 只寫 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# wb:二進制只讀。 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# w+:讀寫。 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# wb+:二進制讀寫。 --若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件
# a: 追加。 --若是該文件已存在,文件指針將會放在文件的結尾。新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。
# ab:二進制追加。
# a+:追加讀寫。
# ab+:二進制追加讀寫。
print(os.access(filePath, os.F_OK)) # True 是否存在
print(os.access(filePath, os.R_OK)) # True 讀權限
print(os.access(filePath, os.W_OK)) # True 寫權限
print(os.access(filePath, os.X_OK)) # True 執行權限
複製代碼
|-- 異步建立文件 --------------------------------------
File(filePath).create(recursive: true).then((file) {
print("建立完成");
});
|-- 異步建立文件 --------------------------------------
void create(String filePath) async {
var file = File(filePath);
if (await file.exists()) {
return;
}
await file.create(recursive: true);
print("建立完成");
}
|-- 同步建立
File(filePath).createSync(recursive: true);
|-- 使用
filePath = "G:/Out/language/python/6/7/4/5/6/應龍.txt"
複製代碼
就演示一下異步的,同步的要簡單些,直接用就好了
const content = "應龍----張風捷特烈\n" + "一遊小池兩歲月,洗卻凡世幾閒塵。\n" + "時逢雷霆風會雨,應乘扶搖化入雲。";
File(filePath).writeAsString(content).then((file) {
print("寫入成功!");
});
複製代碼
瞟了一下源碼,貌似木有gbk
//指定編碼寫入
String content = "應龍----張風捷特烈\n" +
"一遊小池兩歲月,洗卻凡世幾閒塵。\n" +
"時逢雷霆風會雨,應乘扶搖化入雲。";
val pathISO8859 = "G:/Out/language/kotlin/應龍-ISO8859.txt"
File(pathISO8859)
.writeAsString("Hello Dart", encoding: Encoding.getByName("iso_8859-1:1987"))
.then((file) {
print("寫入成功!");
});
複製代碼
File(pathGBK)
.readAsString(encoding: Encoding.getByName("iso_8859-1:1987"))
.then((str) {
print(str);
});
複製代碼
|-- 信息
file.exists();//是否存在
file.length(); //文件大小(字節)
file.lastModified(); //最後修改時間
file.parent.path; //獲取父文件夾的路徑
|-- 遍歷language文件夾---------------------------------------------
var dir = Directory(r"G:/Out/language");//遞歸列出全部文件
var list = dir.list(recursive: true);
list.forEach((fs){
print(fs.path);
});
|-- 重命名-----------------------------------------------------------
var srcPath = r"G:/Out/language/dart/6/7/4/5/6/應龍.txt";
var destPath = r"G:/Out/language/dart/6/7/4/5/6/應龍-temp.txt";
File(srcPath).rename(destPath);
|--刪除文件-----------------------------------------------
File(destPath).delete();
複製代碼
關於各語言認識深淺不一,若有錯誤,歡迎批評指正。
項目源碼 | 日期 | 附錄 |
---|---|---|
V0.1--無 | 2018-3-4 |
發佈名:
編程語言對比手冊-縱向版[-文件-]
捷文連接:https://juejin.im/post/5c7a9595f265da2db66df32c
筆名 | 微信 | |
---|---|---|
張風捷特烈 | 1981462002 | zdl1994328 |
個人github:https://github.com/toly1994328
個人簡書:https://www.jianshu.com/u/e4e52c116681
個人簡書:https://www.jianshu.com/u/e4e52c116681
我的網站:http://www.toly1994.com
1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大編程愛好者共同交流
3----我的能力有限,若有不正之處歡迎你們批評指證,一定虛心改正
4----看到這裏,我在此感謝你的喜歡與支持