以增量编号存储文件

时间:2011-09-15 16:55:16

标签: java android

我想知道如何以增量格式存储任何类型的图像或文本或文件的可能性,例如,

图像1, 图像2, 图像3, 图像4。

这样,即使我将它们存储在不同的时间,我也能够获得当时最大的数字并添加一个。

6 个答案:

答案 0 :(得分:2)

如果文件名有限,我喜欢Dredel博士的回答。如果没有,则SharedPreference需要为每个唯一名称存储索引。如果那没关系,那就太好了=)。如果不是这样,您可以不断增加文件名,直到该文件不存在。例如:

File newFile = new File(myFileName);
while (newFile.exists()) {
    myFileName = increment(myFileName);
    newFile  = new File(myFileName);
}

样本增量方法是:

public String increment(final String pString) {
    int index = -1;
    for (int i = pString.length() - 1; i >= 0; i--) {
        if (!isNumeric(pString.substring(i))) {
            index = i + 1;
            break;
        }
    }

    String incrementedId;

    // If whole string is numeric, must be integer or double:
    if (index < 0) {
        incrementedId = incrementNumber(pString);
    }
    // If string has no index, assume this is the second occurrence:
    else if (index == pString.length()) {
        incrementedId = pString + "2";
    }
    // Otherwise, increment end index:
    else {
        incrementedId =
                pString.substring(0, index)
                        + incrementNumber(pString.substring(index));
    }

    return incrementedId;
}

private String incrementNumber(final String pString) {
    String num;
    try {
        int id = Integer.parseInt(pString);
        num = String.valueOf(id + 1);
    }
    catch (Exception e) {
        double id = Double.parseDouble(pString);
        num = String.valueOf(id + 1);
    }
    return num;
}

您可以根据需要实现isNumeric。

答案 1 :(得分:1)

如果它们存储在SD卡中,您可以先使用list()类的File方法获取文件列表。并使用Arrays#sort()方法知道哪一个是最新的。

答案 2 :(得分:0)

我认为最好的方法是将您的最后一个号码存储在SharedPreference中,并在每次需要序列中的下一个号码时将其转到它。

或者(我不建议这样做)你可以循环一段时间(新文件(“图像”+ i ++)。exists())...但你可以看到它是多么丑陋。

答案 3 :(得分:0)

如果您读入所有文件名并按字母顺序排序,则最高数字应该位于顶部(或底部,具体取决于排序)。然后你可以剥离“图像”和“.jpg”,转换为int,然后添加1。

查看文件上的日期是另一种选择,但这可能会引入错误 - 即,如果有夏令时更改,或者设备上的时间/日期更新。

另一种选择是在首选项或其他计数器中保持最高数字,假设您知道它始终可用(但如果要从SD卡复制文件,或者等等,如果要重新启动1) ,那么你只需要查看文件名),如果卸载并重新安装应用程序,你就会遇到问题。

答案 4 :(得分:0)

我总是通过为“file1”创建一个对象,测试它是否存在,如果是这样,在循环中尝试“file2”等。但是获取列表并对其进行排序的想法可能更有效。 (当我这样做的时候,它总是处于一个我认为很少有重复的环境中,所以我通常不必尝试超过2或3.如果你真的希望有数百个,试验和错误可能是相当的低效的。)

答案 5 :(得分:0)

如何使用这种代码(并使用FileNames来匹配您的编号可以从任何地方开始,您可以删除旧文件):

  import java.text.MessageFormat;
import java.text.ParseException;

/**
 * This class helps creating Strings with incremental number value in it
 * (such as incremental fileNames).
 * <P/>
 * Instances must be created with a simplified pattern where the character
 * '#' is the place holder for a number (integer).
 * <P/>
 * Then other Strings containing the same pattern can be submitted
 * with method <TT>submit</TT>  and in the end the <TT>getMaxString()</TT> method will yield
 * the next numbered String.
 * <P/>
 * So for example :
 * <PRE>
 *      String pattern = "aName#.something";
 *  NumberedStringGenerator generator = new NumberedStringGenerator(pattern) ;
 *  System.out.println(" first :" + generator.getMaxString());
 *  // will yield : "aName0.something"
 *  generator.submit("aName0.something") ;
 *  generator.submit("aName11.something") ;
 *  generator.submit("aName1.something") ;
 *  System.out.println(" max :" + generator.getMaxString());
 *  // will yield : "aName12.something"
 * </PRE>
 *
 */

public class NumberedStringGenerator {
    private MessageFormat messageFormat ;
    private int max =-1;
    private int min = -1 ;

    /**
     * creates a generator that will compare Strings and will yield the
     * next incremented String.
     * @param simplePattern a String with a '#' character as number placeholder
     */
    public NumberedStringGenerator(String simplePattern) {
        String realPattern = simplePattern.replace("#", "{0,number,integer}");
        messageFormat = new MessageFormat(realPattern) ;
    }

    /**
     *
     * @param candidate any String that possibly matches the initial pattern
     * @return true if matched false otherwise
     */
    public boolean submit(String candidate) {
        try {
            Object[] parsed = messageFormat.parse(candidate) ;
            int val = ((Long) parsed[0]).intValue();
            if(val > max) {
                max =val ;
            }
            if(min == -1) { min = val ;}
            else if (val < min ) {
                min = val ;
            }
            return true ;
        } catch (ParseException e) {
           return false ;
        }
    }

    /**
     *
     * @return a new String that has the highest number immediately after the highest matched String
     */
    public String getMaxString() {
        return messageFormat.format(new Integer[] {max+1});
    }

    /**
     *
     * @return the smallest numbered String being submitted or null if none matched
     */
    public String getMinString() {
        if(min == -1) return null;
        return messageFormat.format(new Integer[] {min});
    }
}