iOS 實現錄音並儲存在指定檔案目錄下面
原理:
進入介面,先遍歷檔案目錄,將所有的檔名,顯示在uitableview中。在錄音時需要設定session以及錄音取樣率。
1.ios錄音主要使用ios自帶的類,是工程中需要手動新增這倆個framework
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
2.在錄音前,先監測檔案存放目錄是否存在,不存在就建立目錄
NSDate * date=[NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"YYYY-MM-dd" ];
NSString *datefloder= [dateformatter stringFromDate:date];
dateaudioPath=[NSString stringWithFormat:@"%@/",datefloder];
fileMgr = [NSFileManager defaultManager];
//指向檔案目錄
NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
audioRecoderSavePath=[NSString stringWithFormat:@"%@/%@%@", documentsDirectory,audioPath,dateaudioPath];
if (![fileMgr fileExistsAtPath:audioRecoderSavePath]) {
[fileMgr createDirectoryAtPath:audioRecoderSavePath withIntermediateDirectories:YES attributes:nil error:nil];
}
3.點選錄音,開始錄音
if(!isRecording)
{
isRecording = YES ;
stateLabel.text[email protected]"錄音中";
[startRecoderBtn setTitle:@"停止錄音" forState:(UIControlStateNormal)];
// [email protected]"停止錄音";
NSDate * date=[NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"YYYYMMddHHYYSS"];
recoderName= [NSString stringWithFormat:@"%@%@",[dateformatter stringFromDate:date],@".caf"];
//tempRecoderPath=[NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"%@%@",audioPath,recoderName]];
tempRecoderPath=[NSString stringWithFormat:@"%@%@",audioRecoderSavePath,recoderName];
tempRecordedFile = [NSURL fileURLWithPath:tempRecoderPath];
recorder = [[AVAudioRecorder alloc] initWithURL:tempRecordedFile settings:[self getAudioSetting] error:nil];
recorder.delegate=self;
[recorder prepareToRecord];
[recorder record];
avplayer = nil;
}
//If the app is recording, we want to stop recording, enable the play button, and make the record button say "REC"
else
{
isRecording = NO;
stateLabel.text=[NSString stringWithFormat:@"%@%@",@"錄音完成",recoderName];
//[email protected]"開始錄音";
[startRecoderBtn setTitle:@"開始錄音" forState:(UIControlStateNormal)];
[recorder stop];
recorder = nil;
}
4.在列表展示檔案目錄中,遍歷所有的錄音檔案
-(NSMutableArray *)getFilenamelistOfType:(NSString *)type fromDirPath:(NSString *)dirPath
{
NSMutableArray *filenamelist = [[NSMutableArray alloc]init];
NSArray *tmplist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil];
for (NSString *filename in tmplist) {
NSString *fullpath = [dirPath stringByAppendingPathComponent:filename];
if ([self isFileExistAtPath:fullpath]) {
if ([[filename pathExtension] isEqualToString:type]) {
AudioObject *ob=[[AudioObject alloc]init];
ob.audioRecoderName=filename;
ob.audioRecoderPath=fullpath;
ob.audioRecoderIsChecked=NO;
[filenamelist addObject:ob];
}
}
}
return filenamelist;
}
-(BOOL)isFileExistAtPath:(NSString*)fileFullPath {
BOOL isExist = NO;
isExist = [[NSFileManager defaultManager] fileExistsAtPath:fileFullPath];
return isExist;
}
完整程式碼
標頭檔案
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
#import "Comm.h"
#import "AudioTableViewCell.h"
#import "AudioObject.h"
#import "AppDelegate.h"
@protocol AudioViewControllerDelegate <NSObject>
-(void)passAudioValueArray:(NSMutableArray *)array;
@end
@interface AudioViewController : UIViewController<AVAudioRecorderDelegate,AVAudioPlayerDelegate,UITableViewDelegate,UITableViewDataSource,AudioTableViewCellDelegate>
{
NSURL *tempRecordedFile;
AVAudioPlayer *avplayer;
AVAudioRecorder *recorder;
BOOL isRecording;
NSString * tempRecoderPath;
NSMutableArray *audioRcoderMutableArray;
NSString *audioRecoderSavePath;
NSFileManager *fileMgr;
NSString *recoderName;
NSString *dateaudioPath;
AppDelegate* audioDelegate ;
NSMutableArray *passAudioMutableArray;
}
@property (strong, nonatomic) IBOutlet UIButton *startRecoderBtn;
@property (strong, nonatomic) IBOutlet UIButton *saveRecoderBtn;
@property (strong, nonatomic) IBOutlet UIButton *backBtn;
@property (strong, nonatomic) IBOutlet UILabel *stateLabel;
@property (strong, nonatomic) IBOutlet UIButton *cancelBtn;
@property (strong, nonatomic) IBOutlet UIButton *doneBtn;
@property (strong, nonatomic) IBOutlet UITableView *recoderTableView;
@property (nonatomic, strong) id <AudioViewControllerDelegate>delegate;
@end
.m檔案
#import "AudioViewController.h"
#import "Comm.h"
@interface AudioViewController ()
@end
@implementation AudioViewController
@synthesize startRecoderBtn;
@synthesize saveRecoderBtn;
@synthesize backBtn;
@synthesize stateLabel;
@synthesize cancelBtn;
@synthesize doneBtn;
@synthesize recoderTableView;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
recoderTableView.delegate=self;
recoderTableView.dataSource=self;
isRecording=NO;
passAudioMutableArray=[[NSMutableArray alloc] init];
NSDate * date=[NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"YYYY-MM-dd"];
NSString *datefloder= [dateformatter stringFromDate:date];
dateaudioPath=[NSString stringWithFormat:@"%@/",datefloder];
fileMgr = [NSFileManager defaultManager];
//指向檔案目錄
NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
audioRecoderSavePath=[NSString stringWithFormat:@"%@/%@%@", documentsDirectory,audioPath,dateaudioPath];
if (![fileMgr fileExistsAtPath:audioRecoderSavePath]) {
[fileMgr createDirectoryAtPath:audioRecoderSavePath withIntermediateDirectories:YES attributes:nil error:nil];
}
audioDelegate = [[UIApplication sharedApplication] delegate];
audioRcoderMutableArray=[[NSMutableArray alloc]init];
audioRcoderMutableArray = [self getFilenamelistOfType:@"caf" fromDirPath:audioRecoderSavePath];
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *sessionError;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
//[session setCategory:AVAudioSessionCategoryPlayback error:nil];
if(session == nil)
NSLog(@"Error creating session: %@", [sessionError description]);
else
[session setActive:YES error:nil];
}
-(void)viewDidUnload
{
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)btnControl:(UIButton *)sender {
switch (sender.tag) {
//返回
case 0:
[self.delegate passAudioValueArray:passAudioMutableArray];
audioDelegate.audioSelectedMutableArray=audioRcoderMutableArray;
[self dismissModalViewControllerAnimated:YES];
break;
//錄音
case 1:
if(!isRecording)
{
isRecording = YES;
stateLabel.text[email protected]"錄音中";
[startRecoderBtn setTitle:@"停止錄音" forState:(UIControlStateNormal)];
// [email protected]"停止錄音";
NSDate * date=[NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"YYYYMMddHHYYSS"];
recoderName= [NSString stringWithFormat:@"%@%@",[dateformatter stringFromDate:date],@".caf"];
//tempRecoderPath=[NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"%@%@",audioPath,recoderName]];
tempRecoderPath=[NSString stringWithFormat:@"%@%@",audioRecoderSavePath,recoderName];
tempRecordedFile = [NSURL fileURLWithPath:tempRecoderPath];
recorder = [[AVAudioRecorder alloc] initWithURL:tempRecordedFile settings:[self getAudioSetting] error:nil];
recorder.delegate=self;
[recorder prepareToRecord];
[recorder record];
avplayer = nil;
}
//If the app is recording, we want to stop recording, enable the play button, and make the record button say "REC"
else
{
isRecording = NO;
stateLabel.text=[NSString stringWithFormat:@"%@%@",@"錄音完成",recoderName];
//[email protected]"開始錄音";
[startRecoderBtn setTitle:@"開始錄音" forState:(UIControlStateNormal)];
[recorder stop];
recorder = nil;
}
break;
//保存錄音
//講temp檔案下的錄音檔案移動到docment 目錄下面並且重新命名
case 2:
[self SaveAudioRecoder];
break;
//取消
case 3:
[self.delegate passAudioValueArray:passAudioMutableArray];
audioDelegate.audioSelectedMutableArray=audioRcoderMutableArray;
[self dismissModalViewControllerAnimated:YES];
break;
//確定
case 4:
[self.delegate passAudioValueArray:passAudioMutableArray];
audioDelegate.audioSelectedMutableArray=audioRcoderMutableArray;
[self dismissModalViewControllerAnimated:YES];
break;
default:
break;
}
}
#pragma mark - 私有方法
/**
* 取得錄音檔案設定
*
* @return 錄音設定
*/
-(NSMutableDictionary *)getAudioSetting{
NSMutableDictionary *dicM=[NSMutableDictionary dictionary];
//設定錄音格式
[dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
//設定錄音取樣率,8000是電話取樣率,對於一般錄音已經夠了
[dicM setObject:@(8000) forKey:AVSampleRateKey];
//設定通道,這裡採用單聲道
[dicM setObject:@(1) forKey:AVNumberOfChannelsKey];
//每個取樣點位數,分為8、16、24、32
[dicM setObject:@(8) forKey:AVLinearPCMBitDepthKey];
//是否使用浮點數取樣
[dicM setObject:@(YES) forKey:AVLinearPCMIsFloatKey];
//....其他設定等
return dicM;
}
//保存錄音
-(void)SaveAudioRecoder
{
if (recorder!=nil) {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:nil message:@"請先停止錄音" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
}];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
else
{
stateLabel.text[email protected]"開始錄音";
AudioObject *object=[[AudioObject alloc]init];
object.audioRecoderName=recoderName;
object.audioRecoderPath=tempRecoderPath;
object.audioRecoderIsChecked=NO;
[audioRcoderMutableArray addObject:object];
[recoderTableView reloadData];
}
}
//播放音訊
-(void)PlayAudioRecoder :(NSString *) filePayh
{
NSError *playerError;
NSURL * playurl=[NSURL URLWithString:filePayh];
avplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:playurl error:&playerError];
if (avplayer == nil)
{
NSLog(@"ERror creating player: %@", [playerError description]);
}
avplayer.delegate = self;
[avplayer prepareToPlay];
[avplayer play];
}
-(NSMutableArray *)getFilenamelistOfType:(NSString *)type fromDirPath:(NSString *)dirPath
{
NSMutableArray *filenamelist = [[NSMutableArray alloc]init];
NSArray *tmplist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil];
for (NSString *filename in tmplist) {
NSString *fullpath = [dirPath stringByAppendingPathComponent:filename];
if ([self isFileExistAtPath:fullpath]) {
if ([[filename pathExtension] isEqualToString:type]) {
AudioObject *ob=[[AudioObject alloc]init];
ob.audioRecoderName=filename;
ob.audioRecoderPath=fullpath;
ob.audioRecoderIsChecked=NO;
[filenamelist addObject:ob];
}
}
}
return filenamelist;
}
-(BOOL)isFileExistAtPath:(NSString*)fileFullPath {
BOOL isExist = NO;
isExist = [[NSFileManager defaultManager] fileExistsAtPath:fileFullPath];
return isExist;
}
#pragma mark - 錄音機代理方法
/**
* 錄音完成,錄音完成後播放錄音
*
* @param recorder 錄音機物件
* @param flag 是否成功
*/
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{
NSLog(@"錄音完成!");
}
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[avplayer stop];
avplayer=nil;
NSLog(@"播放完成!");
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:nil message:@"錄音播放完成" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
recorder=nil;
avplayer=nil;
}];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
#pragma tableviewdelege
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return audioRcoderMutableArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//指定cellIdentifier為自定義的cell
static NSString *CellIdentifier = @"AudioTableViewCell";
//自定義cell類
AudioTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
//通過xib的名稱載入自定義的cell
cell = [[[NSBundle mainBundle] loadNibNamed:@"AudioTableViewCell" owner:self options:nil] lastObject];
cell.delegate=self;
}
cell.checkBtn.tag=indexPath.row;
cell.playBtn.tag=indexPath.row;
AudioObject *item=[audioRcoderMutableArray objectAtIndex:indexPath.row];
cell.audioNameLabel.text=item.audioRecoderName;
if (item.audioRecoderIsChecked) {
[ cell.checkBtn setImage:[UIImage imageNamed:@"abc_btn_check_to_on_mtrl_015.png"] forState:UIControlStateNormal];
}else
{
[ cell.checkBtn setImage:[UIImage imageNamed:@"abc_btn_check_to_on_mtrl_000.png"] forState:UIControlStateNormal];
}
return cell;
}
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
AudioObject *zz=[audioRcoderMutableArray objectAtIndex:indexPath.row];
NSString * deletefile=zz.audioRecoderPath;
BOOL bRet = [fileMgr fileExistsAtPath:deletefile];
if (bRet) {
//
NSError *err;
[fileMgr removeItemAtPath:deletefile error:&err];
}
[ audioRcoderMutableArray removeObjectAtIndex:indexPath.row];
// Delete the row from the data source.
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
//修改左滑刪除按鈕的title
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"刪除";
}
int selectCount=0;
#pragma celldelegate
-(void)SelectAudioClicked:(UIButton *)button
{
NSInteger s=button.tag;
AudioObject *sm=[audioRcoderMutableArray objectAtIndex:s];
if (sm.audioRecoderIsChecked) {
sm.audioRecoderIsChecked=NO;
if (selectCount==0) {
return;
}
else
{
selectCount=selectCount-1;
[passAudioMutableArray removeObject:sm];
[ button setImage:[UIImage imageNamed:@"abc_btn_check_to_on_mtrl_000.png"] forState:UIControlStateNormal];
NSString *btntile=[NSString stringWithFormat:@"完成(%d/5)",selectCount];
[doneBtn setTitle:btntile forState:(UIControlStateNormal)];
}
}else
{
sm.audioRecoderIsChecked=YES;
if (selectCount>5) {
return;
}
else
{
selectCount=selectCount+1;
[passAudioMutableArray addObject:sm];
[ button setImage:[UIImage imageNamed:@"abc_btn_check_to_on_mtrl_015.png"] forState:UIControlStateNormal];
NSString *btntile=[NSString stringWithFormat:@"完成(%d/5)",selectCount];
[doneBtn setTitle:btntile forState:(UIControlStateNormal)];
}
}
}
-(void)PlayAudioClicked:(UIButton *)button
{
NSInteger s=button.tag;
AudioObject *j=[audioRcoderMutableArray objectAtIndex:s];
NSString *pp=j.audioRecoderPath;
[self PlayAudioRecoder:pp];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
存在問題:
1.播放錄音是聽筒聲音。
2.未將錄音轉換為通用的音訊格式。
相關推薦
iOS 實現錄音並儲存在指定檔案目錄下面
原理: 進入介面,先遍歷檔案目錄,將所有的檔名,顯示在uitableview中。在錄音時需要設定session以及錄音取樣率。 1.ios錄音主要使用ios自帶的類,是工程中需要手動新增這倆個framework #import <AVFoundati
iOS uitableview自定義相簿(實現拍照並儲存在指定目錄以相簿的形式展示圖片)
原理: 圖片的展示是通過uitableview實現。照片的展示以及選擇(uitableviewce’l’l)是通過倆個uibutton的疊加完成。通過設定每個uibutton的tag,並在viewcontroller中實現cell的delegate來實現對ui
ios在真機中將NSLog日誌存入檔案並儲存到document目錄
下面的方法都是在Appdelegate.m中 - (void)redirectNSLogToDocumentFolder{ NSString *fileName =[NSStringstringWithFormat:@"%@.log",[NSDat
[NSLog日誌]ios在真機中將NSLog日誌存入檔案並儲存到document目錄
儲存Log日誌- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //當真機連線Mac
iOS開發 在真機中將NSLog日誌存入檔案並儲存到document目錄
- (BOOL)application(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions { //制定真機除錯儲存日誌檔案 [self redirectNSLo
Qt開啟指定目錄並選中指定檔案
目錄 方法一、使用Qt自帶的方法 方法二、使用windows自帶工具 有時自動生成檔案之後,點選某個按鈕我們希望能夠自動跳轉到檔案所在目錄(開啟之後不依附於執行程式),可能還需要選中該檔案。 環境:win10 + Qt5.9.6 MinG
[原始碼和文件分享]程式設計實現錄音及儲存為WAV音訊檔案
背景 之前自己錄製視訊教程的時候,從網上找過一些破解版錄屏軟體來使用。後來,我細想了一下,其實我自己就可以下一個簡單的錄屏小軟體。於是,後來我也自己慢慢摸索著,從網上搜索資料,慢慢地開發了一個有基本的錄音錄屏功能的小程式。 其中,本文的錄音小程式是當時為了熟悉錄音流程而特意開發來練手的。當然
rsync 複製檔案並排除指定檔案
rsync命令是一個遠端資料同步工具,可通過LAN/WAN快速同步多臺主機間的檔案。rsync使用所謂的“rsync演算法”來使本地和遠端兩個主機之間的檔案達到同步,這個演算法只傳送兩個檔案的不同部分,而不是每次都整份傳送,因此速度相當快。 rsync是一個功能非常強大的工具,其命令也有很多
使用者登入使用java的IO流實現將資料儲存到data目錄下
一、效果展示 1、最初可以看到data/data目錄下該專案只有一個cache資料夾和lib檔案 第一次執行程式,使用者名稱和密碼皆為空。 當我們輸入使用者名稱和密碼後,點選登入專案目錄下出現名為info.txt的文件,開啟它可以看到原先輸入的使用者名稱和密碼。 第二次執行
mac 進入指定檔案目錄
用了兩年多的mac了,好多東西都還不會,平時也拿來做開發用,但是有種沒有windows順手的感覺。就拿使用maven這件事來說吧。用homebrew安裝了maven,但是想使用安裝的maven來管理專案的時候,卻找不到maven安裝在哪兒,好幾次都問度娘,每次都覺得麻煩,就沒弄成功過。前幾天又試
Go後臺對圖片base64解碼,並儲存至檔案伺服器。
單人開發移動端專案前後端,對專案中出現的一些問題做記錄。 前端使用vue,預設base64編碼上傳圖片,略過。 後臺使用go-gin框架,主要使用了路由和資料傳輸和繫結的功能 1. 後端宣告一個結構體用於接收前端資料和將資料儲存到資料庫(mangodb) 其中ImgList用於接收
javascript實現生成並下載txt檔案
下面的簡單函式允許您直接在瀏覽器中生成檔案,而無需接觸任何伺服器。它適用於所有HTML5就緒的瀏覽器,因為它使用了<a>的下載屬性: function download(filename, text) { var element = document.c
Python 判斷並建立多級檔案目錄
在使用Python寫入檔案檔案的過程中,需要判斷資料夾路徑是否存在,不存在需要建立多級路勁 import os #先定義一個帶路徑的檔案 filename = "/home/mydir/test
Android日誌列印類LogUtils,能夠定位到類名,方法名以及出現錯誤的行數並儲存日誌檔案
關注finddreams,一起分享,一起進步!http://blog.csdn.net/finddreams/article/details/4556
71.android 簡單的電話錄音並儲存到本地(來電和去電都支援)
//第一步 先加許可權 在AndroidManifest.xml裡: //有打電話的許可權,讀寫許可權,還有錄音許可權。 <uses-permission android:name="android.permission.CALL_PHONE" />
Unity iOS截圖並儲存到手機相簿總結
unity截圖方法 using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.UI; public class Screenshots : MonoBehaviour {
java 刪除指定檔案目錄
今天沒事 回頭看看IO流的問題呢,順便整理下刪除檔案的步驟。畢竟曾經也是讓我頭疼的問題。 本來想將刪除目錄以及子目錄都放在一個方法處理的(在一個方法中只能刪除子目錄,執行完這個方法才會執行刪除最外層目錄的程式碼),但是沒能處理的了,因為時間緊張也就沒往下想(其實這樣也挺好,簡單、易懂)。希望各位
Java編寫爬蟲,並儲存本地檔案,未涉及圖片,視訊的儲存,只是儲存文字內容
Java Jsoup jar包編寫爬蟲 這個案例內容很簡單,只是設計文字的爬取,未涉及到圖片儲存與視訊儲存。記錄下來只是方便自己的一個記錄、同時希望給向我這樣第一次接觸爬蟲的朋友一個參考!! 個人覺得分為兩步走!當然,我寫了三個檔案,內容如下: 一、開始方法 S
【Java】下載網路上的圖片並儲存到本地目錄
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; impo
使用 ACL 設定使用者訪問指定檔案/目錄的許可權 | Linux 中國
ACL 表示訪問控制列表(Access Control List,ACL),它為檔案系統提供了附