如何在Android中获取文件扩展名?

Bat*_*ati 25 file-extension android

我是新手.我有一个EditText和一个浏览按钮来探索文件夹和仅选择文件.在"浏览"按钮中,单击文件时,它会将该文件所在的文件夹路径存储在一个字符串中,而将其他字符串中没有扩展名的文件名存储在EditText中,我将用于存储这两个字符串中的任何一个.

我想用精确的文件扩展名(无论是一个还是两个点)制作文件名,但我也不知道如何获得文件扩展名.

所有答案将不胜感激. FileChooser.java

    package com.threefriends.filecrypto;

/**
 * Created by hp on 01-06-2016.
 */

import java.io.File;
import java.sql.Date;
import java.util.ArrayList; 
import java.util.Collections;
import java.util.List;
import java.text.DateFormat;
import android.os.Bundle;
import android.app.ListActivity;
import android.content.Intent; 
import android.view.View;
import android.widget.ListView; 

public class FileChooser extends ListActivity {

    private File currentDir;
    private FileArrayAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        currentDir=new File("/sdcard/");
        fill(currentDir); 
    }
    private void fill(File f)
    {
        File[]dirs=f.listFiles();
        this.setTitle("Current Dir: "+f.getName());
        List<Item>dir=new ArrayList<Item>();
        List<Item>fls=new ArrayList<Item>();
        try{
             for(File ff: dirs)
             { 
                Date lastModDate=new Date(ff.lastModified());
                DateFormat formater=DateFormat.getDateTimeInstance();
                String date_modify=formater.format(lastModDate);
                if(ff.isDirectory()){


                    File[] fbuf=ff.listFiles();
                    int buf=0;
                    if(fbuf != null){ 
                        buf=fbuf.length;
                    } 
                    else
                        buf=0;
                    String num_item=String.valueOf(buf);
                    if(buf == 0)
                        num_item=num_item+" item";
                    else
                        num_item = num_item+" items";

                    //String formated = lastModDate.toString();
                    dir.add(new Item(ff.getName(), num_item, date_modify, ff.getAbsolutePath(), "directory_icon"));
                }
                else
                {
                    fls.add(new Item(ff.getName(), ff.length()+" Byte", date_modify, ff.getAbsolutePath(), "file_icon"));
                }
             }
        }catch(Exception e)
        {

        }
        Collections.sort(dir);
        Collections.sort(fls);
        dir.addAll(fls);
        if(!f.getName().equalsIgnoreCase("sdcard"))
            dir.add(0, new Item("..", "Parent Directory", "", f.getParent(), "directory_up"));
        adapter=new FileArrayAdapter(FileChooser.this, R.layout.file_view, dir);
        this.setListAdapter(adapter);
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id){
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        Item o = adapter.getItem(position);
        if(o.getImage().equalsIgnoreCase("directory_icon") || o.getImage().equalsIgnoreCase("directory_up")){
                currentDir=new File(o.getPath());
                fill(currentDir);
        }
        else
        {
            onFileClick(o);
        }
    }
    private void onFileClick(Item o)
    {
        //Toast.makeText(this, "Folder Clicked: "+ currentDir, Toast.LENGTH_SHORT).show();
        Intent intent = new Intent();
        intent.putExtra("GetPath", currentDir.toString());
        intent.putExtra("GetFileName", o.getName());
        setResult(RESULT_OK, intent);
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

部分MainActivity.java

//Defined for file edittext.
    EditText editText2;
 private static String TAG = MainFragment.class.getSimpleName(); //For File Exploring.
    private static final int REQUEST_PATH = 1;
    String curFileName;
    String filePath;
    EditText edittext;
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        edittext = (EditText) view.findViewById(R.id.editText);  //Done for File Exploring, EditText, Browse Button.
        Button b1 = (Button) view.findViewById(R.id.skipButton);
        b1.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent1 = new Intent(v.getContext(), FileChooser.class);
                startActivityForResult(intent1, REQUEST_PATH);
            }
        }
        );
}
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // See which child activity is calling us back.
        if (requestCode == REQUEST_PATH)
        {
            if (resultCode == Activity.RESULT_OK)
            {
                curFileName = data.getStringExtra("GetFileName");
                filePath=data.getStringExtra("GetPath");
                edittext.setText(filePath);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ami*_*aha 57

很多方法.这是2个样本 -

String someFilepath = "image.fromyesterday.test.jpg"; 
String extension = someFilepath.substring(someFilepath.lastIndexOf("."));
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,它应该是这样的

String extension = ff.getAbsolutePath().substring(ff.getAbsolutePath().lastIndexOf("."));
Run Code Online (Sandbox Code Playgroud)

如果您不想自己动手 -

使用FilenameUtils.getExtensionApache的百科全书IO -

String extension = FilenameUtils.getExtension("/path/to/file/mytext.txt");
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下 -

String extension = FilenameUtils.getExtension(ff.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

  • FilenameUtils在ANdroid中未定义 (3认同)
  • @HiteshSahu,它是答案中提到的Apache Commins IO的一部分. (3认同)
  • 应该返回“ txt”。@DakshAgrawal (3认同)

Ach*_*aul 15

您可以使用MIME类型映射执行一行代码.

首先抓取文件:

Uri file = Uri.fromFile(new File(filePath));
Run Code Online (Sandbox Code Playgroud)

然后

String fileExt = MimeTypeMap.getFileExtensionFromUrl(file.toString());
Run Code Online (Sandbox Code Playgroud)

  • 如果“.”之前有空格,则什么也得不到。以文件名 (2认同)
  • @AnandSavjani 不适用于“/storage/emulated/0/Download/download (1).jpeg”“/storage/emulated/0/Download/download (1) .jpeg” (2认同)
  • 不要使用这个。如果文件名中包含特殊字符,则此操作不起作用。 (2认同)

小智 9

您可以将代码放在您的活动中,如下所示:

    private String getfileExtension(Uri uri)
        {
            String extension;
            ContentResolver contentResolver = getContentResolver();
            MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
            extension= mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri)); 
            return extension;
        }
Run Code Online (Sandbox Code Playgroud)

“uri”是来自“浏览按钮”选择文件的结果的文件uri