文件有很多种类型,有音乐文件、视频文件、图片文件、文本文件等,不同类型的文件在android中的打开方式是不一样的,也就是需要不同的软件区打开,那么,我们通过String fileName = file.getName;如何判断我们所要打开的文件时什么类型的文件进而采取不同的措施呢?
不同的文件后缀名并不是唯一的,比如mp3、wmv文件都是音频文件,mp4、avi、rmvb文件都是视频文件,其实要判断文件是什么类型的文件一个函数就可以了,fileName.endsWith(xxx);将后缀名传进去就可以判断了,这样的话,我们可以在代码中写多个String[ ],然后遍历,一个个匹配,当然了,我们可以将这些文件格式放在资源文件中,这样代码就显得简洁多了。
★资源文件的位置
★xml文件的代码
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 图片的后缀名字 --> <array name="fileEndingImage"> <item>.png</item> <item>.gif</item> <item>.jpg</item> <item>.jpeg</item> <item>.bmp</item> </array> <!-- 音乐的后缀名字 --> <array name="fileEndingAudio"> <item>.mp3</item> <item>.wav</item> <item>.ogg</item> <item>.midi</item> <item>.wma</item> </array> <!-- 压缩包的后缀名字 --> <array name="fileEndingPackage"> <item>.jar</item> <item>.zip</item> <item>.rar</item> <item>.gz</item> </array> <!-- 网页文件的后缀名字 --> <array name="fileEndingWebText"> <item>.htm</item> <item>.html</item> <item>.php</item> </array> <!-- 视频文件的后缀名字 --> <array name="fileEndingVideo"> <item>.mp4</item> <item>.rmvb</item> <item>.rm</item> <item>.mpg</item> <item>.avi</item> <item>.mpeg</item> </array> </resources>
★下面是匹配代码
◇判断类型方法
/** * 通过文件名判断是什么类型的文件 * fileEndings是某一类型的文件后缀名集合 */ public boolean checkFileType(String fileName, String[] extendNames){ //遍历后缀名称集合 for(String end: extendNames){ //判断后缀名称是否存在数组中 if(fileName.endsWith(end)) return true; } //如果后缀名称不存在数组中,返回false return false; }
◇调用代码
//取得文件名 String fileName = file.getName(); //判断是一个文件夹还是一个文件 if(file.isDirectory()){ //如果是一个文件夹,则设置图片为文件夹图片 currentIcon = getResources().getDrawable(R.drawable.folder); } else { //判断文件是否为图片文件 if(checkFileType(fileName, getResources().getStringArray(R.array.fileEndingImage))){ //设置音乐的图标 currentIcon = getResources().getDrawable(R.drawable.image); } //判断文件是否为网页文件 else if(checkFileType(fileName, getResources().getStringArray(R.array.fileEndingWebText))){ //设置音乐的图标 currentIcon = getResources().getDrawable(R.drawable.webtext); } //判断文件是否为压缩包文件 else if(checkFileType(fileName, getResources().getStringArray(R.array.fileEndingPackage))){ //设置音乐的图标 currentIcon = getResources().getDrawable(R.drawable.packed); } //判断文件是否为音乐文件 else if(checkFileType(fileName, getResources().getStringArray(R.array.fileEndingAudio))){ //设置音乐的图标 currentIcon = getResources().getDrawable(R.drawable.audio); } //判断文件是否为视频文件 else if(checkFileType(fileName, getResources().getStringArray(R.array.fileEndingVideo))){ //设置音乐的图标 currentIcon = getResources().getDrawable(R.drawable.video); } //如果为其它文件 else { //默认图标 currentIcon = getResources().getDrawable(R.drawable.text); } }
QVector和vector的比较:
Qvector默认使用隐式共享,可以用setSharable改变其隐式共享。使用non-const操作和函数将引起深拷贝。at()比operator[](),快,因为它不进行深拷贝.Qvector取值都会检查越界问题。
看看简单的例子:
QVector<int> vecA;
QVector<int> vecB;
vecA.push_back(1);
vecA.push_back(10);
vecB= vecA;
cout<<"&vecA.at(0) : "<<&vecA.at(0)<<endl;
cout<<"&vecB.at(0) : "<<&vecB.at(0)<<endl;
QVector<int> vecC;
vecA.setSharable(false);
vecC = vecA;
cout<<"&vecA.at(0): "<<&vecA.at(0)<<endl;
cout<<"&vecC.at(0): "<<&vecC.at(0)<<endl;
对比发现,禁用了隐式共享之后,元素的地址就不再一样了。
Vector
Vector没有隐式共享,operator [ ]不检查越界,at()才检查越界。
构造函数:
Vector的构造函数C++98版:
explicit vector (const allocator_type& alloc = allocator_type());
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
vector (const vector& x);
C++11版:
explicit vector (const allocator_type& alloc = allocator_type());
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);
vector (initializer_list<value_type> il,
const allocator_type& alloc = allocator_type());
Qvector的构造函数:
QVector::QVector ()
QVector::QVector ( int size )
QVector::QVector ( int size, const T & value )
QVector::QVector ( const QVector<T> & other )
QVector::QVector ( std::initializer_list<T> args )
通过比较我们发现,vector可以指定内存分配器,而且Qvector少了类似template <class InputIterator>
vector (InputIterator first, InputIterator last,构造函数。所以以下代码是肯定不行的:
QVector<int> second (4,100);
QVector<int> third (second.begin(),second.end());
int myints[] = {16,2,77,29};
QVector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
迭代器:
Vector迭代器begin C++98版本:
iterator begin();
const_iterator begin() const;
C++11版:
iterator begin() noexcept;
const_iterator begin() const noexcept;
noexcept指定这两个函数是不能抛出异常的。
Vector迭代器end C++98版本:
iterator end();
const_iterator end() const;
C++11版:
iterator end() noexcept;
const_iterator end() const noexcept;
Vector迭代器rbegin C++98版本:
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
C++11版:
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
noexcept指定这两个函数是不能抛出异常的。
Vector迭代器rend C++98版本:
reverse_iterator rend();
const_reverse_iterator rend() const
C++11版:
reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;
常量迭代器只要C++11版本的:
const_iterator cbegin() const noexcept;
const_iterator cend() const noexcept;
const_reverse_iterator crbegin() const noexcept;
const_reverse_iterator crend() const noexcept;
Qvector的迭代器:
iterator
begin ()
const_iterator
begin () const
const_iterator
constBegin () const
const_iterator
constEnd () const
iterator
end ()
const_iterator
end () const
Qvector没有反向迭代器。
Vector有而Qvector没有的函数或功能:
size_type max_size() const;
返回vector可以存在最大元素个数。
void shrink_to_fit(); 这个函数是C++11独有的
使得vector减少其容量为适合大小的容量。
赋值函数:
C++98:
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);
C++11:
template <class InputIterator>
void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);
void assign (initializer_list<value_type> il);
下面两个函数其实跟insert差不多
template <class... Args>
iterator emplace (const_iterator position, Args&&... args);
template <class... Args>
void emplace_back (Args&&... args);
Qvector有而vector没有的函数:
int QVector::count ( const T & value ) const
返回Qvector中值为value的个数。
bool QVector::contains ( const T & value ) const
判断Qvector中是否包含元素value,要求Qvector中的类型必须支持 比较操作==
bool QVector::endsWith ( const T & value ) const
判断Qvector中是否以value值结尾。
int QVector::indexOf ( const T & value, int from = 0 ) const
int QVector::lastIndexOf ( const T & value, int from = -1 ) const
QVector<T> QVector::mid ( int pos, int length = -1 ) const
void QVector::squeeze ()
该函数释放不用的内存,类似于vector的void shrink_to_fit()
bool QVector::startsWith ( const T & value ) const
QList<T> QVector::toList () const
std::vector<T> QVector::toStdVector () const
QVector<T> QVector::fromList ( const QList<T> & list ) [static]
QVector<T> QVector::fromStdVector ( const std::vector<T> & vector ) [static]
bool QVector::operator!= ( const QVector<T> & other ) const
QVector<T> QVector::operator+ ( const QVector<T> & other ) const
QVector<T> & QVector::operator+= ( const QVector<T> & other )
QVector<T> & QVector::operator+= ( const T & value )
QVector<T> & QVector::operator<< ( const T & value )
QVector<T> & QVector::operator<< ( const QVector<T> & other )
QVector<T> & QVector::operator= ( const QVector<T> & other )
bool QVector::operator== ( const QVector<T> & other ) const
如图所示,很多同学在使用keil时都可能会碰到上图中的“File has been changed outside the editor, reload?”提示,很令人烦心。当遇到此提示,首先不要郁闷,请先看清楚文件的路径及名称。比如:这个提示的文件名是UCOSII+STM32+12864.axf,然后再看下图:
大家看见上图所示的文件名UCOSII+STM32+12864.axf了吗?直接在此图中关掉它就好了,此方法非常有效,百试不爽!注意:那个UCOSII+STM32+12864.htm文件也会导致如题的提示,也需要关掉。问题解决。希望对大家有用!